В основе работы с библиотекой Snap.svg лежит структура документа SVG, представляющая собой дерево узлов. Каждый элемент может содержать вложенные элементы, образуя иерархию. Родительские элементы выступают контейнерами, которые управляют своими потомками: их положением, трансформациями, стилями и порядком отображения.
В Snap.svg работа с родительскими элементами осуществляется через специальные методы и объекты, позволяющие создавать, модифицировать и перемещать элементы внутри структуры.
Любая работа начинается с создания SVG-контейнера:
var s = Snap(600, 400);
Этот объект s представляет корневой элемент
<svg>, который уже является родителем для всех
создаваемых внутри элементов.
Создание базовых фигур автоматически делает их потомками текущего контейнера:
var circle = s.circle(100, 100, 50);
var rect = s.rect(200, 50, 100, 100);
Оба элемента (circle, rect) становятся
дочерними элементами корневого SVG.
group)Одним из ключевых механизмов управления родительскими элементами
является группировка через метод group() или
g():
var group = s.group(circle, rect);
Теперь group становится родителем для
circle и rect.
Альтернативный вариант:
var group = s.g();
group.add(circle, rect);
Группы могут содержать другие группы, формируя многоуровневую иерархию:
var group1 = s.group(circle);
var group2 = s.group(rect);
var parentGroup = s.group(group1, group2);
Такая структура позволяет:
group.add(s.circle(50, 50, 20));
circle.remove();
group.clear();
Удаляются все дочерние элементы.
Snap.svg позволяет менять родителя элемента:
var newGroup = s.group();
newGroup.append(circle);
Теперь circle принадлежит newGroup.
Методы:
append() — добавляет в конец списка детейprepend() — добавляет в началоВ SVG порядок элементов определяется их положением в DOM:
Изменение порядка:
circle.toFront();
rect.toBack();
Одна из главных причин использования групп — возможность применять трансформации ко всем потомкам:
group.transform("translate(100, 50) scale(1.5)");
Все вложенные элементы:
Это значительно упрощает работу с комплексными сценами.
Некоторые SVG-атрибуты наследуются от родителя:
group.attr({
fill: "red"
});
Все дочерние элементы получат красный цвет, если у них не задан
собственный fill.
Важно:
Каждый элемент знает своего родителя:
var parent = circle.parent();
Это позволяет:
Методы поиска:
group.select("circle");
group.selectAll("rect");
Ограничение области поиска текущим родителем позволяет:
paper и
rootВ Snap.svg различаются:
paper — объект, через который создаются элементыroot — корневой SVG-узелvar root = s.node;
paper управляет созданием, а root —
структурой DOM.
Клонирование родительского элемента копирует всю вложенную структуру:
var clone = group.clone();
Особенности:
Родитель может задавать маску или clipping:
group.attr({
mask: maskElement
});
Все дочерние элементы будут ограничены этой маской.
var s = Snap(800, 600);
var sky = s.rect(0, 0, 800, 300).attr({ fill: "#87CEEB" });
var ground = s.rect(0, 300, 800, 300).attr({ fill: "#228B22" });
var sun = s.circle(700, 100, 50).attr({ fill: "yellow" });
var houseBase = s.rect(300, 300, 200, 150).attr({ fill: "#8B4513" });
var roof = s.polygon([300,300, 400,200, 500,300]).attr({ fill: "#A52A2A" });
var house = s.group(houseBase, roof);
var scene = s.group(sky, ground, sun, house);
Иерархия:
scene
sky
ground
sun
house
houseBaseroofТакой подход:
События можно назначать на группу:
group.click(function() {
console.log("Группа нажата");
});
Срабатывает при клике на любой дочерний элемент.
Группы помогают:
Особенно важно при:
1. Потеря ссылки на элемент
group.add(s.circle(...));
Без сохранения переменной элемент становится трудно управляемым.
2. Неожиданные трансформации Если родитель трансформирован, дочерние элементы наследуют это поведение.
3. Неправильный порядок отрисовки Добавление элементов в неправильной последовательности приводит к перекрытию.
При разработке сложных интерфейсов часто используется:
Пример:
Каждый слой — отдельная группа.
Родительские элементы в Snap.svg:
Без использования иерархии и групп невозможно создать сложные и управляемые SVG-композиции.