Библиотека SVG.js предоставляет мощный и интуитивно понятный интерфейс для работы с векторной графикой в браузере. Основное преимущество SVG заключается в том, что все элементы остаются масштабируемыми и интерактивными без потери качества. SVG.js упрощает создание графиков, диаграмм и интерактивных визуализаций с помощью методов высокого уровня.
Для начала необходимо создать контейнер, в котором будут размещаться все графические элементы:
const draw = SVG().addTo('#drawing').size(800, 600);
Здесь #drawing — это идентификатор HTML-элемента (обычно
<div>), а .size() задаёт размеры холста.
Холст может быть динамически адаптирован к размеру родительского
контейнера, что удобно для отзывчивого дизайна.
SVG.js позволяет создавать базовые графические элементы:
const rect = draw.rect(200, 100).attr({ fill: '#3498db', stroke: '#2c3e50', 'stroke-width': 3 });
const circle = draw.circle(80).attr({ fill: '#e74c3c', cx: 150, cy: 150 });
const line = draw.line(50, 50, 300, 300).stroke({ color: '#27ae60', width: 4 });
const text = draw.text('Пример текста').move(100, 50).font({ size: 24, family: 'Arial' });
Для визуализации данных часто используют линейные графики, столбчатые диаграммы и круговые диаграммы. В SVG.js это делается с использованием базовых фигур и координатной логики.
Линейный график
const data = [10, 40, 30, 70, 50];
const spacing = 100;
let pathString = 'M0,' + (200 - data[0]);
data.forEach((value, i) => {
if(i > 0) pathString += ' L' + (i * spacing) + ',' + (200 - value);
});
draw.path(pathString).fill('none').stroke({ color: '#2980b9', width: 2 });
Здесь path используется для создания кривой линии,
которая соединяет точки данных. Метод stroke() задаёт цвет
и ширину линии.
Столбчатая диаграмма
const dataBars = [50, 75, 100, 60];
dataBars.forEach((value, i) => {
draw.rect(40, value).attr({ fill: '#8e44ad' }).move(i * 60, 200 - value);
});
rect(ширина, высота).move(x, y), где y
корректируется, чтобы столбцы росли вверх.Круговая диаграмма
const dataPie = [30, 70, 45, 55];
const total = dataPie.reduce((a, b) => a + b, 0);
let angle = 0;
dataPie.forEach((value, i) => {
const sliceAngle = (value / total) * 360;
const endAngle = angle + sliceAngle;
const x1 = 200 + 100 * Math.cos(angle * Math.PI / 180);
const y1 = 200 + 100 * Math.sin(angle * Math.PI / 180);
const x2 = 200 + 100 * Math.cos(endAngle * Math.PI / 180);
const y2 = 200 + 100 * Math.sin(endAngle * Math.PI / 180);
const largeArc = sliceAngle > 180 ? 1 : 0;
const pathData = `M200,200 L${x1},${y1} A100,100 0 ${largeArc},1 ${x2},${y2} Z`;
draw.path(pathData).fill(['#e74c3c','#3498db','#2ecc71','#f1c40f'][i]);
angle = endAngle;
});
path() для построения дуг.A в строке pathData задаёт
эллиптическую дугу с указанием радиуса, угла и направления.SVG.js поддерживает анимацию объектов через метод
.animate():
rect.animate(2000, '<>').move(400, 300).attr({ fill: '#f39c12' });
<> —
плавная).Для интерактивности используется метод .on():
circle.on('mouseover', () => circle.fill({ color: '#2ecc71' }));
circle.on('mouseout', () => circle.fill({ color: '#e74c3c' }));
Это позволяет динамически менять визуальные характеристики при наведении мыши или клике.
SVG.js позволяет объединять элементы в группы для упрощения управления:
const group = draw.group();
group.add(draw.rect(50,50).fill('#3498db'));
group.add(draw.circle(30).fill('#e74c3c').move(25,25));
group.animate(1000).move(200,200);
SVG.js поддерживает трансформации:
rect.scale(1.5, 2); // масштаб по X и Y
circle.rotate(45, 150, 150); // вращение вокруг точки (150,150)
Для динамических визуализаций данные часто загружаются из JSON или API:
fetch('/data.json')
.then(res => res.json())
.then(data => {
data.forEach((item, i) => {
draw.rect(40, item.value).move(i * 50, 200 - item.value).fill(item.color);
});
});
.attr() или .animate()..group() для управления множеством
элементов и уменьшения числа DOM-операций.path() в циклах.requestAnimationFrame для анимаций, чтобы избежать
блокировки интерфейса.SVG.js сочетает в себе простоту API с мощными возможностями визуализации. Она позволяет строить интерактивные графики и диаграммы, управлять анимацией, группировать элементы и работать с динамическими данными, сохраняя при этом масштабируемость и качество графики.