Menu

Размытие и фильтры в CSS: blur(), grayscale, brightness

filter: blur(5px) размывает элемент, а backdrop-filter: blur() размывает то, что за ним. Разберем все функции фильтров (brightness, contrast, grayscale, sepia, saturate, hue-rotate, invert, drop-shadow) с живыми ползунками, как их сочетать и проблему размытых краев.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Как размыть элемент

filter: blur() принимает длину, радиус размытия. Чем он больше, тем сильнее размыт элемент:

filter работает с любым элементом, а не только с изображениями: размытый div размывает и свой текст, рамку и дочерние элементы. Обратите внимание на мягкие края у размытых изображений: размытие растягивает картинку наружу и подмешивает прозрачную область вокруг. Решение ниже, в разделе «Проблема размытых краев».

Размытие фона: backdrop-filter

Чтобы размыть то, что за элементом (панель из матового стекла поверх фотографии или страницы), используйте backdrop-filter. Собственное содержимое элемента остается четким. Чтобы размытие было видно, нужен полупрозрачный фон:

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

Все функции фильтров вживую

Двигайте любой ползунок. Строка под изображением это точное значение filter, готовое к копированию:

Выводятся только функции, которые вы сдвинули с нейтрального значения, поэтому значение остается коротким. brightness(1) или blur(0px) ничего не меняют, так что перечислять их незачем.

Функции фильтров

ФункцияНейтральное значениеЧто делаетПример
blur(r)0гауссово размытие с радиусом rblur(4px)
brightness(n)1темнее ниже 1, ярче вышеbrightness(0.7)
contrast(n)1площе ниже 1, контрастнее вышеcontrast(1.3)
grayscale(n)01 (или 100%) полностью серыйgrayscale(100%)
sepia(n)0теплый коричневый тонsepia(0.6)
saturate(n)10 серый, выше 1 насыщеннееsaturate(1.5)
hue-rotate(a)0degсдвигает каждый тон по цветовому кругуhue-rotate(90deg)
invert(n)01 это полный цветовой негативinvert(1)
opacity(n)1как свойство opacityopacity(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 заменяет первое.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ