Как размыть элемент
filter: blur() принимает длину, радиус размытия. Чем он больше, тем сильнее размыт элемент:
filter работает с любым элементом, а не только с изображениями: размытый div размывает и свой текст, рамку и дочерние элементы. Обратите внимание на мягкие края у размытых изображений: размытие растягивает картинку наружу и подмешивает прозрачную область вокруг. Решение ниже, в разделе «Проблема размытых краев».
Размытие фона: backdrop-filter
Чтобы размыть то, что за элементом (панель из матового стекла поверх фотографии или страницы), используйте backdrop-filter. Собственное содержимое элемента остается четким. Чтобы размытие было видно, нужен полупрозрачный фон:
Полосы и круги четкие вокруг панели и размытые за ней, а текст панели не тронут. Следите за читаемостью текста: на пестрых изображениях помогает более светлый или темный оттенок в цвете фона.
Все функции фильтров вживую
Двигайте любой ползунок. Строка под изображением это точное значение filter, готовое к копированию:
Выводятся только функции, которые вы сдвинули с нейтрального значения, поэтому значение остается коротким. brightness(1) или blur(0px) ничего не меняют, так что перечислять их незачем.
Функции фильтров
| Функция | Нейтральное значение | Что делает | Пример |
|---|---|---|---|
blur(r) | 0 | гауссово размытие с радиусом r | blur(4px) |
brightness(n) | 1 | темнее ниже 1, ярче выше | brightness(0.7) |
contrast(n) | 1 | площе ниже 1, контрастнее выше | contrast(1.3) |
grayscale(n) | 0 | 1 (или 100%) полностью серый | grayscale(100%) |
sepia(n) | 0 | теплый коричневый тон | sepia(0.6) |
saturate(n) | 1 | 0 серый, выше 1 насыщеннее | saturate(1.5) |
hue-rotate(a) | 0deg | сдвигает каждый тон по цветовому кругу | hue-rotate(90deg) |
invert(n) | 0 | 1 это полный цветовой негатив | invert(1) |
opacity(n) | 1 | как свойство opacity | opacity(0.5) |
drop-shadow(x y blur color) | тень, которая повторяет форму | drop-shadow(2px 4px 6px rgb(0 0 0 / 0.3)) |
Числа можно задавать и в процентах (grayscale(100%) равно grayscale(1)). Несколько функций записываются в одно значение через пробел и применяются по порядку: filter: grayscale(1) sepia(1) дает коричневый оттенок, а sepia(1) grayscale(1) в итоге просто серый.
drop-shadow повторяет форму
box-shadow всегда прямоугольник (максимум со скругленными углами). drop-shadow() рисуется по видимым пикселям, поэтому у прозрачной иконки тень с ее контуром:
Первая звезда отбрасывает квадратную тень от своего невидимого ограничивающего блока. Вторая отбрасывает тень в форме звезды. В отличие от box-shadow, у drop-shadow() нет значения spread и нет inset; они разобраны на странице тень box-shadow.
Проблема размытых краев
Размытое изображение бледнеет по краям, потому что размытие подтягивает прозрачные пиксели вокруг. Чтобы сохранить четкий край (например, для размытого фона в шапке), поместите изображение в контейнер с overflow: hidden и немного увеличьте изображение, чтобы мягкий край обрезался:
.hero { overflow: hidden; }
.hero img { filter: blur(8px); transform: scale(1.1); }
Эффекты при наведении через filter
filter можно анимировать переходом, поэтому стена логотипов, которые из серых становятся цветными, или карточка, затемненная до наведения, делаются двумя правилами:
Наведите курсор на плитку (или перейдите к ней табом), и ее цвет плавно проявится.
Полезно знать
- Производительность. Больше всего стоят большие радиусы размытия на больших площадях, особенно
backdrop-filterна элементах, которые двигаются или прокручиваются. Проверяйте на телефоне. - Читаемость. Никогда не размывайте текст, который людям нужно прочитать, и проверяйте контрастность текста поверх матовой панели.
- Наложение. Любой
filter, кромеnone, создает новый контекст наложения и становится содержащим блоком для потомков сposition: fixed, как иtransform.
Частые ошибки
filter: blur(5). Радиусу нужна единица:blur(5px).filter: blur()для матовой панели. Он размывает собственный текст панели. Используйтеbackdrop-filterс прозрачным фоном.- backdrop-filter ничего не показывает. Фон элемента должен быть хотя бы частично прозрачным, и за ним должно что-то быть.
- Два объявления
filter. Второе заменяет первое. Пишите все функции в одно значение. - Квадратные тени у прозрачных иконок. Используйте
filter: drop-shadow()вместоbox-shadow.
Часто задаваемые вопросы
Как размыть элемент в CSS?
Используйте filter: blur(5px);. Длина это радиус размытия: 0 четко, а чем больше значение, тем сильнее размытие. Размывается элемент и все, что внутри, включая текст и изображения.
Как размыть фон за элементом?
Задайте элементу backdrop-filter: blur(10px); с частично прозрачным фоном, например rgb(255 255 255 / 0.5). Собственное содержимое элемента остается четким, а все, что за ним, размывается: это эффект матового стекла.
Чем drop-shadow() отличается от box-shadow?
box-shadow всегда повторяет прямоугольный блок элемента. filter: drop-shadow() повторяет видимую форму, включая прозрачные области PNG или SVG, поэтому у тени иконки контур иконки.
Как сделать изображение черно-белым в CSS?
Используйте filter: grayscale(100%); (или grayscale(1)). Добавьте переход и filter: grayscale(0) при наведении, чтобы вернуть цвет.
Можно ли использовать несколько фильтров сразу?
Да, перечислите их через пробел: filter: grayscale(1) brightness(1.2) blur(1px);. Они применяются по порядку, поэтому порядок может менять результат. Второе объявление filter заменяет первое.