В Snap.svg основной элемент для работы — это
SVG-контейнер, который создается через функцию
Snap(). Контейнер является точкой входа для всех
графических объектов и обеспечивает управление их жизненным циклом.
Пример создания контейнера:
var s = Snap("#svgElement"); // существующий элемент SVG в DOM
var s = Snap(800, 600); // создание нового SVG с указанными размерами
Контейнер автоматически управляет DOM-элементами, упрощая добавление и удаление графических объектов. Важно помнить, что без привязки к контейнеру объекты не будут отображаться в документе.
Создание графических объектов осуществляется методами контейнера:
rect(x, y, width, height) — прямоугольникcircle(cx, cy, r) — окружностьellipse(cx, cy, rx, ry) — эллипсline(x1, y1, x2, y2) — линияpath(pathString) — произвольный путьКаждый элемент можно сохранять в переменную для дальнейшего управления:
var circle = s.circle(100, 100, 50);
circle.attr({
fill: "#3498db",
stroke: "#2980b9",
strokeWidth: 5
});
Все элементы являются объектами Snap, что позволяет применять методы анимации, трансформации и событий.
Для управления жизненным циклом объектов используются методы
append(), prepend() и
remove().
var rect = s.rect(50, 50, 200, 100);
s.append(rect); // добавить в конец контейнера
rect.remove(); // удалить из контейнера и DOM
Удаление объекта освобождает ресурсы, но ссылки на него в памяти
остаются, пока есть переменные. Для полной очистки необходимо удалить
все ссылки и вызвать remove().
Для коллективного управления элементами применяется
группа (group):
var g = s.group();
var c1 = s.circle(50, 50, 30);
var c2 = s.circle(150, 50, 30);
g.add(c1, c2);
Группы позволяют:
Удаление группы удаляет все вложенные элементы:
g.remove();
Snap.svg предоставляет методы для управления состоянием элементов:
transform(t) — установка трансформацииtranslate(x, y) — перемещениеrotate(deg, cx, cy) — вращениеscale(sx, sy, cx, cy) — масштабированиеТрансформации можно комбинировать:
circle.transform("t100,50 r45 s1.5,1.5");
Все трансформации применяются по отношению к текущему состоянию элемента, поэтому важно отслеживать порядок операций при сложных анимациях.
Snap.svg содержит мощный модуль анимации через метод
animate():
circle.animate({ cx: 300, fill: "#e74c3c" }, 1000, mina.easeinout);
Параметры:
mina.linear,
mina.easein, mina.bounce)Анимации интегрированы в жизненный цикл элементов:
circle.animate({ r: 80 }, 500, mina.easein, function() {
console.log("Анимация завершена");
});
Элементы Snap.svg поддерживают стандартные события DOM:
click, mouseover, mouseout и
др.
circle.click(function() {
this.remove(); // удаление элемента при клике
});
Удаление элемента через события важно для освобождения памяти, особенно при динамическом создании объектов в приложениях с большим количеством графики.
Для управления всем жизненным циклом контейнера можно использовать
метод clear(). Он удаляет все элементы внутри
SVG, сохраняя сам контейнер:
s.clear();
Этот подход удобен при перерисовке сцены или динамическом обновлении графики, не требуя создания нового SVG-контейнера.
remove()clear() для полной очистки сцены перед
повторным рендерингомЭти практики минимизируют утечки памяти и обеспечивают стабильную работу приложений с большим количеством SVG-элементов.
Элементы можно создавать динамически, сохранять в переменные или массивы, а затем повторно использовать:
var shapes = [];
for (var i = 0; i < 5; i++) {
var c = s.circle(50 + i*60, 100, 25);
shapes.push(c);
}
// Массовое удаление
shapes.forEach(function(el) { el.remove(); });
shapes = [];
Такой подход позволяет полностью контролировать жизненный цикл и состояние элементов, включая их удаление, повторное использование и анимацию.
Жизненный цикл объектов Snap.svg строится вокруг контейнера, групп, трансформаций, событий и анимаций, что обеспечивает мощный контроль над созданием, отображением и удалением графики в веб-приложениях.