Библиотека SVG.js построена вокруг расширяемой архитектуры, позволяющей добавлять новые функции через плагины. Плагины дают возможность создавать собственные элементы, методы, фильтры и анимации, сохраняя при этом совместимость с основным API библиотеки.
Плагин в SVG.js — это функция, которая получает объект библиотеки в качестве аргумента. Стандартная схема регистрации выглядит так:
SVG.extend(SVG.Element, {
customMethod() {
// реализация метода
return this;
}
});
SVG.Element, SVG.Container,
SVG.FX).Можно создавать плагины, которые расширяют сразу несколько классов. Например, методы анимации применимы к SVG.FX, а методы трансформации — к SVG.Element.
Для добавления пользовательских элементов используется функция
SVG.register(). Пример создания нового элемента
Star:
SVG.register('Star', {
create(x, y, points, radius1, radius2) {
const pathData = [];
for (let i = 0; i < points; i++) {
let angle = (i * 2 * Math.PI) / points;
let r = i % 2 === 0 ? radius1 : radius2;
pathData.push(
`${i === 0 ? 'M' : 'L'}${x + r * Math.cos(angle)},${y + r * Math.sin(angle)}`
);
}
pathData.push('Z');
return this.path(pathData.join(' '));
}
});
SVG.register принимает имя нового элемента и объект с
методами для него.create создаёт структуру элемента и возвращает
SVG-объект.Созданный элемент становится доступным через стандартный синтаксис:
const draw = SVG().addTo('#canvas').size(300, 300);
draw.Star().create(150, 150, 5, 50, 25).fill('yellow').stroke({ width: 2 });
Плагины часто используют SVG.extend для добавления
методов к существующим классам. Пример добавления метода для плавного
изменения цвета:
SVG.extend(SVG.Element, {
transitionColor(color, duration = 1000) {
return this.animate(duration).attr({ fill: color });
}
});
SVG.Element — базовый класс всех SVG-элементов.extend, становятся доступными
на любом элементе: rect.transitionColor('red').SVG.js поддерживает плагины для фильтров и эффектов. Для расширения
фильтров используется SVG.extend(SVG.Filter, {...}).
Например, добавление размытия по Гауссу:
SVG.extend(SVG.Filter, {
customBlur(amount = 2) {
return this.gaussianBlur(amount);
}
});
Применение к элементу:
rect.filterWith(function(add) {
add.customBlur(5);
});
filterWith, а их элементы
добавляются через функцию-колбек.Анимационные плагины работают с классом SVG.FX. Расширение происходит аналогично:
SVG.extend(SVG.FX, {
bounce(duration = 500) {
return this.animate(duration, '<>').transform({ scale: 1.2 }).animate(duration, '<>').transform({ scale: 1 });
}
});
SVG.FX управляет всеми анимационными цепочками.animate, transform,
attr).rect.fx().bounce();SVG.js построен с учётом модульности:
this для поддержки цепочек вызовов.SVG.extend,
SVG.register, filterWith,
fx).Архитектура плагинов SVG.js обеспечивает гибкость: любой функционал может быть добавлен через расширение существующих классов или регистрацию новых элементов без изменения исходного кода библиотеки. Это создаёт основу для построения сложных визуальных приложений с модульным, легко поддерживаемым кодом.