В основе работы с графикой в Snap.svg лежит древовидная структура SVG-документа. Каждый элемент может содержать внутри себя другие элементы — такие элементы называются дочерними. Это позволяет организовывать сложные сцены, группировать объекты и управлять ими как единым целым.
Snap.svg предоставляет удобный API для создания, добавления, перемещения и удаления дочерних элементов, скрывая низкоуровневые детали DOM.
Любой элемент, поддерживающий вложенность (например,
<g>, <svg>), может содержать
дочерние элементы. В Snap.svg это реализуется через методы создания
элементов и добавления их в контейнер.
var paper = Snap(500, 500);
var group = paper.group();
var circle = paper.circle(100, 100, 50);
var rect = paper.rect(150, 150, 100, 50);
group.add(circle, rect);
Ключевые моменты:
group() создает контейнер <g>add() добавляет один или несколько дочерних
элементовМетод add() используется для добавления дочерних
элементов в контейнер.
group.add(element1, element2, ...);
Особенности:
Альтернативный способ добавления — append():
group.append(circle);
Отличие от add():
appendChildУдаление происходит через метод remove():
circle.remove();
Результат:
Для удаления всех дочерних элементов используется метод
clear():
group.clear();
Это полностью очищает контейнер <g> от вложенных
элементов.
Snap.svg позволяет получать доступ к вложенным элементам несколькими способами.
var children = group.children();
Возвращает массив всех дочерних элементов.
var circle = group.select("circle");
var allRects = group.selectAll("rect");
Позволяют находить элементы по CSS-селекторам внутри контейнера.
В SVG порядок элементов в DOM определяет их отображение по оси Z:
Пример:
group.add(circle);
group.add(rect);
В этом случае rect будет поверх circle.
circle.toFront();
Перемещает элемент в конец списка дочерних — он окажется поверх остальных.
rect.toBack();
Перемещает элемент в начало — он окажется под другими.
rect.insertBefore(circle);
circle.insertAfter(rect);
Позволяют точно управлять позицией элемента относительно других.
Группы могут содержать другие группы, создавая иерархию:
var parentGroup = paper.group();
var childGroup = paper.group();
var circle = paper.circle(50, 50, 20);
childGroup.add(circle);
parentGroup.add(childGroup);
Преимущества:
Если применить трансформацию к родительской группе, она автоматически применяется ко всем дочерним элементам:
group.transform("translate(100, 0)");
Все дочерние элементы сместятся на 100 пикселей вправо.
Метод clone() копирует элемент вместе со всеми его
дочерними элементами:
var clone = group.clone();
Важно:
Каждый элемент знает своего родителя:
var parent = circle.parent();
Это позволяет:
group1.add(circle);
group2.add(circle);
После второй строки:
circle автоматически удаляется из
group1group2Метод fragment() позволяет временно собрать набор
элементов:
var frag = Snap.fragment(
'<circle cx="50" cy="50" r="40"/>',
'<rect x="100" y="100" width="50" height="50"/>'
);
group.add(frag);
Преимущества:
Через selectAll() можно выполнять действия над группой
элементов:
group.selectAll("circle").forEach(function(el) {
el.attr({ fill: "red" });
});
Это позволяет:
var paper = Snap(400, 400);
var scene = paper.group();
var sky = paper.rect(0, 0, 400, 200).attr({ fill: "skyblue" });
var ground = paper.rect(0, 200, 400, 200).attr({ fill: "green" });
var house = paper.group();
var base = paper.rect(150, 150, 100, 100);
var roof = paper.polygon([150,150, 200,100, 250,150]);
house.add(base, roof);
scene.add(sky, ground, house);
Здесь формируется иерархия:
scene
sky
ground
house
baseroofТакая структура облегчает управление сценой и делает код логически организованным.
Snap.svg работает поверх SVG DOM, поэтому:
1. Потеря элемента при повторном добавлении
group1.add(circle);
group2.add(circle); // circle исчез из group1
2. Неправильный порядок отображения
group.add(rect);
group.add(circle); // круг перекрывает прямоугольник
3. Попытка работы с удалённым элементом
circle.remove();
circle.attr({ fill: "red" }); // не влияет на DOM
Дочерние элементы можно анимировать как отдельно, так и через родителя:
group.animate({ transform: "scale(1.5)" }, 1000);
Все дочерние элементы будут масштабированы одновременно.
circle(), rect(),
group()add(), append()toFront(),
toBack()select(), selectAll()remove(), clear()forEach()Дочерние элементы являются фундаментом построения сложной графики в Snap.svg, позволяя организовать сцену, управлять ею и масштабировать сложность без потери контроля над структурой.