SVG.js представляет собой высокоуровневую JavaScript-библиотеку, предоставляющую удобный API для работы с SVG-документами. Основное отличие от нативного SVG заключается в том, что SVG.js абстрагирует низкоуровневые методы DOM, позволяя создавать и управлять элементами графики через цепочки методов и объекты.
Пример создания круга:
const draw = SVG().addTo('body').size(300, 300);
const circle = draw.circle(100).fill('red').move(50, 50);
В нативном SVG тот же элемент создается с использованием DOM API:
const svgns = "http://www.w3.org/2000/svg";
const svg = document.createElementNS(svgns, "svg");
svg.setAttribute("width", "300");
svg.setAttribute("height", "300");
document.body.appendChild(svg);
const circle = document.createElementNS(svgns, "circle");
circle.setAttribute("cx", "100");
circle.setAttribute("cy", "100");
circle.setAttribute("r", "50");
circle.setAttribute("fill", "red");
svg.appendChild(circle);
Здесь видно, что SVG.js сокращает и структурирует создание элементов, особенно при работе с анимациями и сложными трансформациями.
В SVG.js управление атрибутами и стилями осуществляется через методы
.attr(), .fill(), .stroke(),
.opacity() и другие, что позволяет писать лаконичный
код:
circle.fill('blue').stroke({ width: 5, color: 'black' }).opacity(0.7);
В нативном SVG это потребует явного обращения к атрибутам:
circle.setAttribute("fill", "blue");
circle.setAttribute("stroke", "black");
circle.setAttribute("stroke-width", "5");
circle.setAttribute("opacity", "0.7");
Методы SVG.js также позволяют задавать параметры анимаций и трансформаций в объектном виде, что упрощает поддержку кода.
SVG.js предоставляет встроенные методы для трансформаций:
.move(), .scale(), .rotate(),
.skew() и для анимаций:
.animate().move().rotate().
Пример анимации круга:
circle.animate(1000, '<>').move(150, 150).rotate(180);
В нативном SVG потребуется использование либо CSS-анимаций, либо SMIL
(который устарел) или JS через requestAnimationFrame:
let start = null;
function animate(timestamp) {
if (!start) start = timestamp;
const progress = (timestamp - start) / 1000;
circle.setAttribute('cx', 100 + 50 * progress);
circle.setAttribute('transform', `rotate(${180 * progress} 150 150)`);
if (progress < 1) requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
SVG.js сокращает и упрощает анимационные конструкции, делая их декларативными.
SVG.js позволяет создавать группы элементов через
.group(), что облегчает управление сложными сценами и
позволяет применять трансформации ко всей группе сразу:
const group = draw.group();
group.add(draw.rect(50, 50).fill('green'));
group.add(draw.circle(25).fill('yellow').move(25, 25));
group.rotate(45);
В нативном SVG группировка требует создания <g>
элементов и явного присоединения дочерних узлов:
const g = document.createElementNS(svgns, 'g');
const rect = document.createElementNS(svgns, 'rect');
rect.setAttribute('width', '50');
rect.setAttribute('height', '50');
rect.setAttribute('fill', 'green');
g.appendChild(rect);
const circle = document.createElementNS(svgns, 'circle');
circle.setAttribute('r', '25');
circle.setAttribute('cx', '50');
circle.setAttribute('cy', '50');
circle.setAttribute('fill', 'yellow');
g.appendChild(circle);
g.setAttribute('transform', 'rotate(45 50 50)');
svg.appendChild(g);
SVG.js делает операции с группами интуитивными и объектно-ориентированными.
D3.js ориентирована на визуализацию данных и использует привязку данных к DOM. Она мощна для построения интерактивных графиков, но синтаксис более низкоуровневый по сравнению с SVG.js:
d3.select('svg').append('circle')
.attr('cx', 100)
.attr('cy', 100)
.attr('r', 50)
.style('fill', 'red');
Snap.svg имеет схожие с SVG.js возможности, но его API менее современное и иногда более громоздкое:
const s = Snap(300, 300);
const circle = s.circle(100, 100, 50);
circle.attr({ fill: "red" });
SVG.js выигрывает в компактности кода и поддержке цепочек методов, что облегчает построение динамических интерфейсов.
Выбор между библиотеками зависит от целей: если требуется легкая объектная манипуляция SVG с анимациями и трансформациями — SVG.js является оптимальным вариантом.
SVG.js легко интегрируется с React, Vue и другими фреймворками через обертки компонентов, что позволяет использовать реактивные подходы совместно с мощным API для SVG.
Пример с React:
import { useEffect, useRef } from 'react';
import SVG from '@svgdotjs/svg.js';
function SvgComponent() {
const container = useRef(null);
useEffect(() => {
const draw = SVG().addTo(container.current).size(300, 300);
draw.circle(100).fill('purple').move(50, 50);
}, []);
return <div ref={container}></div>;
}
Это упрощает управление графикой без прямого манипулирования DOM, объединяя удобство библиотек и реактивный подход.
SVG.js сочетает преимущества нативного SVG и удобства библиотек, обеспечивая простоту, компактность кода и удобные инструменты для анимаций, трансформаций и группировки элементов.