SVG
è una specifica di un disegno come un formato di file. Un SVG è un documento. Puoi scambiare file SVG come file HTML. Inoltre, poiché gli elementi SVG e gli elementi HTML condividono la stessa API DOM, è possibile utilizzare JavaScript per generare un DOM SVG nello stesso modo in cui è possibile creare un DOM HTML. Ma non è necessario JavaScript per generare il file SVG. Un semplice editor di testo è sufficiente per scrivere un SVG. Ma hai bisogno almeno di una calcolatrice per calcolare le coordinate delle forme nel disegno.
CANVAS
è solo un'area di disegno. È necessario utilizzare JavaScript per generare i contenuti di una tela. Non puoi scambiare una tela. Non è un documento. E gli elementi della tela non fanno parte dell'albero DOM. Non è possibile utilizzare l'API DOM per manipolare il contenuto di una tela. Invece devi usare un'API canvas dedicata per disegnare forme nella tela.
Il vantaggio di a SVG
è che puoi scambiare il disegno come documento. Il vantaggio diCANVAS
è che ha un'API JavaScript meno dettagliata per generare i contenuti.
Ecco un esempio, che mostra che puoi ottenere risultati simili, ma il modo in cui farlo in JavaScript è molto diverso.
// Italic S in SVG
(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);
})();
// Italic S in CANVAS
(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>
Come puoi vedere il risultato è quasi lo stesso, ma il codice JavaScript è completamente diverso.
SVG viene creato con l'API DOM utilizzando createElement
, setAttribute
e appendChild
. Tutti gli elementi grafici sono nelle stringhe degli attributi. SVG ha primitive più potenti. La CANVAS, ad esempio, non ha nulla di equivalente al percorso dell'arco SVG. L'esempio CANVAS cerca di emulare l'arco SVG con una curva di Bézier. In SVG puoi riutilizzare gli elementi per trasformarli. Nella TELA non puoi riutilizzare gli elementi. Invece devi scrivere una funzione JavaScript per chiamarla due volte. SVG ha una viewBox
che consente di utilizzare coordinate normalizzate, che semplifica le rotazioni. Nella TELA devi calcolare tu stesso le coordinate in base a clientWidth
eclientHeight
. E puoi modellare tutti gli elementi SVG con CSS. In CANVAS non puoi modellare nulla con i CSS. Poiché SVG è un DOM, puoi assegnare gestori di eventi a tutti gli elementi SVG. Gli elementi in CANVAS non hanno DOM e nessun gestore di eventi DOM.
Ma d'altra parte il codice CANVAS è molto più facile da leggere. Non è necessario preoccuparsi degli spazi dei nomi XML. E puoi chiamare direttamente le funzioni grafiche, perché non è necessario creare un DOM.
La lezione è chiara: se vuoi disegnare velocemente dei grafici, usa la TELA. Se hai bisogno di condividere la grafica, ti piace modellarla con CSS o vuoi usare i gestori di eventi DOM nella tua grafica, crea un SVG.