CSS-свойство `mask`
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в разных версиях браузеров. Она доступна во всех браузерах с декабря 2023 года.
mask — CSS-свойство короткой записи, которое скрывает элемент (полностью или частично), маскируя или обрезая указанную область изображения. Это короткая запись для всех свойств mask-*. Свойство принимает одно или несколько значений, разделённых запятыми; каждое значение соответствует <mask-layer>.
Составные свойства
Это свойство является короткой записью для следующих свойств CSS:
Синтаксис
/* Keyword values */
mask: none;
/* Image values */
mask: url("mask.png"); /* Raster image used as mask */
mask: url("masks.svg#star"); /* SVG used as mask */
/* Combined values */
mask: url("masks.svg#star") luminance; /* Luminance mask */
mask: url("masks.svg#star") 40px 20px; /* Mask positioned 40px from the top and 20px from the left */
mask: url("masks.svg#star") 0 0/50px 50px; /* Mask with a width and height of 50px */
mask: url("masks.svg#star") repeat-x; /* Horizontally-repeated mask */
mask: url("masks.svg#star") stroke-box; /* Mask extends to the inside edge of the stroke box */
mask: url("masks.svg#star") exclude; /* Mask combined with background using non-overlapping parts */
/* Multiple masks */
mask:
url("masks.svg#star") left / 16px repeat-y,
/* 16px-wide mask on the left side */ url("masks.svg#circle") right / 16px
repeat-y; /* 16px-wide mask against right side */
/* Global values */
mask: inherit;
mask: initial;
mask: revert;
mask: revert-layer;
mask: unset;
Значения
-
<mask-layer> - Один или несколько слоёв маски, разделённых запятыми и состоящих из следующих компонентов:
-
<mask-reference> - Задаёт источник изображения маски. См.
mask-image. -
<masking-mode> - Задаёт режим маскирования изображения маски. См.
mask-mode. -
<position> - Задаёт положение изображения маски. См.
mask-position. -
<bg-size> - Задаёт размер изображения маски. См.
mask-size. -
<repeat-style> - Задаёт повторение изображения маски. См.
mask-repeat. -
<geometry-box> - Если указано только одно значение
<geometry-box>, оно задаёт значения свойствmask-originиmask-clip. Если указаны два значения<geometry-box>, первое задаётmask-origin, а второе —mask-clip. -
<geometry-box> | no-clip - Задаёт область, на которую влияет изображение маски. См.
mask-clip. -
<compositing-operator> - Задаёт операцию композитинга для текущего слоя маски. См.
mask-composite.
-
Описание
Свойство короткой записи mask скрывает часть элемента, к которому оно применено, или весь элемент. Какие части элемента будут скрыты, видны или частично видны, зависит от непрозрачности (альфа-канала маски) или яркости (светимости) маски. При альфа-маскировании непрозрачные области маски показывают элемент, а прозрачные — скрывают его. При маскировании по светимости светлые непрозрачные области маски показывают элемент, а тёмные или прозрачные — скрывают его.
Необязательно задавать все составляющие свойства маски, однако значения пропущенных свойств по умолчанию устанавливаются в их начальные значения:
mask-image: none; mask-mode: match-source; mask-position: 0% 0%; mask-size: auto; mask-repeat: repeat; mask-origin: border-box; mask-clip: border-box; mask-composite: add;
Внутри каждого <mask-layer> компонент mask-size должен следовать после значения mask-position; эти значения разделяются косой чертой (/).
Если указаны два значения <geometry-box>, первое является значением mask-origin, а второе — значением mask-clip. Если указано одно значение <geometry-box> и ключевое слово no-clip, <geometry-box> является значением свойства mask-origin, поскольку no-clip допустимо только для свойства mask-clip. В этом случае порядок двух значений не имеет значения. Если указано только одно значение <geometry-box> (без ключевого слова no-clip), это значение используется для свойств mask-origin и mask-clip.
Поскольку короткая запись mask сбрасывает все свойства mask-border-* в их значение initial, следует объявлять эти свойства — или короткую запись mask-border — после любых объявлений mask. При указании mask в блоке объявлений также неявно задаются следующие свойства:
mask-border-source: none; mask-border-mode: alpha; mask-border-outset: 0; mask-border-repeat: stretch; mask-border-slice: 0; mask-border-width: auto;
По этой причине спецификация рекомендует использовать короткую запись mask вместо отдельных составляющих свойств, чтобы переопределять маски, заданные ранее в каскаде. Это гарантирует, что mask-border также будет сброшено.
Формальное определение
| Начальное значение | как у каждого из свойств короткой записи: |
|---|---|
| Применяется к | всем элементам; в SVG применяется к контейнерным элементам, за исключением элемента <defs>, и ко всем графическим элементам |
| Наследуется | нет |
| Проценты | как у каждого из свойств короткой записи: |
| Вычисленное значение | как у каждого из свойств короткой записи: |
| Тип анимации | как у каждого из свойств короткой записи: |
Формальный синтаксис
mask = <mask-layer># <mask-layer> = <mask-reference> || <position> [ / <bg-size> ]? || <repeat-style> || <geometry-box> || [ <geometry-box> | no-clip ] || <compositing-operator> || <masking-mode> <mask-reference> = none | <image> | <mask-source> <position> = [ [ left | center | right ] || [ top | center | bottom ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ]? | [ [ left | right ] <length-percentage> ] && [ [ top | bottom ] <length-percentage> ] ] <bg-size> = [ <length-percentage [0,∞]> | auto ]{1,2} | cover | contain <repeat-style> = repeat-x | repeat-y | [ repeat | space | round | no-repeat ]{1,2} <geometry-box> = <shape-box> | fill-box | stroke-box | view-box <compositing-operator> = add | subtract | intersect | exclude <masking-mode> = alpha | luminance | match-source <image> = <url> | <image()> | <image-set()> | <element()> | <paint()> | <cross-fade()> | <gradient> <mask-source> = <url> <length-percentage> = <length> | <percentage> <shape-box> = <visual-box> | margin-box <image()> = image( <image-tags>? [ <image-src>? , <color>? ]! ) <image-set()> = image-set( <image-set-option># ) <element()> = element( <id-selector> ) <paint()> = paint( <ident>, <declaration-value>? ) <cross-fade()> = cross-fade( <cf-mixing-image> , <cf-final-image>? ) <gradient> = <linear-gradient()> | <repeating-linear-gradient()> | <radial-gradient()> | <repeating-radial-gradient()> | <conic-gradient()> | <repeating-conic-gradient()> <visual-box> = content-box | padding-box | border-box <image-tags> = ltr | rtl <image-src> = <url> | <string> <color> = <color-base> | currentColor | <system-color> | <light-dark()> | <deprecated-system-color> <image-set-option> = [ <image> | <string> ] [ <resolution> || type(<string>) ] <id-selector> = <hash-token> <cf-mixing-image> = <percentage>? && <image> <cf-final-image> = <image> | <color> <linear-gradient()> = linear-gradient( [ <linear-gradient-syntax> ] ) <repeating-linear-gradient()> = repeating-linear-gradient( [ <linear-gradient-syntax> ] ) <radial-gradient()> = radial-gradient( [ <radial-gradient-syntax> ] ) <repeating-radial-gradient()> = repeating-radial-gradient( [ <radial-gradient-syntax> ] ) <conic-gradient()> = conic-gradient( [ <conic-gradient-syntax> ] ) <repeating-conic-gradient()> = repeating-conic-gradient( [ <conic-gradient-syntax> ] ) <color-base> = <hex-color> | <color-function> | <named-color> | <color-mix()> | transparent <system-color> = AccentColor | AccentColorText | ActiveText | ButtonBorder | ButtonFace | ButtonText | Canvas | CanvasText | Field | FieldText | GrayText | Highlight | HighlightText | LinkText | Mark | MarkText | SelectedItem | SelectedItemText | VisitedText <light-dark()> = light-dark( <color>, <color> ) <deprecated-system-color> = ActiveBorder | ActiveCaption | AppWorkspace | Background | ButtonHighlight | ButtonShadow | CaptionText | InactiveBorder | InactiveCaption | InactiveCaptionText | InfoBackground | InfoText | Menu | MenuText | Scrollbar | ThreeDDarkShadow | ThreeDFace | ThreeDHighlight | ThreeDLightShadow | ThreeDShadow | Window | WindowFrame | WindowText <linear-gradient-syntax> = [ [ <angle> | <zero> | to <side-or-corner> ] || <color-interpolation-method> ]? , <color-stop-list> <radial-gradient-syntax> = [ [ [ <radial-shape> || <radial-size> ]? [ at <position> ]? ] || <color-interpolation-method> ]? , <color-stop-list> <conic-gradient-syntax> = [ [ [ from [ <angle> | <zero> ] ]? [ at <position> ]? ] || <color-interpolation-method> ]? , <angular-color-stop-list> <color-function> = <rgb()> | <rgba()> | <hsl()> | <hsla()> | <hwb()> | <lab()> | <lch()> | <oklab()> | <oklch()> | <color()> <named-color> = aliceblue | antiquewhite | aqua | aquamarine | azure | beige | bisque | black | blanchedalmond | blue | blueviolet | brown | burlywood | cadetblue | chartreuse | chocolate | coral | cornflowerblue | cornsilk | crimson | cyan | darkblue | darkcyan | darkgoldenrod | darkgray | darkgreen | darkgrey | darkkhaki | darkmagenta | darkolivegreen | darkorange | darkorchid | darkred | darksalmon | darkseagreen | darkslateblue | darkslategray | darkslategrey | darkturquoise | darkviolet | deeppink | deepskyblue | dimgray | dimgrey | dodgerblue | firebrick | floralwhite | forestgreen | fuchsia | gainsboro | ghostwhite | gold | goldenrod | gray | green | greenyellow | grey | honeydew | hotpink | indianred | indigo | ivory | khaki | lavender | lavenderblush | lawngreen | lemonchiffon | lightblue | lightcoral | lightcyan | lightgoldenrodyellow | lightgray | lightgreen | lightgrey | lightpink | lightsalmon | lightseagreen | lightskyblue | lightslategray | lightslategrey | lightsteelblue | lightyellow | lime | limegreen | linen | magenta | maroon | mediumaquamarine | mediumblue | mediumorchid | mediumpurple | mediumseagreen | mediumslateblue | mediumspringgreen | mediumturquoise | mediumvioletred | midnightblue | mintcream | mistyrose | moccasin | navajowhite | navy | oldlace | olive | olivedrab | orange | orangered | orchid | palegoldenrod | palegreen | paleturquoise | palevioletred | papayawhip | peachpuff | peru | pink | plum | powderblue | purple | rebeccapurple | red | rosybrown | royalblue | saddlebrown | salmon | sandybrown | seagreen | seashell | sienna | silver | skyblue | slateblue | slategray | slategrey | snow | springgreen | steelblue | tan | teal | thistle | tomato | turquoise | violet | wheat | white | whitesmoke | yellow | yellowgreen <color-mix()> = color-mix( <color-interpolation-method> , [ <color> && <percentage [0,100]>? ]#{2}) <side-or-corner> = [ left | right ] || [ top | bottom ] <color-interpolation-method> = in [ <rectangular-color-space> | <polar-color-space> <hue-interpolation-method>? | <custom-color-space> ] <color-stop-list> = <linear-color-stop> , [ <linear-color-hint>? , <linear-color-stop> ]#? <radial-shape> = circle | ellipse <radial-size> = <radial-extent> | <length [0,∞]> | <length-percentage [0,∞]>{2} <angular-color-stop-list> = <angular-color-stop> , [ <angular-color-hint>? , <angular-color-stop> ]#? <rgb()> = rgb( <percentage>#{3} , <alpha-value>? ) | rgb( <number>#{3} , <alpha-value>? ) | rgb( [ <number> | <percentage> | none ]{3} [ / [ <alpha-value> | none ] ]? ) <rgba()> = rgba( <percentage>#{3} , <alpha-value>? ) | rgba( <number>#{3} , <alpha-value>? ) | rgba( [ <number> | <percentage> | none ]{3} [ / [ <alpha-value> | none ] ]? ) <hsl()> = hsl( <hue>, <percentage>, <percentage>, <alpha-value>? ) | hsl( [ <hue> | none ] [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ / [ <alpha-value> | none ] ]? ) <hsla()> = hsla( <hue>, <percentage>, <percentage>, <alpha-value>? ) | hsla( [ <hue> | none ] [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ / [ <alpha-value> | none ] ]? ) <hwb()> = hwb( [ <hue> | none ] [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ / [ <alpha-value> | none ] ]? ) <lab()> = lab( [<percentage> | <number> | none] [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ / [<alpha-value> | none] ]? ) <lch()> = lch( [<percentage> | <number> | none] [ <percentage> | <number> | none] [ <hue> | none] [ / [<alpha-value> | none] ]? ) <oklab()> = oklab( [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ / [<alpha-value> | none] ]? ) <oklch()> = oklch( [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ <hue> | none] [ / [<alpha-value> | none] ]? ) <color()> = color( [ from <color> ]? <colorspace-params> [ / [ <alpha-value> | none ] ]? ) <rectangular-color-space> = srgb | srgb-linear | display-p3 | display-p3-linear | a98-rgb | prophoto-rgb | rec2020 | lab | oklab | xyz | xyz-d50 | xyz-d65 <polar-color-space> = hsl | hwb | lch | oklch <hue-interpolation-method> = [ shorter | longer | increasing | decreasing ] hue <custom-color-space> = <dashed-ident> <linear-color-stop> = <color> <color-stop-length>? <linear-color-hint> = <length-percentage> <radial-extent> = closest-corner | closest-side | farthest-corner | farthest-side <angular-color-stop> = <color> <color-stop-angle>? <angular-color-hint> = <angle-percentage> | <zero> <alpha-value> = <number> | <percentage> <hue> = <number> | <angle> <colorspace-params> = [<custom-params> | <predefined-rgb-params> | <xyz-params>] <color-stop-length> = <length-percentage>{1,2} <color-stop-angle> = [ <angle-percentage> | <zero> ]{1,2} <angle-percentage> = <angle> | <percentage> <custom-params> = <dashed-ident> [ <number> | <percentage> | none ]+ <predefined-rgb-params> = <predefined-rgb> [ <number> | <percentage> | none ]{3} <xyz-params> = <xyz> [ <number> | <percentage> | none ]{3}
Примеры
Маскирование изображения
В этом примере изображение маскируется с помощью повторяющегося конического градиента, созданного средствами CSS и используемого в качестве источника маски. Для сравнения мы также покажем этот градиент как фоновое изображение.
HTML
Мы добавляем элемент <img> и пустой элемент <div>.
<img src="https://mdn.github.io/shared-assets/images/examples/progress-pride-flag.jpg" alt="Pride flag" /> <div></div>
CSS
Для <img> и <div> задаём одинаковые border, padding и размеры.
img,
div {
border: 20px dashed rebeccapurple;
box-sizing: content-box;
padding: 20px;
height: 220px;
width: 220px;
}
Затем мы применяем маску к <img>. mask-image создаётся с помощью функции repeating-conic-gradient(). Мы задаём градиент 100px на 100px, который повторяется, начинаясь в верхнем левом углу content-box изображения. Мы указываем два значения <geometry-box>: первое задаёт mask-origin, а второе определяет значение свойства mask-clip. Градиент меняется от прозрачного до сплошного lightgreen. Мы использовали lightgreen, чтобы показать, что важен не цвет маски, а её прозрачность.
img {
mask: repeating-radial-gradient(
circle,
transparent 0 5px,
lightgreen 15px 20px
)
content-box border-box 0% 0% / 100px 100px repeat;
}
Наконец, мы используем для короткого свойства background элемента <div> то же значение, что и для mask.
div {
background: repeating-radial-gradient(
circle,
transparent 0 5px,
lightgreen 15px 20px
)
content-box border-box 0% 0% / 100px 100px repeat;
}
Результат
Спецификации
| Спецификация |
|---|
| Модуль маскирования CSS, уровень 1 # the-mask |
Совместимость с браузерами
| Настольные компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome для Android | Firefox для Android | Opera для Android | Safari для iOS | Samsung Internet | WebView для Android | WebView для iOS | |
mask |
120
1Свойство с префиксом можно использовать в SVG и HTML с немного отличающимся синтаксисом, который позволяет задавать нестандартное свойство-webkit-mask-attachment.1–120Хотя свойство распознаётся, применённые к нему значения не оказывают никакого эффекта. |
120
79Свойство с префиксом можно использовать в SVG и HTML с немного отличающимся синтаксисом, который позволяет задавать нестандартное свойство-webkit-mask-attachment.79–120Хотя свойство распознаётся, применённые к нему значения не оказывают никакого эффекта.12–79
|
53
2–53Поддерживаются толькоmask: url(file.svg#mask_id) или mask: url(#mask_id), где URL является ссылкой на элемент <mask> SVG. |
106
15Свойство с префиксом можно использовать в SVG и HTML с немного отличающимся синтаксисом, который позволяет задавать нестандартное свойство-webkit-mask-attachment.15–106Хотя свойство распознаётся, применённые к нему значения не оказывают никакого эффекта. |
15.4
3.1Свойство с префиксом можно использовать в SVG и HTML с немного отличающимся синтаксисом, который позволяет задавать нестандартное свойство-webkit-mask-attachment.3.1–15.4Хотя свойство распознаётся, применённые к нему значения не оказывают никакого эффекта. |
120
18Свойство с префиксом можно использовать в SVG и HTML с немного отличающимся синтаксисом, который позволяет задавать нестандартное свойство-webkit-mask-attachment.18–120Хотя свойство распознаётся, применённые к нему значения не оказывают никакого эффекта. |
53
4–53Поддерживаются толькоmask: url(file.svg#mask_id) или mask: url(#mask_id), где URL является ссылкой на элемент <mask> SVG. |
80
14Свойство с префиксом можно использовать в SVG и HTML с немного отличающимся синтаксисом, который позволяет задавать нестандартное свойство-webkit-mask-attachment.14–80Хотя свойство распознаётся, применённые к нему значения не оказывают никакого эффекта. |
15.4
2Свойство с префиксом можно использовать в SVG и HTML с немного отличающимся синтаксисом, который позволяет задавать нестандартное свойство-webkit-mask-attachment.2–15.4Хотя свойство распознаётся, применённые к нему значения не оказывают никакого эффекта. |
25.0
1.0Свойство с префиксом можно использовать в SVG и HTML с немного отличающимся синтаксисом, который позволяет задавать нестандартное свойство-webkit-mask-attachment.1.0–25.0Хотя свойство распознаётся, применённые к нему значения не оказывают никакого эффекта. |
120
2Свойство с префиксом можно использовать в SVG и HTML с немного отличающимся синтаксисом, который позволяет задавать нестандартное свойство-webkit-mask-attachment.2–120Хотя свойство распознаётся, применённые к нему значения не оказывают никакого эффекта. |
15.4
2Свойство с префиксом можно использовать в SVG и HTML с немного отличающимся синтаксисом, который позволяет задавать нестандартное свойство-webkit-mask-attachment.2–15.4Хотя свойство распознаётся, применённые к нему значения не оказывают никакого эффекта. |
x-end |
Нет |
Нет |
Нет |
Нет |
26 |
Нет |
Нет |
Нет |
26 |
Нет |
Нет |
26 |
x-start |
Нет |
Нет |
Нет |
Нет |
26 |
Нет |
Нет |
Нет |
26 |
Нет |
Нет |
26 |
y-end |
Нет |
Нет |
Нет |
Нет |
26 |
Нет |
Нет |
Нет |
26 |
Нет |
Нет |
26 |
y-start |
Нет |
Нет |
Нет |
Нет |
26 |
Нет |
Нет |
Нет |
26 |
Нет |
Нет |
26 |
См. также
clip-pathfilter- Введение в маскирование CSS
- Свойства
maskCSS - Объявление нескольких масок
- Модуль маскирования CSS
- Атрибут
maskSVG - Применение эффектов SVG к содержимому HTML
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/mask