Canvas үндэс
<canvas> элемент нь JavaScript ашиглан браузерийн дотор зураг зурах, хөдөлгөөнт дүрс (animation) гаргах боломж олгодог. Тоглоом, өгөгдлийн визуализаци, зургийн редактор зэргийг canvas ашиглан бүтээдэг.
Canvas элемент
<!-- width, height attribute заавал бичнэ — CSS-ээр тохируулбал зураг гажина -->
<canvas id="миний-canvas" width="600" height="400">
Таны хөтөч canvas дэмждэггүй байна.
</canvas>
Canvas нь дотроо width × height пикселийн цагаан дэвсгэртэй хоосон зурагзурах талбар. Элементийг HTML-д тодорхойлсны дараа бүх зурах ажил JavaScript-ээр явагдана.
getContext — зурах контекст авах
const canvas = document.getElementById("миний-canvas");
// 2D зурах контекст авна — энэ нь бидний ашиглах хэрэгсэл
const ctx = canvas.getContext("2d");
getContext("2d") нь CanvasRenderingContext2D объект буцаадаг бөгөөд бүх зурах арга (method) үүнд байдаг. "webgl" параметр өгвөл 3D боломжтой боловч хамаагүй нарийн.
Тэгш өнцөгт зурах — fillRect, strokeRect
const canvas = document.getElementById("миний-canvas");
const ctx = canvas.getContext("2d");
// Дүүргэсэн тэгш өнцөгт: fillRect(x, y, өргөн, өндөр)
ctx.fillStyle = "#f87171"; // дүүргэлтийн өнгө
ctx.fillRect(50, 50, 200, 100); // x=50, y=50-с эхлэн 200×100
// Хүрээтэй тэгш өнцөгт: strokeRect(x, y, өргөн, өндөр)
ctx.strokeStyle = "#4ade80"; // хүрээний өнгө
ctx.lineWidth = 3; // хүрээний зузаан
ctx.strokeRect(300, 50, 200, 100);
// Нэг хэсгийг арилгах: clearRect(x, y, өргөн, өндөр)
ctx.clearRect(100, 75, 50, 50); // тэгш өнцөгт дотроос нүх гарна
Canvas-ийн координатын эхлэл (0, 0) нь зүүн дээд буланд байдаг. X баруун тийш, Y доош нэмэгдэнэ.
Тойрог зурах — arc
// arc(x, y, радиус, эхлэх_өнцөг, дуусах_өнцөг)
// Өнцгийг радианаар заана: 2π = бүтэн тойрог
ctx.beginPath(); // шинэ замын эхлэл
ctx.arc(200, 200, 80, 0, Math.PI * 2); // бүтэн тойрог
ctx.fillStyle = "#60a5fa";
ctx.fill();
// Хагас тойрог
ctx.beginPath();
ctx.arc(450, 200, 60, 0, Math.PI); // 0-с π хүртэл = доод хагас
ctx.strokeStyle = "#fbbf24";
ctx.lineWidth = 4;
ctx.stroke();
Текст бичих — fillText, strokeText
// Фонт тохируулна
ctx.font = "bold 32px Arial";
ctx.fillStyle = "#f1f5f9";
// fillText(текст, x, y) — y нь текстийн суурийн шугам
ctx.fillText("Сайн уу, Canvas!", 50, 100);
// Текстийн хэмжээ авах
const хэмжэ = ctx.measureText("Сайн уу, Canvas!");
console.log(хэмжэ.width); // пикселийн өргөн
// Хүрээтэй текст
ctx.strokeStyle = "#f87171";
ctx.lineWidth = 1;
ctx.strokeText("Ulaanbaatar.app", 50, 150);
Шугам зурах — moveTo, lineTo
ctx.beginPath();
ctx.moveTo(50, 300); // эхлэх цэг (үзэг өргөх)
ctx.lineTo(250, 100); // шугам зурах
ctx.lineTo(450, 300); // үргэлжлүүлэх
ctx.closePath(); // эхлэх цэг рүү буцаж хаана (гурвалжин)
ctx.strokeStyle = "#a78bfa";
ctx.lineWidth = 3;
ctx.stroke(); // шугамыг харуулна
// Дүүргэх
ctx.fillStyle = "rgba(167, 139, 250, 0.3)";
ctx.fill();
Бүтэн жишээ — энгийн зурагзурах
<!DOCTYPE html>
<html lang="mn">
<head>
<meta charset="UTF-8" />
<title>Canvas жишээ</title>
</head>
<body>
<canvas id="зурагзурах" width="500" height="400"
style="border: 1px solid #1e293b; background: #0f172a;"
></canvas>
<script>
const canvas = document.getElementById("зурагзурах");
const ctx = canvas.getContext("2d");
// Нар — шар тойрог
ctx.beginPath();
ctx.arc(250, 80, 50, 0, Math.PI * 2);
ctx.fillStyle = "#fbbf24";
ctx.fill();
// Газар — ногоон тэгш өнцөгт
ctx.fillStyle = "#4ade80";
ctx.fillRect(0, 320, 500, 80);
// Байшин — хөх тэгш өнцөгт
ctx.fillStyle = "#60a5fa";
ctx.fillRect(150, 220, 200, 100);
// Дээвэр — гурвалжин
ctx.beginPath();
ctx.moveTo(120, 220);
ctx.lineTo(250, 120);
ctx.lineTo(380, 220);
ctx.closePath();
ctx.fillStyle = "#f87171";
ctx.fill();
// Гарчиг
ctx.font = "bold 20px Arial";
ctx.fillStyle = "#f1f5f9";
ctx.fillText("Canvas зурагзурах", 140, 390);
</script>
</body>
</html>
Canvas хэзээ ашиглах вэ?
Canvas нь пиксел-д суурилсан зурагзурах учир дараах тохиолдолд тохиромжтой: тоглоом (game loop), өгөгдлийн chart (боловч <svg> ч ашиглаж болно), зургийн боловсруулалт, гэрэл, тусгал зэрэг нарийн дүрс. Энгийн дүрс болон icon-д SVG илүү тохиромжтой — дараагийн хичээлд үзнэ.
Дараагийн хичээлд:
SVG үндсийг судлана — вектор зураг яагаад canvas-аас ялгаатай, icon болон дүрс бүтээхэд SVG хэрхэн ашигладаг талаар үзнэ.