Свойство CSS `backdrop-filter`
Baseline Недавно стало доступно
Эта функция работает в последних версиях устройств и браузеров. Она может не работать на старых устройствах или в старых версиях браузеров. Она доступна во всех браузерах с сентября 2024 года.
Свойство backdrop-filter CSS позволяет применять графические эффекты, например размытие или изменение цвета, к области позади элемента. Поскольку оно применяется ко всему, что находится позади элемента, чтобы увидеть эффект, элемент или его фон должны быть прозрачными или частично прозрачными.
Попробуйте
backdrop-filter: blur(10px);
backdrop-filter: invert(80%);
backdrop-filter: sepia(90%);
<section class="default-example" id="default-example">
<div class="example-container">
<div id="example-element">Example</div>
</div>
</section>
.example-container {
background-image: url("/shared-assets/images/examples/balloon.jpg");
background-size: cover;
width: 200px;
height: 200px;
display: flex;
align-items: center;
justify-content: center;
color: black;
}
#example-element {
font-weight: bold;
flex: 1;
text-align: center;
padding: 20px 10px;
background-color: rgb(255 255 255 / 0.2);
}
Синтаксис
/* Keyword value */
backdrop-filter: none;
/* URL to SVG filter */
backdrop-filter: url("common-filters.svg#filter");
/* <filter-function> values */
backdrop-filter: blur(2px);
backdrop-filter: brightness(60%);
backdrop-filter: contrast(40%);
backdrop-filter: drop-shadow(4px 4px 10px blue);
backdrop-filter: grayscale(30%);
backdrop-filter: hue-rotate(120deg);
backdrop-filter: invert(70%);
backdrop-filter: opacity(20%);
backdrop-filter: sepia(90%);
backdrop-filter: saturate(80%);
/* Multiple filters */
backdrop-filter: url("filters.svg#filter") blur(4px) saturate(150%);
/* Global values */
backdrop-filter: inherit;
backdrop-filter: initial;
backdrop-filter: revert;
backdrop-filter: revert-layer;
backdrop-filter: unset;
Значения
-
none - К фону не применяется фильтр.
-
<filter-value-list> - Список разделённых пробелами
<filter-function>или фильтр SVG, который будет применён к фону. Функции фильтра CSS<filter-function>включаютblur(),brightness(),contrast(),drop-shadow(),grayscale(),hue-rotate(),invert(),opacity(),saturate()иsepia().
Описание
Свойство backdrop-filter применяет эффекты фильтрации к пикселям, нарисованным позади элемента, вплоть до ближайшего предка, являющегося корневым элементом фона. Содержимое над корневым элементом фона не затрагивается.
Корневой элемент фона
Корневой элемент фона — это элемент, задающий границу для эффектов backdrop-filter. К корневым элементам фона относятся:
- Корневой элемент (
<html>) - Элемент со значением
filter, отличным отnone - Элемент со значением
opacityменьше1 - Элемент со значением
mask,mask-image,mask-borderилиclip-path, отличным отnone - Элемент со значением
backdrop-filter, отличным отnone - Элемент со значением
mix-blend-mode, отличным отnormal - Элемент, для которого свойству
will-changeзадано одно из перечисленных выше свойств
Это означает, что если у родительского элемента есть opacity: 0.9, он становится корневым элементом фона, и backdrop-filter любого дочернего элемента будет размывать только содержимое между этим родителем и дочерним элементом, а не содержимое позади родителя. Это частая причина путаницы, когда backdrop-filter, несмотря на правильное применение, кажется не оказывающим видимого эффекта.
В следующем примере показано, как корневые элементы фона влияют на backdrop-filter. У первого контейнера есть will-change: opacity, поэтому он становится корневым элементом фона. Обратите внимание: круг размытия затрагивает только текст и квадрат внутри контейнера, но не клетчатый фон позади него. Второй контейнер не является корневым элементом фона, поэтому его круг размытия затрагивает всё, что находится позади него, включая фон страницы.
<div class="parent backdrop-root"> <div class="text">Text</div> <div class="square"></div> <div class="overlay"></div> </div> <div class="parent"> <div class="text">Text</div> <div class="square"></div> <div class="overlay"></div> </div>
body {
display: flex;
column-gap: 16px;
padding: 16px;
background-image: conic-gradient(
gray 90deg,
silver 90deg 180deg,
gray 180deg 270deg,
silver 270deg
);
background-size: 32px 32px;
}
.parent {
position: relative;
width: 256px;
height: 256px;
}
.backdrop-root {
outline: 2px solid crimson;
will-change: opacity;
}
.square {
position: absolute;
top: 35px;
left: 40%;
width: 25%;
height: 25%;
border: 10px solid white;
}
.text {
position: absolute;
left: 40%;
color: white;
font-size: 32px;
font-weight: 500;
text-align: center;
line-height: 256px;
filter: blur(1px);
}
.overlay {
position: absolute;
top: 25%;
left: 50%;
width: 50%;
height: 50%;
outline: 3px solid gainsboro;
border-radius: 9999px;
backdrop-filter: blur(10px);
}
Формальное определение
| Начальное значение | none |
|---|---|
| Применяется к | всем элементам; в SVG применяется к контейнерным элементам, за исключением элемента <defs>, а также ко всем графическим элементам |
| Наследуется | нет |
| Вычисленное значение | как задано |
| Тип анимации | список функций фильтрации <a href="/en-US/docs/Web/CSS/Reference/Properties/filter#interpolation" title="Если оба фильтра содержат списки функций одинаковой длины и не содержат URL, каждая функция фильтрации интерполируется согласно своим правилам. Если их длина различается, недостающие эквивалентные функции фильтрации из более длинного списка добавляются в конец более короткого списка со значениями по умолчанию, после чего все функции фильтрации интерполируются согласно своим правилам. Если один из фильтров равен 'none', он заменяется списком функций фильтрации другого фильтра с использованием значений функций фильтрации по умолчанию, после чего все функции фильтрации интерполируются согласно своим правилам. В остальных случаях используется дискретная интерполяция.">filter function list</a> |
Формальный синтаксис
backdrop-filter = none | <filter-value-list> <filter-value-list> = [ <filter-function> | <url> ]+ <filter-function> = <blur()> | <brightness()> | <contrast()> | <drop-shadow()> | <grayscale()> | <hue-rotate()> | <invert()> | <opacity()> | <saturate()> | <sepia()> <blur()> = blur( <length>? ) <brightness()> = brightness( [ <number> | <percentage> ]? ) <contrast()> = contrast( [ <number> | <percentage> ]? ) <drop-shadow()> = drop-shadow( [ <color>? && <length>{2,3} ] ) <grayscale()> = grayscale( [ <number> | <percentage> ]? ) <hue-rotate()> = hue-rotate( [ <angle> | <zero> ]? ) <invert()> = invert( [ <number> | <percentage> ]? ) <opacity()> = opacity( [ <number> | <percentage> ]? ) <saturate()> = saturate( [ <number> | <percentage> ]? ) <sepia()> = sepia( [ <number> | <percentage> ]? ) <color> = <color-base> | currentColor | <system-color> | <light-dark()> | <deprecated-system-color> <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 <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}) <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 ] ]? ) <color-interpolation-method> = in [ <rectangular-color-space> | <polar-color-space> <hue-interpolation-method>? | <custom-color-space> ] <alpha-value> = <number> | <percentage> <hue> = <number> | <angle> <colorspace-params> = [<custom-params> | <predefined-rgb-params> | <xyz-params>] <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> <custom-params> = <dashed-ident> [ <number> | <percentage> | none ]+ <predefined-rgb-params> = <predefined-rgb> [ <number> | <percentage> | none ]{3} <xyz-params> = <xyz> [ <number> | <percentage> | none ]{3} <predefined-rgb> = srgb | srgb-linear | display-p3 | display-p3-linear | a98-rgb | prophoto-rgb | rec2020 <xyz> = xyz | xyz-d50 | xyz-d65
Примеры
CSS
.box {
background-color: rgb(255 255 255 / 30%);
backdrop-filter: blur(10px);
}
body {
background-image: url("anemones.jpg");
}
html,
body {
height: 100%;
width: 100%;
}
.container {
background-size: cover;
align-items: center;
display: flex;
justify-content: center;
height: 100%;
width: 100%;
}
.box {
border-radius: 5px;
font-family: sans-serif;
text-align: center;
max-width: 50%;
max-height: 50%;
padding: 20px 40px;
}
HTML
<div class="container">
<div class="box">
<p>backdrop-filter: blur(10px)</p>
</div>
</div>
Результат
Спецификации
Совместимость с браузерами
| Компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | WebView на iOS | |
backdrop-filter |
76 |
79
17–79
|
103До Firefox 123 свойство не поддерживалось в системах с неизвестным производителем GPU (см. ошибку 1868737). |
63 |
18
9
|
76 |
103До Firefox для Android 123 свойство не поддерживалось в системах с неизвестным производителем GPU (см. ошибку 1868737). |
54 |
18
9
|
12.0 |
76 |
18
9
|
none |
76 |
79 |
103 |
63 |
9 |
76 |
103 |
54 |
9 |
12.0 |
76 |
9 |
См. также
filter<filter-function>-
background-blend-mode,mix-blend-mode - Эффекты фильтрации CSS
- Композитинг и смешивание в CSS
© 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/backdrop-filter