В Snap.svg группировка элементов осуществляется с
помощью объекта g(). Группа позволяет объединять несколько
элементов SVG в один контейнер, что делает возможным их совместное
преобразование, управление стилями и применение эффектов.
var s = Snap("#svg");
var circle = s.circle(50, 50, 40).attr({fill: "red"});
var rect = s.rect(30, 30, 60, 60).attr({fill: "blue"});
var group = s.group(circle, rect);
В данном примере создаётся группа group, содержащая круг
и квадрат. Любое преобразование, применённое к group, будет
действовать на все её элементы одновременно:
group.transform('t100,50 r45');
Здесь t100,50 — это сдвиг на 100px по X и 50px по Y, а
r45 — поворот на 45 градусов относительно центра
группы.
Маска (mask) в SVG позволяет управлять видимостью частей объекта. В
Snap.svg маски создаются с помощью метода mask(), который
принимает элемент или группу, определяющую форму маски. Белые участки
маски остаются видимыми, черные — скрываются.
var circleMask = s.circle(50, 50, 40).attr({fill: "#fff"});
var maskGroup = s.group(circleMask);
var rect = s.rect(0, 0, 100, 100).attr({fill: "blue"});
rect.attr({mask: maskGroup});
В этом примере только часть квадрата, которая совпадает с кругом маски, будет видимой.
Группы и маски можно использовать совместно для сложного управления видимостью и трансформациями. Маска может быть применена ко всей группе, а не только к отдельным элементам:
var s = Snap("#svg");
var circle = s.circle(50, 50, 40).attr({fill: "red"});
var rect = s.rect(30, 30, 60, 60).attr({fill: "green"});
var ellipse = s.ellipse(70, 70, 20, 40).attr({fill: "yellow"});
var group = s.group(circle, rect, ellipse);
var maskShape = s.rect(40, 40, 50, 50).attr({fill: "#fff"});
var mask = s.group(maskShape);
group.attr({mask: mask});
В этом примере маска применяется ко всей группе из трёх элементов. В результате видимой остаётся только та часть группы, которая пересекается с прямоугольником маски.
Snap.svg позволяет анимировать не только отдельные элементы, но и целые группы с масками. Маска остаётся привязанной к группе, что обеспечивает динамическое управление видимостью при трансформациях.
group.animate({transform: 't100,0'}, 2000, mina.easeinout);
maskShape.animate({transform: 't50,50'}, 2000, mina.easeinout);
Здесь одновременно анимируется и группа, и маска, создавая эффект «движущейся видимой области».
var maskPart1 = s.circle(50, 50, 30).attr({fill: "#fff"});
var maskPart2 = s.rect(60, 60, 30, 30).attr({fill: "#fff"});
var complexMask = s.group(maskPart1, maskPart2);
group.attr({mask: complexMask});
Можно назначить маску только одному элементу внутри группы, не затрагивая остальные:
circle.attr({mask: maskPart1});
Остальные элементы группы остаются видимыми без изменений.
Snap.svg поддерживает вложенные группы, каждая из которых может иметь собственную маску. Вложение позволяет создавать сложные композиции с независимым управлением видимостью и трансформациями.
var innerGroup = s.group(s.circle(20, 20, 10).attr({fill: "pink"}));
var outerGroup = s.group(innerGroup, s.rect(0, 0, 50, 50).attr({fill: "orange"}));
var maskOuter = s.rect(10, 10, 40, 40).attr({fill: "#fff"});
outerGroup.attr({mask: maskOuter});
Здесь внутренняя группа анимируется или трансформируется независимо, но маска применяется ко всей внешней группе.
group.add(element) — добавляет элемент в группу после
её создания.group.remove(element) — удаляет элемент из группы.group.selectAll("circle") — выбирает все элементы типа
circle внутри группы.group.attr({mask: mask}) — назначает маску на всю
группу.element.attr({mask: mask}) — назначает маску на
отдельный элемент.Использование этих методов в комбинации с трансформациями и анимациями позволяет создавать динамичные, интерактивные и сложные SVG-сцены.