SVG
adalah spesifikasi gambar seperti format file. SVG adalah dokumen. Anda dapat bertukar file SVG seperti file HTML. Selain itu, karena elemen SVG dan elemen HTML berbagi API DOM yang sama, JavaScript dapat digunakan untuk membuat DOM SVG dengan cara yang sama seperti membuat DOM HTML. Tetapi Anda tidak membutuhkan JavaScript untuk menghasilkan file SVG. Editor teks sederhana sudah cukup untuk menulis SVG. Tapi Anda membutuhkan setidaknya kalkulator untuk menghitung koordinat bentuk pada gambar.
CANVAS
hanyalah area menggambar. Itu perlu menggunakan JavaScript untuk menghasilkan konten kanvas. Anda tidak bisa bertukar kanvas. Ini bukan dokumen. Dan elemen kanvas bukanlah bagian dari pohon DOM. Anda tidak dapat menggunakan API DOM untuk memanipulasi konten kanvas. Sebagai gantinya Anda harus menggunakan API kanvas khusus untuk menggambar bentuk ke kanvas.
Keuntungan dari a SVG
adalah, Anda dapat menukar gambar tersebut sebagai dokumen. Keuntungan dari CANVAS
is, yaitu memiliki JavaScript API yang lebih sedikit untuk menghasilkan konten.
Berikut adalah sebuah contoh, yang menunjukkan bahwa Anda dapat mencapai hasil yang serupa, tetapi cara melakukannya di JavaScript sangat berbeda.
(function () {
const ns='http://www.w3.org/2000/svg';
let s = document.querySelector('svg');
let p = document.createElementNS (ns, 'path');
p.setAttribute ('id', 'arc');
p.setAttribute ('d', 'M 0.9 -0.9 a 0.8,0.4 -10 0,0 -0.9,0.9');
s.appendChild (p);
let u = document.createElementNS (ns, 'use');
u.setAttribute ('href', '#arc');
u.setAttribute ('transform', 'rotate(180)');
s.appendChild (u);
})();
(function () {
let c = document.querySelector('canvas');
let w = c.width = c.clientWidth;
let h = c.height = c.clientHeight;
let x = c.getContext('2d');
x.lineWidth = 0.05 * w;
x.moveTo (w/2, h/2);
x.bezierCurveTo (w*0.02, h*0.4,
w*0.4, -h*0.02,
w*0.95, h*0.05);
x.moveTo (w/2, h/2);
x.bezierCurveTo (w*(1-0.02), h*(1-0.4),
w*(1-0.4), h*(1+0.02),
w*(1-0.95), h*(1-0.05));
x.stroke();
})();
svg, canvas {
width: 3em;
height: 3em;
}
svg {
vertical-align: text-top;
stroke: black;
stroke-width: 0.1;
fill: none;
}
canvas {
vertical-align: text-bottom;
}
div {
float: left;
}
<div><svg viewBox="-1 -1 2 2"></svg>VG</div>
<div>CANVA<canvas></canvas></div>
Seperti yang Anda lihat, hasilnya hampir sama, tetapi kode JavaScript-nya sangat berbeda.
SVG dibuat dengan DOM API menggunakan createElement
, setAttribute
dan appendChild
. Semua grafik ada dalam string atribut. SVG memiliki primitif yang lebih kuat. CANVAS misalnya tidak memiliki apa pun yang setara dengan jalur busur SVG. Contoh CANVAS mencoba meniru busur SVG dengan kurva Bezier. Dalam SVG Anda dapat menggunakan kembali elemen untuk mengubahnya. Di CANVAS Anda tidak dapat menggunakan kembali elemen. Sebagai gantinya, Anda harus menulis fungsi JavaScript untuk memanggilnya dua kali. SVG memiliki viewBox
yang memungkinkan untuk menggunakan koordinat yang dinormalisasi, yang menyederhanakan rotasi. Di CANVAS Anda harus menghitung sendiri koordinatnya berdasarkan clientWidth
danclientHeight
. Dan Anda dapat mengatur gaya semua elemen SVG dengan CSS. Di CANVAS Anda tidak dapat mengatur gaya apa pun dengan CSS. Karena SVG adalah DOM, Anda dapat menetapkan penangan kejadian ke semua elemen SVG. Elemen di CANVAS tidak memiliki DOM dan tidak ada penangan kejadian DOM.
Namun di sisi lain kode CANVAS jauh lebih mudah dibaca. Anda tidak perlu peduli dengan ruang nama XML. Dan Anda bisa langsung memanggil fungsi grafik, karena Anda tidak perlu membangun DOM.
Pelajarannya jelas: jika Anda ingin menggambar beberapa grafik dengan cepat, gunakan CANVAS. Jika Anda perlu membagikan grafik, ingin menatanya dengan CSS atau ingin menggunakan event handler DOM dalam grafik Anda, buat SVG.