SVG
bir dosya formatı gibi bir çizimin özelliğidir. SVG bir belgedir. SVG dosyalarını HTML dosyaları gibi değiş tokuş edebilirsiniz. Ayrıca, SVG öğeleri ve HTML öğeleri aynı DOM API'sini paylaştığından, bir HTML DOM oluşturmakla aynı şekilde bir SVG DOM oluşturmak için JavaScript kullanmak da mümkündür. Ancak SVG dosyası oluşturmak için JavaScript'e ihtiyacınız yoktur. SVG yazmak için basit bir metin editörü yeterlidir. Ancak çizimdeki şekillerin koordinatlarını hesaplamak için en azından bir hesap makinesine ihtiyacınız var.
CANVAS
sadece bir çizim alanıdır. Bir tuvalin içeriğini oluşturmak için JavaScript kullanmak gerekir. Bir tuvali değiştiremezsiniz. Belge değil. Ve tuvalin öğeleri DOM ağacının bir parçası değildir. Bir tuvalin içeriğini değiştirmek için DOM API'yi kullanamazsınız. Bunun yerine, tuvale şekiller çizmek için özel bir tuval API'si kullanmanız gerekir.
A'nın avantajı SVG
, çizimi bir belge olarak değiştirebilmenizdir. Bunun avantajı CANVAS
, içeriği oluşturmak için daha az ayrıntılı bir JavaScript API'sine sahip olmasıdır.
İşte benzer sonuçlar elde edebileceğinizi gösteren bir örnek, ancak bunu JavaScript'te nasıl yapacağınız çok farklı.
(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>
Gördüğünüz gibi sonuç hemen hemen aynı, ancak JavaScript kodu tamamen farklı.
SVG createElement
, setAttribute
ve kullanılarak DOM API ile oluşturulur appendChild
. Tüm grafikler öznitelik dizelerindedir. SVG'nin daha güçlü ilkelleri vardır. Örneğin, CANVAS'ın SVG ark yoluna eşdeğer hiçbir şeyi yoktur. CANVAS örneği, SVG yayını Bezier eğrisiyle taklit etmeye çalışır. SVG'de öğeleri dönüştürmek için yeniden kullanabilirsiniz. CANVAS'ta öğeleri yeniden kullanamazsınız. Bunun yerine, onu iki kez çağırmak için bir JavaScript işlevi yazmanız gerekir. SVG'de, viewBox
dönüşleri basitleştiren normalleştirilmiş koordinatların kullanılmasına izin veren bir vardır. CANVAS size kendiniz dayalı koordinatlarını hesaplamak zorunda clientWidth
veclientHeight
. Ve tüm SVG öğelerini CSS ile biçimlendirebilirsiniz. CANVAS'ta CSS ile hiçbir şeye stil veremezsiniz. SVG bir DOM olduğundan, tüm SVG öğelerine olay işleyicileri atayabilirsiniz. CANVAS'taki öğelerin DOM'si ve DOM olay işleyicisi yoktur.
Ancak diğer yandan CANVAS kodunun okunması çok daha kolaydır. XML isim boşluklarını önemsemenize gerek yok. Ve bir DOM oluşturmanıza gerek olmadığı için grafik işlevlerini doğrudan çağırabilirsiniz.
Ders açık: Hızlı bir şekilde bazı grafikler çizmek istiyorsanız, CANVAS'ı kullanın. Grafikleri CSS ile stil vermek gibi paylaşmanız gerekiyorsa veya grafiklerinizde DOM olay işleyicileri kullanmak istiyorsanız, bir SVG oluşturun.