SVG
est une spécification d'un dessin comme un format de fichier. Un SVG est un document. Vous pouvez échanger des fichiers SVG comme des fichiers HTML. Et de plus parce que les éléments SVG et les éléments HTML partagent la même API DOM, il est possible d'utiliser JavaScript pour générer un DOM SVG de la même manière qu'il est possible de créer un DOM HTML. Mais vous n'avez pas besoin de JavaScript pour générer un fichier SVG. Un simple éditeur de texte suffit pour écrire un SVG. Mais vous avez besoin d'au moins une calculatrice pour calculer les coordonnées des formes dans le dessin.
CANVAS
est juste une zone de dessin. Il faut utiliser JavaScript pour générer le contenu d'un canevas. Vous ne pouvez pas échanger une toile. Ce n'est pas un document. Et les éléments du canevas ne font pas partie de l'arborescence DOM. Vous ne pouvez pas utiliser l'API DOM pour manipuler le contenu d'un canevas. Au lieu de cela, vous devez utiliser une API de canevas dédiée pour dessiner des formes dans le canevas.
L'avantage de a SVG
est que vous pouvez échanger le dessin en tant que document. L'avantage duCANVAS
est qu'il dispose d'une API JavaScript moins verbeuse pour générer le contenu.
Voici un exemple, qui montre que vous pouvez obtenir des résultats similaires, mais la façon de le faire en JavaScript est très différente.
// 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>
Comme vous pouvez le voir, le résultat est presque le même, mais le code JavaScript est complètement différent.
SVG est créé avec l'API DOM en utilisant createElement
, setAttribute
et appendChild
. Tous les graphiques sont dans les chaînes d'attributs. SVG a des primitives plus puissantes. Le CANVAS par exemple n'a rien d'équivalent au chemin de l'arc SVG. L'exemple CANVAS tente d'émuler l'arc SVG avec une courbe de Bézier. En SVG, vous pouvez réutiliser des éléments pour les transformer. Dans le CANVAS, vous ne pouvez pas réutiliser des éléments. Au lieu de cela, vous devez écrire une fonction JavaScript pour l'appeler deux fois. SVG a unviewBox
qui permet d'utiliser des coordonnées normalisées, ce qui simplifie les rotations. Dans CANVAS, vous devez calculer vous-même les coordonnées en fonction declientWidth
etclientHeight
. Et vous pouvez styliser tous les éléments SVG avec CSS. Dans le CANVAS, vous ne pouvez rien styler avec CSS. Comme SVG est un DOM, vous pouvez attribuer des gestionnaires d'événements à tous les éléments SVG. Les éléments de CANVAS n'ont ni DOM ni gestionnaires d'événements DOM.
Mais d'un autre côté, le code CANVAS est beaucoup plus facile à lire. Vous n'avez pas besoin de vous soucier des espaces de nom XML. Et vous pouvez appeler directement les fonctions graphiques, car vous n'avez pas besoin de construire un DOM.
La leçon est claire: si vous souhaitez dessiner rapidement des graphiques, utilisez le CANVAS. Si vous avez besoin de partager les graphiques, aimez les styliser avec CSS ou souhaitez utiliser des gestionnaires d'événements DOM dans vos graphiques, créez un SVG.