Инвертированные маски позволяют создавать эффект, при котором видимой остаётся область, не совпадающая с формой маски, а всё остальное становится прозрачным или скрытым. В отличие от обычных масок, где показывается только совпадающая часть, инвертированные маски открывают новые возможности для динамической визуализации и интерактивной графики.
Snap.svg не предоставляет прямого свойства invert для
масок, поэтому эффект инверсии достигается комбинацией маски и
дополнительного прямоугольника, покрывающего всю область
SVG.
var s = Snap("#svgContainer");
var mask = s.mask();
var fullRect = s.rect(0, 0, s.attr("width"), s.attr("height")).attr({
fill: "#fff"
});
mask.add(fullRect);
var circle = s.circle(150, 150, 50).attr({
fill: "#000"
});
mask.add(circle);
var rect = s.rect(0, 0, 300, 300).attr({
fill: "red"
});
rect.attr({ mask: mask });
В результате будет виден красный прямоугольник с прозрачной областью в форме круга, что создаёт эффект инвертированной маски.
Инвертированные маски отлично подходят для анимаций и интерактивных элементов. Например, можно анимировать круг, «вытирающий» часть фона:
circle.animate({ r: 100 }, 1000, mina.easeinout);
Эта анимация автоматически обновит маску, показывая изменяющийся вырез.
Для сложных фигур вместо простых примитивов (circle,
rect, ellipse) можно использовать путь
(path):
var star = s.path("M150,100 L160,140 L200,150 L160,160 L150,200 L140,160 L100,150 L140,140 Z").attr({
fill: "#000"
});
mask.add(star);
Инвертирование достигается тем же принципом: белый фон плюс фигура, вырезающая видимую область.
Snap.svg позволяет комбинировать несколько инвертированных масок. Для
этого создаются несколько масок и применяются к разным элементам или
объединяются через <g>:
var maskGroup = s.group();
maskGroup.add(fullRect);
maskGroup.add(circle);
maskGroup.add(star);
mask.attr({ mask: maskGroup });
Такой подход позволяет создавать сложные эффекты с несколькими «окнами» прозрачности.
Использование маски с большим количеством сложных фигур может замедлять рендеринг. Для интерактивных анимаций рекомендуется:
.attr() вместо полной
пересборки маски.В мобильных браузерах и на слабых устройствах инвертированные маски могут потреблять больше ресурсов, чем обычные. В таких случаях стоит ограничивать размер маски или заранее отрисовывать статические участки.
fill: "#fff" для полного
покрытия.Snap.svg поддерживает плавную анимацию атрибутов элементов маски. Например, можно создавать эффект «раздвигающейся тени»:
circle.animate({ cx: 200, cy: 200, r: 80 }, 1500, mina.elastic);
mina позволяет управлять кривой анимации:
mina.linear, mina.easein,
mina.elastic и др.Инвертированные маски удобно применять для:
Для удобства управления масками стоит создавать их в отдельной функции или объекте, чтобы можно было динамически добавлять и удалять фигуры без пересоздания всего SVG.
Инвертированные маски в Snap.svg открывают широкие возможности для создания динамической, интерактивной и визуально выразительной графики, особенно при сочетании с анимацией и сложными формами.