Snap.svg предоставляет возможность объединять несколько графических
объектов в одну группу (<g>), что
значительно упрощает управление сложными композициями. Группа позволяет
применять трансформации, стили и события ко всем вложенным элементам
одновременно, сохраняя их относительные координаты.
Создание группы выполняется с помощью метода
paper.group(). Пример:
var s = Snap(800, 600);
var rect = s.rect(10, 10, 100, 50);
var circle = s.circle(50, 50, 25);
var group = s.group(rect, circle);
В этом примере rect и circle объединяются в
объект group. Любое последующее действие с
group будет применяться сразу к обоим элементам.
Для динамического управления содержимым группы можно использовать
метод add():
var ellipse = s.ellipse(150, 50, 30, 20);
group.add(ellipse);
Теперь ellipse автоматически наследует все трансформации
и стили группы. Чтобы удалить элемент из группы, используется
exclude():
group.exclude(circle);
После этого circle перестает быть частью группы, но
продолжает существовать на холсте как самостоятельный элемент.
Группы позволяют удобно применять трансформации, которые будут действовать на все вложенные элементы одновременно:
group.transform('t100,50'); — смещает всю группу на 100px
по X и 50px по Y.group.transform('s2'); — увеличивает группу в 2 раза
относительно её центра.group.transform('r45,100,100'); — поворот на 45 градусов
относительно точки (100,100).Важно помнить, что Snap.svg применяет трансформации в виде строки, поддерживая несколько операций одновременно, например:
group.transform('t50,50 r30 s1.5');
Любой стиль, применённый к группе, наследуется всеми её элементами:
group.attr({
fill: '#f06',
stroke: '#000',
strokeWidth: 2
});
В этом примере все объекты внутри группы становятся красными с чёрной рамкой толщиной 2px. Если отдельный элемент внутри группы имеет собственный стиль, он перекрывает стиль группы.
Snap.svg поддерживает создание вложенных групп, что позволяет строить сложные иерархические структуры:
var innerGroup = s.group(s.rect(0, 0, 30, 30), s.circle(15, 15, 10));
var outerGroup = s.group(innerGroup, s.line(0, 0, 50, 50));
Трансформация outerGroup будет распространяться на все
вложенные элементы, включая innerGroup, сохраняя внутренние
пропорции и относительные позиции объектов.
На группу можно назначать обработчики событий, которые срабатывают при взаимодействии с любым её элементом:
group.click(function() {
this.attr({fill: '#0f0'});
});
При клике на любой элемент внутри группы весь набор объектов изменит цвет заливки на зелёный. Это особенно полезно при создании интерактивных интерфейсов и сложных анимаций.
Snap.svg позволяет анимировать группы целиком с помощью метода
animate():
group.animate({ transform: 't200,0 r360' }, 2000, mina.easeinout);
В течение 2 секунд группа переместится на 200px по X и выполнит полный оборот на 360°. При этом все вложенные элементы сохраняют свои относительные координаты.
Группы в Snap.svg — мощный инструмент для создания динамических, интерактивных и структурированных графических сцен, позволяющий значительно сократить код и повысить управляемость элементов.