Snap.svg предоставляет мощный API для работы с векторной графикой в браузере, однако возможности библиотеки можно значительно расширить за счет добавления собственных методов к объектам Snap. Пользовательские методы позволяют инкапсулировать повторяющиеся действия, создавать новые визуальные эффекты и упрощать управление сложными сценами SVG.
Snap.pluginДля подключения пользовательских функций используется метод
Snap.plugin. Он принимает одну функцию, которая получает
объект Snap как параметр. Внутри этой функции можно добавлять новые
методы к прототипам объектов библиотеки.
Пример структуры плагина:
Snap.plugin(function(Snap, Element, Paper, global) {
// Добавление нового метода к объекту Element
Element.prototype.myCustomMethod = function(param) {
// this — текущий элемент SVG
this.attr({ fill: param });
return this; // важно для цепочек вызовов
};
// Добавление метода к объекту Paper
Paper.prototype.drawCircleWithText = function(cx, cy, r, text) {
var circle = this.circle(cx, cy, r);
var label = this.text(cx, cy, text);
label.attr({ 'text-anchor': 'middle', 'dominant-baseline': 'middle' });
return this.group(circle, label);
};
});
Ключевые моменты:
Element.prototype, доступны для
всех элементов SVG (circle, rect,
path и т.д.).Paper.prototype, применимы к
объектам холста (Snap("#svg")).this внутри методов позволяет строить цепочки
вызовов (method1().method2()).Пользовательские методы часто используют для создания собственных анимаций или визуальных эффектов. Рассмотрим пример метода, который плавно изменяет цвет и перемещает элемент:
Snap.plugin(function(Snap, Element) {
Element.prototype.animateTo = function(x, y, color, duration) {
this.animate({ cx: x, cy: y, fill: color }, duration, mina.easeinout);
return this;
};
});
// Применение:
var s = Snap("#svg");
var c = s.circle(50, 50, 30).attr({ fill: "#3498db" });
c.animateTo(200, 150, "#e74c3c", 1000);
Особенности:
mina предоставляет предустановленные кривые анимации
(mina.linear, mina.easein,
mina.easeout, mina.easeinout).Snap.svg позволяет группировать элементы через
Paper.group. Пользовательские методы можно использовать для
автоматизации создания таких компонентов.
Snap.plugin(function(Snap, Paper, Element) {
Paper.prototype.createButton = function(x, y, width, height, text) {
var rect = this.rect(x, y, width, height, 5, 5).attr({
fill: "#2ecc71",
stroke: "#27ae60",
strokeWidth: 2
});
var label = this.text(x + width / 2, y + height / 2, text).attr({
'text-anchor': 'middle',
'dominant-baseline': 'middle',
fill: "#fff",
fontSize: 16
});
var group = this.group(rect, label);
group.click(function() {
rect.animate({ fill: "#27ae60" }, 200);
});
return group;
};
});
// Использование:
var s = Snap("#svg");
var btn = s.createButton(50, 50, 120, 40, "Нажми");
Преимущества подхода:
Возвращать this для цепочек
вызовов. Это сохраняет совместимость с нативными методами
Snap.svg, которые поддерживают цепочки.
Проверять тип элемента. Для методов, специфичных
к кругам или прямоугольникам, проверять this.type:
Element.prototype.resize = function(factor) {
if (this.type === "circle") {
this.attr({ r: this.attr("r") * factor });
} else if (this.type === "rect") {
this.attr({
width: this.attr("width") * factor,
height: this.attr("height") * factor
});
}
return this;
};
this.data()).Для сложных плагинов часто требуется доступ к дочерним элементам группы. Snap.svg предоставляет методы:
this.select(selector) — выбирает первый подходящий
элемент внутри группы.this.selectAll(selector) — выбирает все элементы,
соответствующие селектору.this.data(key, value) — сохраняет пользовательские
данные для элемента.Пример: кнопка с внутренней иконкой:
Paper.prototype.createIconButton = function(x, y, size, iconPath) {
var rect = this.rect(x, y, size, size, 8, 8).attr({ fill: "#3498db" });
var icon = this.path(iconPath).attr({ fill: "#fff" }).transform(`t${x + size/4},${y + size/4} s0.5`);
var group = this.group(rect, icon);
group.click(function() {
rect.animate({ fill: "#2980b9" }, 200);
});
group.data("icon", icon);
return group;
};
Добавление пользовательских методов в Snap.svg позволяет:
Правильное использование Snap.plugin,
Element.prototype и Paper.prototype делает
Snap.svg гибкой платформой для профессиональной работы с интерактивной
SVG-графикой.