В библиотеке Snap.svg маски позволяют управлять видимостью элементов
SVG, создавая сложные эффекты прозрачности и вырезов. Маска задается
через элемент <mask>, который содержит один или
несколько элементов с заливкой или контуром. Основная идея заключается в
том, что белые области маски делают объект видимым, а
черные — полностью скрытым, промежуточные оттенки
создают полупрозрачные зоны.
var s = Snap(400, 400);
var rect = s.rect(50, 50, 300, 300).attr({fill: 'red'});
var mask = s.rect(0, 0, 400, 400).attr({
fill: '#fff'
});
var circle = s.circle(200, 200, 100).attr({
fill: '#000'
});
var maskGroup = s.group(mask, circle);
rect.attr({mask: maskGroup});
В этом примере красный прямоугольник частично скрыт черным кругом, создавая эффект «вырезанной» области.
Маска может включать несколько объектов, комбинируя фигуры разной
формы. Используется s.group() для объединения элементов и
назначение его через атрибут mask:
var mask = s.group(
s.circle(150, 150, 50).attr({fill: '#fff'}),
s.rect(200, 200, 100, 100).attr({fill: '#fff'}),
s.ellipse(300, 100, 40, 80).attr({fill: '#fff'})
);
var target = s.rect(50, 50, 350, 300).attr({fill: 'blue'});
target.attr({mask: mask});
Такой подход позволяет создавать сложные, многослойные маски, где несколько форм объединяются для управления прозрачностью целевого объекта.
Snap.svg поддерживает градиенты внутри масок, что позволяет создавать
плавные переходы от видимого к скрытому. Для этого можно использовать
Snap.gradient() и устанавливать атрибут fill с
градиентом:
var gradient = s.gradient("L(0,0,0,1)#fff-#000");
var maskRect = s.rect(0, 0, 400, 400).attr({fill: gradient});
var target = s.rect(50, 50, 300, 300).attr({fill: 'green'});
target.attr({mask: maskRect});
Белый верхний край маски полностью открывает объект, черный нижний — скрывает, а промежуточные оттенки создают плавное затемнение.
Snap.svg позволяет анимировать элементы маски, создавая динамические эффекты. Например, перемещающийся круг может «открывать» объект по траектории:
var target = s.rect(50, 50, 300, 300).attr({fill: 'orange'});
var maskCircle = s.circle(0, 150, 50).attr({fill: '#fff'});
var mask = s.group(maskCircle);
target.attr({mask: mask});
maskCircle.animate({cx: 400}, 3000, mina.linear);
При таком подходе эффект маски обновляется в реальном времени, создавая анимацию открытия или скрытия объекта.
Маски отлично работают с кривыми и сложными путями. Для этого
используется элемент <path> с координатами и
заливкой. Например:
var path = s.path("M50,150 C150,50 250,250 350,150").attr({fill: '#fff'});
var target = s.rect(0, 0, 400, 400).attr({fill: 'purple'});
var mask = s.group(path);
target.attr({mask: mask});
Такой подход позволяет создавать маски любых форм, включая волнистые линии, абстрактные фигуры или контурные узоры.
Маски в Snap.svg могут быть использованы совместно с фильтрами, такими как размытие или тени, для создания сложных визуальных эффектов:
var target = s.rect(50, 50, 300, 300).attr({fill: 'cyan'});
var maskCircle = s.circle(200, 200, 100).attr({fill: '#fff'}).filter(Snap.filter.blur(5));
var mask = s.group(maskCircle);
target.attr({mask: mask});
Размытие маски создаёт мягкие границы видимой области, что позволяет плавно смешивать объекты.
s.group() упрощает управление маской.animate(): динамическое
изменение маски создаёт эффект перемещающейся «лампы», освещающей
объект.Маски в Snap.svg — это мощный инструмент для создания визуально выразительных эффектов, контролирующих видимость элементов через комбинирование цвета, формы и прозрачности.