Snap.svg предоставляет удобный способ работы с группами
элементов, что особенно полезно при организации сложных
SVG-график. Группа () позволяет объединить
несколько объектов, чтобы применять к ним трансформации,
атрибуты и события одновременно. Вложенные группы расширяют
возможности, позволяя создавать иерархические структуры объектов с
общими и индивидуальными свойствами.
var s = Snap("#svgCanvas");
var group1 = s.group();
var rect = s.rect(0, 0, 100, 50).attr({fill: "blue"});
var circle = s.circle(50, 50, 25).attr({fill: "red"});
group1.add(rect, circle);
В этом примере rect и circle объединены в
одну группу. Любая трансформация, примененная к group1,
затронет оба элемента одновременно.
Вложенная группа создается путем добавления одной группы в другую. Это позволяет структурировать SVG как дерево, где родительская группа управляет общей логикой, а дочерние элементы — деталями.
var parentGroup = s.group();
var childGroup = s.group();
var rect1 = s.rect(10, 10, 50, 50).attr({fill: "green"});
var rect2 = s.rect(70, 10, 50, 50).attr({fill: "orange"});
childGroup.add(rect1, rect2);
parentGroup.add(childGroup);
parentGroup.transform("t100,50"); // сдвиг всей структуры
Здесь parentGroup управляет положением всего
содержимого, включая childGroup, который в свою очередь
содержит два прямоугольника.
Snap.svg поддерживает цепочку трансформаций для групп. Трансформации родительской группы автоматически применяются ко всем дочерним объектам, но можно добавлять независимые трансформации на уровне каждой группы или отдельного элемента.
childGroup.transform("r45"); // вращение дочерней группы
parentGroup.transform("t100,50 s1.5"); // масштаб и сдвиг всей структуры
tX,Y — сдвиг (translate)rAngle — вращение (rotate)sFactor — масштаб (scale)Важно понимать порядок применения трансформаций: сначала трансформация дочерней группы, затем родительской.
Группы позволяют задавать атрибуты всем элементам сразу. Атрибуты родительской группы распространяются на дочерние элементы, если они не переопределены у самого элемента.
var group = s.group(
s.rect(0, 0, 40, 40),
s.circle(20, 20, 15)
);
group.attr({stroke: "#000", strokeWidth: 2});
В этом примере оба объекта получают черную обводку толщиной 2
пикселя. Если у одного элемента явно задан другой stroke,
этот стиль останется локальным.
События в Snap.svg можно назначать как отдельным элементам, так и группам. При клике на группу событие срабатывает для всей группы, что удобно для интерактивных компонентов.
group.click(function() {
this.attr({fill: "yellow"}); // перекрасить все элементы группы
});
Если группа содержит вложенные группы, событие родителя затрагивает всю иерархию, но дочерние элементы могут иметь свои собственные обработчики.
Snap.svg предоставляет методы для работы с элементами внутри группы:
group.add(element) — добавление нового элементаgroup.remove(element) — удаление элементаgroup.clear() — удаление всех элементов внутри
группыgroup.select(selector) — выбор элемента по
CSS-селектору внутри группыvar rect = s.rect(0, 0, 30, 30);
childGroup.add(rect);
childGroup.remove(rect); // удаление конкретного элемента
Анимации можно применять к группам целиком, что позволяет создавать сложные движения без изменения отдельных элементов.
parentGroup.animate({transform: "t200,100 r90"}, 1000, mina.easeinout);
Все элементы внутри parentGroup будут одновременно
перемещены и повернуты за одну секунду. Если нужны индивидуальные
анимации для дочерних групп, их можно настроить отдельно.
Вложенные группы особенно полезны для:
Эффективное использование вложенных групп обеспечивает чистую структуру SVG, облегчает управление атрибутами и анимациями, а также повышает читаемость кода.