SVG
es una especificación de un dibujo como un formato de archivo. Un SVG es un documento. Puede intercambiar archivos SVG como archivos HTML. Y además, debido a que los elementos SVG y los elementos HTML comparten la misma API DOM, es posible usar JavaScript para generar un DOM SVG de la misma manera que es posible crear un DOM HTML. Pero no necesita JavaScript para generar archivos SVG. Un simple editor de texto es suficiente para escribir un SVG. Pero necesitas al menos una calculadora para calcular las coordenadas de las formas en el dibujo.
CANVAS
es solo un área de dibujo. Es necesario utilizar JavaScript para generar el contenido de un lienzo. No se puede intercambiar un lienzo. No es ningún documento. Y los elementos del lienzo no forman parte del árbol DOM. No puede utilizar la API DOM para manipular el contenido de un lienzo. En su lugar, debe utilizar una API de lienzo dedicada para dibujar formas en el lienzo.
La ventaja de a SVG
es que puede intercambiar el dibujo como un documento. La ventaja CANVAS
es que tiene una API de JavaScript menos detallada para generar los contenidos.
Aquí hay un ejemplo, que muestra que puede lograr resultados similares, pero la forma de hacerlo en JavaScript es muy diferente.
// 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>
Como puede ver, el resultado es casi el mismo, pero el código JavaScript es completamente diferente.
SVG se crea con la API DOM utilizando createElement
, setAttribute
y appendChild
. Todos los gráficos están en las cadenas de atributos. SVG tiene primitivas más poderosas. El CANVAS, por ejemplo, no tiene nada equivalente a la trayectoria del arco SVG. El ejemplo CANVAS intenta emular el arco SVG con una curva Bezier. En SVG puedes reutilizar elementos para transformarlos. En el CANVAS no se pueden reutilizar elementos. En su lugar, debe escribir una función de JavaScript para llamarla dos veces. SVG tiene un viewBox
que permite usar coordenadas normalizadas, lo que simplifica las rotaciones. En el lienzo tiene que calcular las coordenadas sí mismos basado de la clientWidth
eclientHeight
. Y puede diseñar todos los elementos SVG con CSS. En CANVAS no puedes diseñar nada con CSS. Dado que SVG es un DOM, puede asignar controladores de eventos a todos los elementos SVG. Los elementos de CANVAS no tienen DOM ni controladores de eventos DOM.
Pero, por otro lado, el código CANVAS es mucho más fácil de leer. No necesita preocuparse por los espacios de nombres XML. Y puede llamar directamente a las funciones gráficas, porque no necesita construir un DOM.
La lección es clara: si desea dibujar rápidamente algunos gráficos, use CANVAS. Si necesita compartir los gráficos, le gusta darle estilo con CSS o desea usar controladores de eventos DOM en sus gráficos, cree un SVG.