Тенденция дизайнеров использовать в своих проектах маски для элементов не перестает быть актуальной, не зависимо от того, Photoshop это или Figma. В этих редакторах маски являются своего рода трафаретом, областью которого ограничен блок и его содержимое. Кроме того, в качестве маски может быть градиентный эффект, наложение цвета и многое другое. И для реализации такой красоты с помощью верстки приходилось использовать средства SVG, Canvas или просто сохранять объект как картинку.

Но сейчас другое время и стремительно развивающийся CSS обзавелся своими механизмами обрезки контента по заданному шаблону - CSS маскингом, принцип действия которого основан на альфа-канале изображения. Сложные формы (они же маски) можно указать с помощью стилей и наложить их на необходимый элемент.

Примеры того, как можно использовать маскинг для элементов в верстке:

sunflower
city

Как добавить CSS маску

Для начала стоит упомянуть, что в верстке обрезать элемент по шаблону (т.е. наложить маску) можно тремя способами: с помощью элемента SVG <mask>, с помощью CSS-свойства clip-path и с помощью свойства mask. Последний - это как раз тот, о котором и идет речь в этой статье.

CSS маски используются преимущественно для изображений и градиентов, чем по своим значениям очень схожи со свойством background. Полноценный эффект масок достигается путем комбинации соответствующих свойств, имеющих подобный синтаксис:

.element {
  -webkit-mask-image: url(mask.png);
  -webkit-mask-size: 100%;
  -webkit-mask-repeat: no-repeat;
  /* остальные свойства также начинаются с -webkit-mask-  */
}

Свойства написаны с префиксом, т.к. на данный момент поддержка их браузерами частичная и требует префиксы.

Поддержка браузерами
chrome
Chrome
4
firefox
Firefox
53
internet explorer
IE
 
edge
Edge
18
safari
Safari
15.4
opera
Opera
15

Ниже рассмотрим наиболее важные из свойств маскинга.

Свойство mask-image

Это главное свойство маскинга. В качестве его значения мы можем указать адрес картинки или градиент, которые и будут обрезать элемент. Принцип действия свойства - умножения альфа-канала маски на альфа-канал изображения.

В качестве картинки может быть png-файл или svg-файл.

.element {
  mask-image: image(url(mask.png));  /* маской будет непрозрачная часть png-файла */
  mask-image: image(url(mask.svg));  /* маской будет залитая часть svg-файла */
}

В качестве градиентной маски может быть указан любой из типов градиентов с соответствующими параметрами.

.element {
  mask-image: linear-gradient(to bottom, #000, transparent);  /* градиент сверху-вниз от непрозрачного к прозрачному */
  mask-image: radial-gradient(#000, transparent);  /* круговой градиент из центра от непрозрачного к прозрачному */
  mask-image: radial-gradient(ellipse 50% 50% at 0 0, transparent 100%, #000 0);  /* круговой градиент с резким переходом */
  mask-image: conic-gradient(#000 25%, transparent 100%);  /* конический градиент по часовой стрелке */
}

Свойства формирования маски

Для более точного указания деталей маски в связке с mask-image используют дополнительные свойства:

  • mask-repeat - указывает, будет ли маска повторяться или нет; значения аналогичные свойству background-repeat
  • mask-size - определяет размеры маски; значения аналогичные свойству background-size
  • mask-position - задает координаты маски; значения аналогичные свойству background-position

Свойства mask-clip и mask-origin

Значения этих свойств определяет, на какую область элемента будет влиять маскинг. mask-origin выполняет роль mask-clip плюс меняет свою исходную позицию. Наиболее часто используемые значения:

  mask-clip mask-origin
border-box (значение по-умолчанию) маска захватит всю блочную модель элемента позиция обрезки относительно рамки
padding-box маска вырежет рамку и применится к остальной части элемента позиция обрезки относительно внутреннего отступа
content-box маска вырежет место, занимаемое рамкой и внутренним отступ и применится к содержимому элемента позиция обрезки относительно содержимого

Заключение

Спецификация CSS-маскинга находится в стадии активного развития и с успехом внедряется браузерами для поддержки. Рассмотренные выше свойства являются наиболее часто применяемыми и уже пользуются успехом в веб-разработке. Не за горами развитие других свойств, таких как mask-attachment, mask-composite, mask-box-image и других.