Snap.svg предоставляет объект Snap, через который
создается SVG-холст:
var s = Snap(800, 600); // создаем холст размером 800x600
Ключевой момент: объект s является
корневым контейнером для всех графических элементов. Любая фигура или
текст создаются как дочерние элементы этого холста.
Создание базовых примитивов:
var circle = s.circle(150, 150, 100); // круг с центром (150,150) и радиусом 100
var rect = s.rect(300, 100, 200, 150); // прямоугольник с координатами (300,100) и размерами 200x150
Присвоение атрибутов выполняется через метод
.attr():
circle.attr({
fill: "#3498db",
stroke: "#2c3e50",
strokeWidth: 5
});
Snap.svg поддерживает гибкую систему трансформаций:
translate, rotate, scale и
matrix. Трансформации можно комбинировать:
rect.transform("t50,50r45s1.5,1.5");
Важно: трансформации можно применять как отдельные шаги, так и в цепочке, что полезно для анимации и сложных сцен.
Snap.svg использует метод .animate() для плавного
изменения свойств элементов:
circle.animate({ cx: 400, cy: 300, r: 50 }, 1000, mina.elastic);
mina.linear,
mina.easeinout, mina.elastic и др.)Для сложных анимаций можно комбинировать .animate() и
колбэки:
circle.animate({ r: 80 }, 500, mina.easein, function() {
this.animate({ fill: "#e74c3c" }, 500);
});
Snap.svg позволяет легко инспектировать структуру элементов:
console.log(circle.node); // выводит DOM-узел SVG
console.log(circle.attr()); // выводит все текущие атрибуты
Методы профилирования:
getBBox() — возвращает габариты элемента
(x, y, width,
height)getCTM() — текущая матрица трансформации, полезна для
проверки комбинаций translate, rotate,
scaleisPointInside(x, y) — проверка попадания точки в
элементПример проверки позиции:
var bbox = rect.getBBox();
console.log(`Ширина: ${bbox.width}, Высота: ${bbox.height}`);
Группы позволяют объединять элементы и управлять ими как единым объектом:
var group = s.group(circle, rect);
group.transform("t100,50"); // перемещает всю группу
.add() — добавляет элемент в группу.remove() — удаляет элемент из группы.forEach(fn) — итерация по всем элементам группыГруппировка облегчает профилирование, так как можно получать общие габариты всей группы:
var groupBBox = group.getBBox();
console.log(groupBBox);
Snap.svg поддерживает фильтры и маски для выделения и тестирования:
var blur = s.filter(Snap.filter.blur(5, 5));
circle.attr({ filter: blur });
Маски позволяют скрывать части элементов для проверки перекрытий:
var maskRect = s.rect(50, 50, 200, 200);
circle.attr({ mask: maskRect });
Snap.svg поддерживает стандартные DOM-события для элементов:
circle.hover(
function() { this.attr({ stroke: "#e67e22" }); },
function() { this.attr({ stroke: "#2c3e50" }); }
);
circle.click(function() {
console.log("Клик по кругу");
});
hover(overFn, outFn) — управление наведениемclick(fn) — обработка кликовdrag(onMove, onStart, onEnd) — интерактивное
перемещение элементаСобытия позволяют визуально профилировать сцену и проверять реакции элементов на действия пользователя.
Для глубокого анализа производительности рекомендуется использовать:
requestAnimationFrame для
синхронизации с циклом рендерингаconsole.time() и console.timeEnd() для
измерения времени выполнения анимаций и операций трансформацииПример измерения времени анимации:
console.time("circleAnimation");
circle.animate({ r: 150 }, 1000, mina.linear, function() {
console.timeEnd("circleAnimation");
});
Для отслеживания динамических изменений атрибутов удобно использовать промежуточные объекты и колбэки:
function logAttrs(element) {
console.log(element.attr());
}
circle.animate({ r: 120 }, 500, mina.easeinout, function() {
logAttrs(this);
});
Это помогает понять последовательность изменений и выявить узкие места в производительности при сложных сценах.
getBBox() и
getCTM() только при необходимостиЭти подходы позволяют не только профилировать, но и повышать общую производительность графических сцен в Snap.svg.