SVG
- это спецификация чертежа, подобная формату файла. SVG - это документ. Вы можете обмениваться файлами SVG, например файлами HTML. Кроме того, поскольку элементы SVG и элементы HTML используют один и тот же DOM API, можно использовать JavaScript для создания SVG DOM таким же образом, как это возможно для создания HTML DOM. Но для создания файла SVG не требуется JavaScript. Для написания SVG достаточно простого текстового редактора. Но вам понадобится как минимум калькулятор, чтобы рассчитать координаты фигур на чертеже.
CANVAS
это просто область рисования. Для создания содержимого холста необходимо использовать JavaScript. Холст обменять нельзя. Это не документ. И элементы холста не являются частью дерева DOM. Вы не можете использовать DOM API для управления содержимым холста. Вместо этого вам нужно использовать специальный API холста для рисования фигур на холсте.
Преимущество SVG
том, что вы можете обменять рисунок как документ. Преимущество этого CANVAS
заключается в том, что он имеет менее подробный API JavaScript для создания содержимого.
Вот пример, который показывает, что вы можете добиться аналогичных результатов, но способ сделать это в JavaScript сильно отличается.
(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>
Как видите, результат почти такой же, но код JavaScript совершенно другой.
SVG создается с помощью DOM API с использованием createElement
, setAttribute
и appendChild
. Вся графика находится в строках атрибутов. SVG имеет более мощные примитивы. CANVAS, например, не имеет ничего эквивалентного пути дуги SVG. Пример CANVAS пытается имитировать дугу SVG с кривой Безье. В SVG вы можете повторно использовать элементы, чтобы преобразовать их. В CANVAS нельзя повторно использовать элементы. Вместо этого вам нужно написать функцию JavaScript, чтобы вызывать ее дважды. SVG имеет параметр, viewBox
который позволяет использовать нормализованные координаты, что упрощает вращение. В CANVAS вы должны сами рассчитать координаты на основе clientWidth
иclientHeight
. И вы можете стилизовать все элементы SVG с помощью CSS. В CANVAS вы ничего не можете стилизовать с помощью CSS. Поскольку SVG - это модель DOM, вы можете назначить обработчики событий всем элементам SVG. Элементы CANVAS не имеют DOM и обработчиков событий DOM.
Но с другой стороны, код CANVAS гораздо легче читать. Вам не нужно заботиться о пространствах имен XML. И вы можете напрямую вызывать графические функции, потому что вам не нужно строить DOM.
Урок ясен: если вы хотите быстро нарисовать графику, используйте CANVAS. Если вам нужно поделиться графикой, например, стилизовать ее с помощью CSS или использовать обработчики событий DOM в своей графике, создайте SVG.