Canvas API Dasar — Creative Web

Pernah liat website portfolio yang background-nya bergerak partikel kayak galaksi? Atau game browser kayak agar.io yang main-stream zaman 2015? Atau…

Pernah liat website portfolio yang background-nya bergerak partikel kayak galaksi? Atau game browser kayak agar.io yang main-stream zaman 2015? Atau visualisasi data interaktif di NYTimes/Bloomberg? Itu semua jalan di Canvas API — elemen HTML yang ngasih lo "kanvas kosong" untuk gambar apapun via JavaScript. Tanpa Canvas, web cuma bisa nampilin elemen statis. Dengan Canvas, web jadi medium kreatif tanpa batas: game, animasi, generative art, data viz, bahkan editor gambar (Figma, Photoshop Web).

💡 Canvas vs SVG. Canvas = bitmap (raster pixel) — cocok buat banyak elemen + animasi cepet (game, partikel). SVG = vector — cocok buat ilustrasi yang scaling tajam (icon, logo, chart). Pilih sesuai use case: ribuan partikel = Canvas. UI element scalable = SVG.

Canvas API Dasar

Canvas adalah elemen HTML yang memungkinkan kamu menggambar grafik 2D langsung di browser menggunakan JavaScript. Berbeda dengan elemen HTML biasa yang deklaratif, canvas bersifat imperatif — kamu memberikan perintah langkah demi langkah untuk menggambar.

Membuat Elemen Canvas

<canvas id="myCanvas" width="600" height="400"></canvas>

Canvas punya atribut width dan height yang menentukan resolusi piksel. Jangan gunakan CSS untuk mengatur ukuran — itu hanya akan meng-stretch gambar.

Mendapatkan Context 2D

Untuk mulai menggambar, kamu perlu mendapatkan rendering context:

const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");

getContext("2d") mengembalikan object CanvasRenderingContext2D yang punya semua method untuk menggambar.

Menggambar Persegi (fillRect & strokeRect)

// Persegi terisi warna
ctx.fillStyle = "#3498db";
ctx.fillRect(50, 50, 200, 100);
// fillRect(x, y, lebar, tinggi)

// Persegi hanya garis tepi
ctx.strokeStyle = "#e74c3c";
ctx.lineWidth = 3;
ctx.strokeRect(300, 50, 200, 100);

Menggambar Lingkaran dengan arc()

Canvas tidak punya method khusus untuk lingkaran. Kita gunakan arc() dalam sebuah path:

ctx.beginPath();
ctx.arc(300, 200, 80, 0, Math.PI * 2);
// arc(centerX, centerY, radius, startAngle, endAngle)
ctx.fillStyle = "#2ecc71";
ctx.fill();
ctx.strokeStyle = "#27ae60";
ctx.lineWidth = 4;
ctx.stroke();

Menggambar Garis

ctx.beginPath();
ctx.moveTo(50, 300);    // titik awal
ctx.lineTo(250, 350);   // garis ke titik ini
ctx.lineTo(150, 250);   // garis lanjutan
ctx.closePath();        // hubungkan kembali ke titik awal
ctx.strokeStyle = "#9b59b6";
ctx.lineWidth = 2;
ctx.stroke();

Menghapus Canvas dengan clearRect

// Hapus seluruh canvas
ctx.clearRect(0, 0, canvas.width, canvas.height);

// Hapus area tertentu saja
ctx.clearRect(100, 100, 200, 200);

clearRect() sangat penting untuk animasi — kamu perlu menghapus frame sebelumnya sebelum menggambar frame baru.

Menggambar Teks

ctx.font = "bold 24px Arial";
ctx.fillStyle = "#2c3e50";
ctx.fillText("Halo Canvas!", 50, 50);

ctx.strokeStyle = "#e74c3c";
ctx.strokeText("Outlined Text", 50, 100);

Contoh Lengkap: Menggambar Pemandangan Sederhana

const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");

// Langit
ctx.fillStyle = "#87CEEB";
ctx.fillRect(0, 0, 600, 250);

// Rumput
ctx.fillStyle = "#2ecc71";
ctx.fillRect(0, 250, 600, 150);

// Matahari
ctx.beginPath();
ctx.arc(500, 80, 50, 0, Math.PI * 2);
ctx.fillStyle = "#f1c40f";
ctx.fill();

// Rumah
ctx.fillStyle = "#e74c3c";
ctx.fillRect(100, 180, 150, 120);

// Atap
ctx.beginPath();
ctx.moveTo(80, 180);
ctx.lineTo(175, 100);
ctx.lineTo(270, 180);
ctx.fillStyle = "#c0392b";
ctx.fill();

Canvas adalah fondasi untuk semua yang akan kita pelajari selanjutnya — animasi, interaksi, dan bahkan game sederhana!

🎭 Analogi sehari-hari

Canvas = kertas gambar kosong + pensil/cat. HTML/CSS = template pre-printed (form, kartu undangan). Canvas = freedom total: gambar apapun, lo yang kontrol tiap pixel. Bedanya: HTML/CSS kasih elemen jadi (button, card), Canvas minta lo gambar manual tapi unlimited freedom buat creativity.

⚠️ Jebakan yang sering ditemui

TL;DR: Canvas = elemen HTML untuk gambar 2D imperatif via JS. Foundation: game browser, animasi, generative art, data viz, image editor. Pakai getContext("2d") → method fillRect/arc/beginPath → gambar. Ukuran via atribut, bukan CSS. Animasi pake requestAnimationFrame + clearRect. Canvas (bitmap, banyak elemen) vs SVG (vector, scalable UI).

Yang akan kamu pelajari