SVG
- це специфікація креслення, як формат файлу. SVG - це документ. Ви можете обмінюватися SVG-файлами, такими як HTML-файли. Крім того, оскільки елементи SVG та елементи HTML мають однаковий API DOM, можна використовувати JavaScript для створення SVG DOM так само, як це можливо для створення HTML DOM. Але для створення файлу SVG вам не потрібен JavaScript. Для написання SVG достатньо простого текстового редактора. Але для обчислення координат фігур на кресленні потрібен хоча б калькулятор.
CANVAS
це просто область малювання. Для генерації вмісту полотна необхідно використовувати JavaScript. Ви не можете обміняти полотно. Це не документ. А елементи полотна не є частиною дерева DOM. Ви не можете використовувати API DOM для обробки вмісту полотна. Натомість вам потрібно використовувати спеціальний API полотна, щоб намалювати фігури на полотні.
Перевага a SVG
полягає в тому, що ви можете обміняти креслення як документ. ПеревагаCANVAS
тому, що він має менш детальний API JavaScript для генерації вмісту.
Ось приклад, який показує, що ви можете досягти подібних результатів, але спосіб, як це зробити в JavaScript, дуже різний.
// 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>
Як бачите, результат майже однаковий, але код 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.
Урок зрозумілий: якщо ви швидко хочете намалювати якусь графіку, використовуйте ПОЛОТНУ. Якщо вам потрібно поділитися графікою, вам подобається стилізувати її з CSS або хочете використовувати обробники подій DOM у своїй графіці, створіть SVG.