В Snap.svg группы (элемент <g>) позволяют
объединять несколько элементов SVG для совместного управления их
атрибутами и трансформациями. Группировка обеспечивает удобство при
анимации, перемещении и стилизации связанных объектов.
var s = Snap(800, 600);
var circle = s.circle(100, 100, 50);
var rect = s.rect(50, 50, 100, 100);
var group = s.group(circle, rect);
В этом примере создается круг и прямоугольник, после чего оба
элемента объединяются в группу group.
Группы в Snap.svg наследуют большинство стандартных SVG-атрибутов, включая:
group.attr({
transform: "translate(200, 50) rotate(45)",
opacity: 0.7,
fill: "#3498db",
stroke: "#2980b9",
strokeWidth: 4
});
translate(x, y) перемещает всю группу на заданные
координаты.rotate(angle, cx, cy) вращает группу относительно точки
(cx, cy). Если точки не заданы, используется центр
координат SVG.opacity устанавливает прозрачность сразу всех элементов
группы.fill и stroke применяются к элементам, не
имеющим собственных значений этих атрибутов.Группы позволяют задавать атрибуты одновременно для нескольких элементов. Если отдельный элемент внутри группы уже имеет свой атрибут, атрибут группы не перекрывает его. Например:
var circle2 = s.circle(200, 100, 50).attr({ fill: "red" });
var rect2 = s.rect(150, 50, 100, 100);
var group2 = s.group(circle2, rect2);
group2.attr({ fill: "green" });
В результате прямоугольник получит зеленый цвет, а круг останется красным. Это позволяет использовать группы для базовой стилизации, не нарушая индивидуальные настройки элементов.
Трансформации в Snap.svg работают одинаково для одиночных элементов и для групп. Преимущество групп заключается в том, что трансформации применяются ко всем дочерним элементам сразу.
group.transform("s1.5 r30 t100,50");
s1.5 – масштабирование группы в 1.5 раза.r30 – вращение на 30 градусов.t100,50 – смещение группы по оси X на 100 и по оси Y на
50.Важно помнить, что трансформации группы суммируются с трансформациями элементов внутри неё.
Snap.svg поддерживает анимацию групп с помощью метода
.animate():
group.animate({ transform: "t300,0" }, 2000, mina.easeinout);
Все элементы внутри группы плавно переместятся на 300 пикселей по оси
X за 2 секунды с эффектом ease-in-out. Использование групп
упрощает создание сложных анимаций для нескольких объектов
одновременно.
Группа в Snap.svg позволяет управлять не только всей группой, но и отдельными элементами через методы:
.selectAll() – возвращает массив всех дочерних
элементов..forEach() – применяет функцию к каждому дочернему
элементу.group.forEach(function(el){
el.attr({ stroke: "#e74c3c" });
});
В этом примере все элементы внутри группы получают красную обводку, при этом можно модифицировать каждый элемент индивидуально или массово.
К группам можно добавлять CSS-классы для управления стилями через внешние таблицы стилей:
group.addClass("highlighted");
В CSS можно задать свойства для класса:
.highlighted {
fill: yellow;
stroke: black;
stroke-width: 2;
}
Это позволяет создавать динамическое оформление без необходимости напрямую менять атрибуты через JavaScript.
Snap.svg поддерживает вложенные группы, что позволяет создавать сложные структуры:
var subGroup = s.group(s.circle(0,0,20), s.rect(-10,-10,20,20));
var mainGroup = s.group(subGroup, s.text(50,50,"Label"));
mainGroup.attr({ transform: "translate(100,100)" });
Трансформация mainGroup применяется ко всем элементам,
включая подгруппу, сохраняя относительное расположение дочерних
элементов.
Группы в Snap.svg являются мощным инструментом для организации, трансформации и стилизации SVG-графики. Правильное использование атрибутов групп позволяет создавать сложные анимации и динамичные интерфейсы, сохраняя код компактным и управляемым.