CSS свойство filter
Определение и применение
CSS свойство filter устанавливает визуальный эффект (фильтр) для элемента (например, размытие или
изменение цвета). Фильтр обрабатывает элемент целиком: его фон, рамку, текст и содержимое потомков.
Больше примеров доступно в генераторе CSS-фильтров, вы сможете подобрать сочетание необходимых эффектов, загрузить своё изображение и при необходимости скопировать готовый CSS.
Попробуйте значения filter
Фильтр применяется к отрисованному элементу целиком: фону, рамке и тексту. Сравните изменение цвета и размытие.
filter: none
HTML и CSS примера
<div class="demo-target">
<span class="sun" aria-hidden="true"></span><strong>Цветная карточка</strong>
</div>
.demo-target {
box-sizing: border-box;
width: 100%;
max-width: 320px;
min-height: 180px;
padding: 24px;
border: 3px solid #245a85;
border-radius: 8px;
background-color: #d9edf8;
font: 18px/1.5 system-ui;
background: linear-gradient(135deg, #245a85, #337b68);
color: white;
filter: none;
}
.sun {
display: block;
width: 70px;
height: 70px;
border-radius: 50%;
background: #ffcb69;
margin-bottom: 12px;
}
.demo-target {
box-sizing: border-box;
width: 100%;
max-width: 320px;
min-height: 180px;
padding: 24px;
border: 3px solid #245a85;
border-radius: 8px;
background-color: #d9edf8;
font: 18px/1.5 system-ui;
background: linear-gradient(135deg, #245a85, #337b68);
color: white;
filter: grayscale(1);
}
.sun {
display: block;
width: 70px;
height: 70px;
border-radius: 50%;
background: #ffcb69;
margin-bottom: 12px;
}
.demo-target {
box-sizing: border-box;
width: 100%;
max-width: 320px;
min-height: 180px;
padding: 24px;
border: 3px solid #245a85;
border-radius: 8px;
background-color: #d9edf8;
font: 18px/1.5 system-ui;
background: linear-gradient(135deg, #245a85, #337b68);
color: white;
filter: sepia(1);
}
.sun {
display: block;
width: 70px;
height: 70px;
border-radius: 50%;
background: #ffcb69;
margin-bottom: 12px;
}
.demo-target {
box-sizing: border-box;
width: 100%;
max-width: 320px;
min-height: 180px;
padding: 24px;
border: 3px solid #245a85;
border-radius: 8px;
background-color: #d9edf8;
font: 18px/1.5 system-ui;
background: linear-gradient(135deg, #245a85, #337b68);
color: white;
filter: blur(3px);
}
.sun {
display: block;
width: 70px;
height: 70px;
border-radius: 50%;
background: #ffcb69;
margin-bottom: 12px;
}
.demo-target {
box-sizing: border-box;
width: 100%;
max-width: 320px;
min-height: 180px;
padding: 24px;
border: 3px solid #245a85;
border-radius: 8px;
background-color: #d9edf8;
font: 18px/1.5 system-ui;
background: linear-gradient(135deg, #245a85, #337b68);
color: white;
filter: brightness(1.5);
}
.sun {
display: block;
width: 70px;
height: 70px;
border-radius: 50%;
background: #ffcb69;
margin-bottom: 12px;
}
.demo-target {
box-sizing: border-box;
width: 100%;
max-width: 320px;
min-height: 180px;
padding: 24px;
border: 3px solid #245a85;
border-radius: 8px;
background-color: #d9edf8;
font: 18px/1.5 system-ui;
background: linear-gradient(135deg, #245a85, #337b68);
color: white;
filter: hue-rotate(90deg);
}
.sun {
display: block;
width: 70px;
height: 70px;
border-radius: 50%;
background: #ffcb69;
margin-bottom: 12px;
}
Поддержка браузерами
Спецификация: filter-effects
Поддерживается во всех основных браузерах с 2017 года.
Отдельные значения (1) поддерживаются не везде — смотрите таблицу.
| Возможность | Компьютеры | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
filter | 53 Версия 53 выпущена в 2016 г. Версия 18 выпущена в 2012 г. — Префикс -webkit- | 12 Версия 12 выпущена в 2015 г. Версия 12 выпущена в 2015 г. — Префикс -webkit- | 35 Версия 35 выпущена в 2015 г. Версия 49 выпущена в 2016 г. — Префикс -webkit- | 40 Версия 40 выпущена в 2016 г. Версия 15 выпущена в 2013 г. — Префикс -webkit- | 9.1 Версия 9.1 выпущена в 2016 г. Версия 6 выпущена в 2012 г. — Префикс -webkit- | 53 Версия 53 выпущена в 2016 г. Версия 18 выпущена в 2012 г. — Префикс -webkit- | 35 Версия 35 выпущена в 2015 г. Версия 49 выпущена в 2016 г. — Префикс -webkit- | 41 Версия 41 выпущена в 2016 г. Версия 14 выпущена в 2013 г. — Префикс -webkit- | 9.3 Версия 9.3 выпущена в 2016 г. Версия 6 выпущена в 2012 г. — Префикс -webkit- | 6.0 Версия 6.0 выпущена в 2017 г. Версия 1.0 выпущена в 2013 г. — Префикс -webkit- | 53 Версия 53 выпущена в 2016 г. Версия 4.4 выпущена в 2013 г. — Префикс -webkit- | 9.3 Версия 9.3 выпущена в 2016 г. Версия 6 выпущена в 2012 г. — Префикс -webkit- |
blur | 18 | 12 | 35 | 40 | 6 | 53 | 35 | 41 | 6 | 6.0 | 4.4 | 6 |
brightness | 18 | 12 | 35 | 40 | 6 | 53 | 35 | 41 | 6 | 6.0 | 4.4 | 6 |
contrast | 18 | 12 | 35 | 40 | 6 | 53 | 35 | 41 | 6 | 6.0 | 4.4 | 6 |
drop-shadow | 18 | 12 | 35 | 40 | 6 | 53 | 35 | 41 | 6 | 6.0 | 4.4 | 6 |
grayscale | 18 | 12 | 35 | 40 | 6 | 53 | 35 | 41 | 6 | 6.0 | 4.4 | 6 |
hue-rotate | 18 | 12 | 35 | 40 | 6 | 53 | 35 | 41 | 6 | 6.0 | 4.4 | 6 |
invert | 18 | 12 | 35 | 40 | 6 | 53 | 35 | 41 | 6 | 6.0 | 4.4 | 6 |
none | 18 | 12 | 35 | 15 | 6 | 18 | 35 | 14 | 6 | 1.0 | 4.4 | 6 |
opacity | 18 | 12 | 35 | 40 | 6 | 53 | 35 | 41 | 6 | 6.0 | 4.4 | 6 |
saturate | 18 Версия 18 выпущена в 2012 г. Примечание MDN (англ.) In Chrome 18 to 19, the | 12 | 35 | 40 | 6 | 53 | 35 | 41 | 6 | 6.0 | 4.4 | 6 |
sepia | 18 | 12 | 35 | 40 | 6 | 53 | 35 | 41 | 6 | 6.0 | 4.4 | 6 |
| On SVG elements | 89 | 89 | 35 | 75 | 89 | 35 | 63 | 15.0 | 89 | |||
поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31
CSS синтаксис:
/* Без эффектов */
filter: none;
/* Размытие и тень */
filter: blur() | drop-shadow();
/* Яркость, контраст и прозрачность */
filter: brightness() | contrast() | opacity();
/* Цвет */
filter: grayscale() | hue-rotate() | invert() | saturate() | sepia();
/* Ссылка на SVG-фильтр */
filter: url();
/* Цепочка из одной или нескольких функций через пробел */
filter: [ <filter-function> | url() ]+;
/* Глобальные значения */
filter: initial | inherit | unset | revert | revert-layer;
Знак | разделяет варианты, квадратные скобки группируют их, а + означает одно или несколько
повторений. <filter-function> — любая из перечисленных функций. Функции применяются слева направо.
Например, допустимо filter: blur(4px) brightness(150%) url(#duotone).
JavaScript синтаксис:
element.style.filter = "blur(4px)";Начальное значение свойства
none.
Значения свойства
Функции яркости, контрастности, насыщенности, оттенков серого, инверсии, непрозрачности и сепии принимают
неотрицательное число или процент: 0.5 равно 50%, 1 — 100%. Для
grayscale(), invert(), opacity() и sepia() значения выше 1
допустимы, но эффект ограничивается уровнем 1.
| Значение | Описание |
|---|---|
none |
Эффекты отсутствуют. Начальное значение. |
blur() |
Гауссово размытие. Принимает неотрицательную длину, например 4px или 0.2rem; проценты
недопустимы. Чем больше значение, тем сильнее размытие. Без аргумента используется 0.
|
brightness() |
Яркость: 0 — чёрный результат, 1 (100%) — без изменений, больше 1 —
светлее. Без аргумента используется 1.
|
contrast() |
Контрастность: 0 — серый результат, 1 — без изменений, больше 1 — выше
контраст. Без аргумента используется 1.
|
drop-shadow() |
Тень по непрозрачному контуру содержимого. Две обязательные длины задают смещение по горизонтали и вертикали;
они могут быть отрицательными. Третья, необязательная неотрицательная длина задаёт стандартное отклонение
гауссова размытия (по умолчанию 0). Это не тот же параметр, что радиус размытия у
box-shadow. Цвет необязателен, без него используется currentColor — значение свойства
color. Пример: drop-shadow(8px 8px 4px #496b91). Параметр растяжения spread и ключевое
слово inset не поддерживаются. Можно последовательно указать несколько drop-shadow();
каждый следующий обрабатывает результат предыдущего, включая уже созданные тени.
|
hue-rotate() |
Поворот оттенка. Принимает угол в deg, rad, grad или turn.
Допустимы отрицательные значения и несколько оборотов: 450deg даёт тот же эффект, что
90deg. Без аргумента используется 0deg. Это преобразование RGB-цветов, а не точная
замена оттенка в HSL: насыщенность и светлота могут измениться.
|
grayscale() |
Оттенки серого: 0 сохраняет цвета, 1 полностью обесцвечивает. Без аргумента
используется 1.
|
invert() |
Инверсия цветов: 0 — без изменений, 1 — полная инверсия, 0.5 — серый
результат. Без аргумента используется 1.
|
opacity() |
Непрозрачность: 0 — полностью прозрачно, 1 — без изменений. Без аргумента используется
1. В отличие от отдельного свойства
opacity, функция может менять прозрачность промежуточного результата в цепочке фильтров. При совместном использовании
оба эффекта учитываются.
|
saturate() |
Насыщенность: 0 убирает цвета, 1 сохраняет их, больше 1 усиливает
насыщенность. Без аргумента используется 1.
|
sepia() |
Оттенки сепии: 0 — без изменений, 1 — полный эффект в коричневых тонах. Без аргумента
используется 1.
|
url() |
Ссылка на SVG-элемент <filter> по его id: url(#filter-id) для SVG
внутри страницы или url("filters.svg#filter-id") для внешнего файла. Доступ к внешнему ресурсу
зависит от ограничений безопасности браузера.
|
initial
|
Устанавливает начальное значение свойства. |
inherit
|
Наследует вычисленное значение свойства у родительского элемента. |
unset |
Для ненаследуемого свойства filter устанавливает его
начальное значение.
|
revert |
Отменяет заданное в коде значение свойства для этого элемента: применяются пользовательские или стандартные стили браузера. Если они не задают значение, свойство наследуется или получает начальное значение по обычным правилам. Не возвращает значение из предыдущей строки CSS. |
revert-layer |
Сбрасывает значение свойства для текущего слоя каскада @layer. Применяется значение из другого слоя
по правилам каскада; если подходящего значения нет, возможен откат к стилям пользователя или браузера.
|
Особенности применения
-
Свойство не наследуется, но потомки входят в общий отрисованный результат родителя. Поэтому
filter: noneу ребёнка не отменяет размытие, заданное родителю. -
Эффекты не меняют размеры и положение блоков в раскладке. Размытие и тень могут выходить за границы, а
overflowсо значениемhiddenилиclipу предка обрезает их. -
Невалидный параметр делает невалидным всё объявление. Например,
filter: blur(-2px) brightness(150%)игнорируется целиком; может сработать другое объявление из каскада. - Аппаратное ускорение зависит от браузера, устройства и эффекта. Большая область размытия и длинная цепочка фильтров могут быть затратными; проверяйте анимацию на целевых устройствах.
Порядок фильтров и анимация
Функции выполняются слева направо, поэтому перестановка может менять результат. Сравните
invert(100%) sepia(100%) и sepia(100%) invert(100%) в любом примере ниже. Последующее
объявление filter заменяет весь список функций.
.image {
filter: grayscale(100%);
transition: filter 300ms;
}
.image:hover {
filter: grayscale(0%);
}
@media (prefers-reduced-motion: reduce) {
.image { transition: none; }
}
Для плавного перехода используйте одинаковый порядок функций в обоих состояниях. SVG-фильтры через
url() не интерполируются как числовые параметры функций. Свойство filter меняет сам элемент;
для эффекта над фоном позади него используется backdrop-filter.
Спецификация
Filter Effects Module Level 1.
Наследуется
Нет.
Анимируемое
Да. Списки с одинаковыми функциями в том же порядке интерполируются по параметрам; если один список короче,
недостающие функции дополняются нейтральными значениями. Если списки нельзя сопоставить, например при
url(), значение переключается дискретно.
Примеры, попробуйте сами
Откройте редактор примера и измените значение свойства filter, результат обновляется автоматически. Рядом
показан оригинал или другой вариант эффекта для сравнения.
Размытие (функция blur):
Поменяйте радиус с 4px на 0 или 8px. Отрицательные длины и проценты недопустимы.
base.css
body {
margin: 0;
padding: 16px;
font: 16px/1.5 system-ui;
color: #203047;
background: #eef3f8;
}
.comparison {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
}
figure {
margin: 0;
min-width: 0;
}
figcaption {
margin-bottom: 8px;
}
img {
display: block;
width: 100%;
height: min(260px, calc(100vh - 80px));
object-fit: contain;
}
@media (max-width: 420px) {
img {
height: calc(50vh - 64px);
}
.comparison {
grid-template-columns: 1fr;
}
}
index.html
<div class="comparison">
<figure>
<figcaption>Оригинал</figcaption>
<img src="assets/vegas.jpg" alt="Исходное изображение" />
</figure>
<figure>
<figcaption>Результат</figcaption>
<img class="filtered" src="assets/vegas.jpg" alt="Изображение с фильтром" />
</figure>
</div>
style.css
.filtered {
filter: blur(4px);
}
Яркость (функция brightness):
100% сохраняет яркость, 0% делает изображение чёрным. Попробуйте 50% и 150%.
base.css
body {
margin: 0;
padding: 16px;
font: 16px/1.5 system-ui;
color: #203047;
background: #eef3f8;
}
.comparison {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
}
figure {
margin: 0;
min-width: 0;
}
figcaption {
margin-bottom: 8px;
}
img {
display: block;
width: 100%;
height: min(260px, calc(100vh - 80px));
object-fit: contain;
}
@media (max-width: 420px) {
img {
height: calc(50vh - 64px);
}
.comparison {
grid-template-columns: 1fr;
}
}
index.html
<div class="comparison">
<figure>
<figcaption>Оригинал</figcaption>
<img src="assets/catlamp.jpg" alt="Исходное изображение" />
</figure>
<figure>
<figcaption>Результат</figcaption>
<img class="filtered" src="assets/catlamp.jpg" alt="Изображение с фильтром" />
</figure>
</div>
style.css
.filtered {
filter: brightness(150%);
}
Контраст (функция contrast):
100% сохраняет контраст, 0% даёт серое изображение. Попробуйте 50% и 180%.
base.css
body {
margin: 0;
padding: 16px;
font: 16px/1.5 system-ui;
color: #203047;
background: #eef3f8;
}
.comparison {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
}
figure {
margin: 0;
min-width: 0;
}
figcaption {
margin-bottom: 8px;
}
img {
display: block;
width: 100%;
height: min(260px, calc(100vh - 80px));
object-fit: contain;
}
@media (max-width: 420px) {
img {
height: calc(50vh - 64px);
}
.comparison {
grid-template-columns: 1fr;
}
}
index.html
<div class="comparison">
<figure>
<figcaption>Оригинал</figcaption>
<img src="assets/lis.jpg" alt="Исходное изображение" />
</figure>
<figure>
<figcaption>Результат</figcaption>
<img class="filtered" src="assets/lis.jpg" alt="Изображение с фильтром" />
</figure>
</div>
style.css
.filtered {
filter: contrast(180%);
}
Поворот оттенка (функция hue-rotate):
Попробуйте 90deg, -90deg и 450deg. Угол не ограничен одним оборотом; 450deg даёт тот же эффект, что 90deg.
base.css
body {
margin: 0;
padding: 16px;
font: 16px/1.5 system-ui;
color: #203047;
background: #eef3f8;
}
.comparison {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
}
figure {
margin: 0;
min-width: 0;
}
figcaption {
margin-bottom: 8px;
}
img {
display: block;
width: 100%;
height: min(260px, calc(100vh - 80px));
object-fit: contain;
}
@media (max-width: 420px) {
img {
height: calc(50vh - 64px);
}
.comparison {
grid-template-columns: 1fr;
}
}
index.html
<div class="comparison">
<figure>
<figcaption>Оригинал</figcaption>
<img src="assets/leto.jpg" alt="Исходное изображение" />
</figure>
<figure>
<figcaption>Результат</figcaption>
<img class="filtered" src="assets/leto.jpg" alt="Изображение с фильтром" />
</figure>
</div>
style.css
.filtered {
filter: hue-rotate(90deg);
}
Оттенки серого (функция grayscale):
0% сохраняет цвета, 100% убирает их. Попробуйте промежуточное значение 50%.
base.css
body {
margin: 0;
padding: 16px;
font: 16px/1.5 system-ui;
color: #203047;
background: #eef3f8;
}
.comparison {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
}
figure {
margin: 0;
min-width: 0;
}
figcaption {
margin-bottom: 8px;
}
img {
display: block;
width: 100%;
height: min(260px, calc(100vh - 80px));
object-fit: contain;
}
@media (max-width: 420px) {
img {
height: calc(50vh - 64px);
}
.comparison {
grid-template-columns: 1fr;
}
}
index.html
<div class="comparison">
<figure>
<figcaption>Оригинал</figcaption>
<img src="assets/zhiraf.jpg" alt="Исходное изображение" />
</figure>
<figure>
<figcaption>Результат</figcaption>
<img class="filtered" src="assets/zhiraf.jpg" alt="Изображение с фильтром" />
</figure>
</div>
style.css
.filtered {
filter: grayscale(100%);
}
Инверсия (функция invert):
0% сохраняет цвета, 100% инвертирует их, а 50% даёт серый результат.
base.css
body {
margin: 0;
padding: 16px;
font: 16px/1.5 system-ui;
color: #203047;
background: #eef3f8;
}
.comparison {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
}
figure {
margin: 0;
min-width: 0;
}
figcaption {
margin-bottom: 8px;
}
img {
display: block;
width: 100%;
height: min(260px, calc(100vh - 80px));
object-fit: contain;
}
@media (max-width: 420px) {
img {
height: calc(50vh - 64px);
}
.comparison {
grid-template-columns: 1fr;
}
}
index.html
<div class="comparison">
<figure>
<figcaption>Оригинал</figcaption>
<img src="assets/invert.png" alt="Исходное изображение" />
</figure>
<figure>
<figcaption>Результат</figcaption>
<img class="filtered" src="assets/invert.png" alt="Изображение с фильтром" />
</figure>
</div>
style.css
.filtered {
filter: invert(100%);
}
Прозрачность (функция opacity):
100% сохраняет непрозрачность, 0% скрывает изображение. Фон под изображением помогает увидеть эффект.
base.css
body {
margin: 0;
padding: 16px;
font: 16px/1.5 system-ui;
color: #203047;
background: #eef3f8;
}
.comparison {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
}
figure {
margin: 0;
min-width: 0;
}
figcaption {
margin-bottom: 8px;
}
img {
display: block;
width: 100%;
height: min(260px, calc(100vh - 80px));
object-fit: contain;
}
@media (max-width: 420px) {
img {
height: calc(50vh - 64px);
}
.comparison {
grid-template-columns: 1fr;
}
}
index.html
<div class="comparison">
<figure>
<figcaption>Оригинал</figcaption>
<img src="assets/hameleon.jpg" alt="Исходное изображение" />
</figure>
<figure>
<figcaption>Результат</figcaption>
<img class="filtered" src="assets/hameleon.jpg" alt="Изображение с фильтром" />
</figure>
</div>
style.css
.filtered {
filter: opacity(50%);
}
Насыщенность (функция saturate):
100% сохраняет цвета, 0% убирает насыщенность. Значения выше 100% усиливают её.
base.css
body {
margin: 0;
padding: 16px;
font: 16px/1.5 system-ui;
color: #203047;
background: #eef3f8;
}
.comparison {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
}
figure {
margin: 0;
min-width: 0;
}
figcaption {
margin-bottom: 8px;
}
img {
display: block;
width: 100%;
height: min(260px, calc(100vh - 80px));
object-fit: contain;
}
@media (max-width: 420px) {
img {
height: calc(50vh - 64px);
}
.comparison {
grid-template-columns: 1fr;
}
}
index.html
<div class="comparison">
<figure>
<figcaption>Оригинал</figcaption>
<img src="assets/kot_pid.jpeg" alt="Исходное изображение" />
</figure>
<figure>
<figcaption>Результат</figcaption>
<img class="filtered" src="assets/kot_pid.jpeg" alt="Изображение с фильтром" />
</figure>
</div>
style.css
.filtered {
filter: saturate(200%);
}
Сепия (функция sepia):
0% сохраняет исходное изображение, 100% полностью переводит его в оттенки сепии.
base.css
body {
margin: 0;
padding: 16px;
font: 16px/1.5 system-ui;
color: #203047;
background: #eef3f8;
}
.comparison {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
}
figure {
margin: 0;
min-width: 0;
}
figcaption {
margin-bottom: 8px;
}
img {
display: block;
width: 100%;
height: min(260px, calc(100vh - 80px));
object-fit: contain;
}
@media (max-width: 420px) {
img {
height: calc(50vh - 64px);
}
.comparison {
grid-template-columns: 1fr;
}
}
index.html
<div class="comparison">
<figure>
<figcaption>Оригинал</figcaption>
<img src="assets/dog_pid.jpg" alt="Исходное изображение" />
</figure>
<figure>
<figcaption>Результат</figcaption>
<img class="filtered" src="assets/dog_pid.jpg" alt="Изображение с фильтром" />
</figure>
</div>
style.css
.filtered {
filter: sepia(100%);
}
Тень по контуру (функция drop-shadow):
Сравните тень прямоугольного блока и тень звезды. В отличие от box-shadow, фильтр учитывает прозрачные области. Несколько теней можно задать последовательностью функций drop-shadow().
base.css
body {
margin: 0;
padding: 16px;
font: 16px/1.5 system-ui;
color: #203047;
background: #eef3f8;
}
.comparison {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 20px;
}
figure {
margin: 0;
min-width: 0;
}
figcaption {
margin-bottom: 8px;
}
@media (max-width: 420px) {
.comparison {
grid-template-columns: 1fr;
}
}
.symbol {
width: min(160px, 100%);
text-align: center;
font: min(140px, calc(50vh - 100px))/1.2 system-ui;
color: #e67b20;
}
.box {
box-shadow: 8px 8px 4px #496b91;
}
index.html
<div class="comparison">
<figure>
<figcaption>box-shadow: прямоугольная рамка</figcaption>
<div class="symbol box">★</div>
</figure>
<figure>
<figcaption>Результат</figcaption>
<div class="symbol filtered">★</div>
</figure>
</div>
style.css
.filtered {
filter: drop-shadow(8px 8px 4px #496b91);
}
Свой SVG-фильтр (функция url):
Фильтр объявлен в SVG внутри примера. Значение url(#duotone) ссылается на его ID. Во вкладке HTML измените values="0" на values="1", чтобы вернуть насыщенность.
base.css
body {
margin: 0;
padding: 24px;
font: 16px/1.5 system-ui;
color: #203047;
background: #eef3f8;
}
.comparison {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 24px;
}
figure {
margin: 0;
min-width: 0;
}
figcaption {
margin-bottom: 12px;
}
img {
display: block;
width: 100%;
height: 200px;
object-fit: contain;
}
@media (max-width: 420px) {
.comparison {
grid-template-columns: 1fr;
}
}
.card {
padding: 32px;
background: linear-gradient(135deg, #ffb454, #3f8cb5);
color: #17334d;
border: 4px solid #de5b51;
}
index.html
<svg xmlns="http://www.w3.org/2000/svg" width="0" height="0" aria-hidden="true">
<filter id="duotone" color-interpolation-filters="sRGB">
<feColorMatrix type="saturate" values="0" />
</filter>
</svg>
<div class="comparison">
<figure>
<figcaption>Оригинал</figcaption>
<div class="card">Цветная карточка</div>
</figure>
<figure>
<figcaption>Результат</figcaption>
<div class="card filtered">Цветная карточка</div>
</figure>
</div>
style.css
.filtered {
filter: url(#duotone);
}