В Snap.svg маска — это графический элемент, который управляет прозрачностью и видимостью других элементов. Маска работает как фильтр: белые области маски делают объект полностью видимым, чёрные — полностью прозрачным, а оттенки серого создают промежуточную прозрачность.
Для создания маски используется метод mask(), который
применяется к элементу:
var s = Snap(400, 400);
var rect = s.rect(0, 0, 200, 200).attr({fill: "#3498db"});
var maskRect = s.rect(50, 50, 100, 100).attr({fill: "#fff"});
rect.attr({mask: maskRect});
В этом примере создаётся прямоугольник rect, к которому
применяется маска maskRect. Видимой остаётся только область
маски, залитая белым цветом.
Маска может состоять из нескольких элементов, объединённых в группу:
var s = Snap(400, 400);
var circle = s.circle(200, 200, 150).attr({fill: "#e74c3c"});
var maskGroup = s.group();
maskGroup.add(s.rect(100, 100, 200, 200).attr({fill: "#fff"}));
maskGroup.add(s.circle(200, 200, 50).attr({fill: "#000"}));
circle.attr({mask: maskGroup});
В данном случае видимой будет часть круга, покрытая белым прямоугольником, за исключением внутреннего круга, который создаёт «отверстие» в маске.
Ключевой момент: элементы маски работают по принципу наложения — белый = видимо, черный = невидимо, серый = полупрозрачно.
Для создания плавного эффекта можно использовать градиенты в масках.
Градиент задаётся с помощью Snap.gradient() или атрибутов
fill с линейным или радиальным градиентом:
var s = Snap(400, 400);
var rect = s.rect(0, 0, 400, 400).attr({fill: "#2ecc71"});
var gradient = s.rect(0, 0, 400, 400).attr({
fill: s.gradient("L(0,0,1,0)#fff-#000")
});
rect.attr({mask: gradient});
Белый край градиента остаётся полностью видимым, а черный — полностью скрывает элемент. Плавное изменение оттенков создаёт эффект постепенной прозрачности.
Маски можно анимировать так же, как и обычные элементы SVG. Это позволяет создавать динамические визуальные эффекты, например, «проявление» элемента:
var s = Snap(400, 400);
var rect = s.rect(0, 0, 400, 400).attr({fill: "#9b59b6"});
var maskRect = s.rect(0, 0, 0, 400).attr({fill: "#fff"});
rect.attr({mask: maskRect});
maskRect.animate({width: 400}, 2000, mina.easeinout);
Здесь маска увеличивает свою ширину от 0 до 400 пикселей, постепенно открывая объект.
Маски можно применять не только к отдельным объектам, но и к группам
элементов. Для этого создаётся группа с помощью s.group(),
после чего маска назначается всей группе:
var s = Snap(400, 400);
var group = s.group();
group.add(s.circle(100, 200, 50).attr({fill: "#f1c40f"}));
group.add(s.rect(150, 150, 100, 100).attr({fill: "#e67e22"}));
var mask = s.rect(50, 50, 200, 200).attr({fill: "#fff"});
group.attr({mask: mask});
Всё содержимое группы будет отображаться только в пределах маски. Этот подход особенно полезен для сложных композиций и интерфейсных элементов.
Snap.svg позволяет использовать изображения в качестве масок. Для
этого создаётся элемент <image> и применяется как
маска:
var s = Snap(400, 400);
var img = s.image("background.jpg", 0, 0, 400, 400);
var maskImg = s.image("mask.png", 0, 0, 400, 400);
img.attr({mask: maskImg});
Белые участки изображения маски будут показывать основной объект, а чёрные — скрывать. Такой метод позволяет создавать очень реалистичные эффекты с текстурами и фотографиями.
Маски можно сочетать с фильтрами для усиления визуального эффекта. Например, маска может задавать форму, а фильтр — размытость или цветовую коррекцию:
var s = Snap(400, 400);
var rect = s.rect(0, 0, 400, 400).attr({fill: "#1abc9c"});
var mask = s.circle(200, 200, 100).attr({fill: "#fff"});
rect.attr({mask: mask});
var blur = rect.filter(Snap.filter.blur(5, 5));
rect.attr({filter: blur});
Эффект маски и фильтра объединяется: видимая область остаётся ограниченной формой маски, при этом применяется размытие к видимому участку.
Маски в Snap.svg — мощный инструмент управления видимостью объектов, от простых прямоугольных областей до сложных анимированных эффектов с градиентами и текстурами.