SVG
jest specyfikacją rysunku, taką jak format pliku. SVG to dokument. Możesz wymieniać pliki SVG, takie jak pliki HTML. A dodatkowo, ponieważ elementy SVG i elementy HTML współdzielą to samo DOM API, możliwe jest użycie JavaScript do wygenerowania SVG DOM w taki sam sposób, w jaki jest możliwe utworzenie HTML DOM. Ale nie potrzebujesz JavaScript do wygenerowania pliku SVG. Do napisania SVG wystarczy prosty edytor tekstu. Ale potrzebujesz przynajmniej kalkulatora, aby obliczyć współrzędne kształtów na rysunku.
CANVAS
to tylko obszar rysowania. Do wygenerowania zawartości płótna konieczne jest użycie JavaScript. Nie możesz wymienić płótna. To nie jest dokument. A elementy płótna nie są częścią drzewa DOM. Nie możesz używać DOM API do manipulowania zawartością płótna. Zamiast tego musisz użyć dedykowanego interfejsu API kanwy, aby narysować kształty na kanwie.
Zaletą a SVG
jest to, że można wymienić rysunek jako dokument. Zaletą CANVAS
jest to, że ma mniej gadatliwy interfejs API JavaScript do generowania treści.
Oto przykład, który pokazuje, że można osiągnąć podobne rezultaty, ale sposób, w jaki to robi się w JavaScript jest zupełnie inny.
(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>
Jak widać wynik jest prawie taki sam, ale kod JavaScript jest zupełnie inny.
SVG jest tworzony przy użyciu API DOM createElement
, setAttribute
i appendChild
. Wszystkie grafiki znajdują się w ciągach atrybutów. SVG ma mocniejsze prymitywy. Na przykład CANVAS nie ma nic równoważnego ścieżce łuku SVG. Przykład CANVAS próbuje emulować łuk SVG z krzywą Beziera. W SVG możesz ponownie wykorzystać elementy, aby je przekształcić. W CANVAS nie można ponownie wykorzystać elementów. Zamiast tego musisz napisać funkcję JavaScript, aby wywołać ją dwukrotnie. SVG maviewBox
który pozwala na użycie znormalizowanych współrzędnych, co upraszcza obroty. W CANVAS musisz samodzielnie obliczyć współrzędne na podstawieclientWidth
iclientHeight
. I możesz stylizować wszystkie elementy SVG za pomocą CSS. W CANVAS nie można niczego stylizować za pomocą CSS. Ponieważ SVG jest DOM, możesz przypisać programy obsługi zdarzeń do wszystkich elementów SVG. Elementy w CANVAS nie mają DOM ani programów obsługi zdarzeń DOM.
Ale z drugiej strony kod CANVAS jest znacznie łatwiejszy do odczytania. Nie musisz przejmować się przestrzeniami nazw XML. Możesz bezpośrednio wywoływać funkcje graficzne, ponieważ nie musisz budować DOM.
Lekcja jest jasna: jeśli chcesz szybko narysować jakąś grafikę, użyj CANVAS. Jeśli chcesz udostępnić grafikę, lubisz stylizować ją za pomocą CSS lub chcesz użyć programów obsługi zdarzeń DOM w swojej grafice, stwórz SVG.