В библиотеке SVG.js маски и clipping позволяют управлять видимостью элементов, создавая эффекты обрезки и скрытия частей графики. Они широко применяются для создания сложных визуальных эффектов, динамических анимаций и интерактивной графики.
Маска определяет, какие части элемента будут видимыми. В отличие от clipping, маска может использовать градиенты и полупрозрачность, создавая плавные переходы между видимыми и скрытыми областями.
Маска создается с помощью метода .maskWith() или через
объект mask().
const draw = SVG().addTo('body').size(400, 400);
// Основной элемент
const rect = draw.rect(300, 200).fill('#f06');
// Создание маски
const mask = draw.mask();
mask.circle(100).fill('#fff').move(50, 50); // белая область будет видимой
// Применение маски
rect.maskWith(mask);
Маски в SVG.js можно изменять в реальном времени, что удобно для анимаций:
mask.clear(); // удаляет все содержимое маски
mask.rect(150, 150).fill('#fff').move(75, 25); // новая область видимости
Это позволяет анимировать появление и исчезновение элементов, управляя формой маски.
Clipping обрезает элемент по форме другой фигуры. В отличие от маски, clipping работает только по контуру и не учитывает прозрачность внутри фигуры.
const draw = SVG().addTo('body').size(400, 400);
const rect = draw.rect(300, 200).fill('#0f9');
const clip = draw.rect(150, 150).move(75, 25); // форма обрезки
rect.clipWith(clip);
Clipping можно менять на лету, аналогично маскам:
const newClip = draw.circle(100).move(100, 50);
rect.clipWith(newClip);
| Свойство | Маска | Clipping |
|---|---|---|
| Поддержка прозрачности | Да | Нет |
| Основной эффект | Плавная видимость | Жесткая обрезка |
| Использование градиентов | Да | Нет |
| Анимации | Да, легко | Да, но только по контуру |
Оба метода можно применять к группам элементов, что позволяет создавать комплексные эффекты:
const group = draw.group();
group.rect(100, 100).fill('#f00').move(0, 0);
group.circle(50).fill('#00f').move(50, 50);
const mask = draw.mask();
mask.rect(150, 150).fill('#fff');
group.maskWith(mask);
Для clipping используется аналогичный подход:
const clip = draw.rect(120, 120).move(30, 30);
group.clipWith(clip);
Маски идеально подходят для создания анимаций с постепенным появлением или исчезновением элементов:
const circle = draw.circle(100).fill('#ff0').move(50, 50);
const mask = draw.mask();
const animRect = mask.rect(0, 100).fill('#fff').move(0, 0);
circle.maskWith(mask);
animRect.animate(2000).width(100); // плавное открытие круга
Эффект достигается за счет анимирования формы маски, при этом основной элемент остается неизменным.
SVG.js поддерживает вложенные маски: маска может содержать другие маски или быть применена к группе с уже существующими масками. Это расширяет возможности для сложных визуальных композиций и креативных эффектов.
const mask1 = draw.mask().rect(100, 100).fill('#fff');
const mask2 = draw.mask().circle(50).fill('#fff');
mask1.add(mask2);
rect.maskWith(mask1);
Маски и clipping в SVG.js открывают практически неограниченные возможности для создания динамичной, интерактивной и визуально выразительной графики на веб-странице. Их правильное применение позволяет реализовать сложные визуальные эффекты без использования сторонних библиотек и тяжелых растровых изображений.