В настоящее время CSS предоставляет нам возможность применять к изображениям цветовые эффекты с помощью свойства filter
, такие как насыщенность (saturation
), яркость (lightness
) и контрастность (contrast
), а также другие эффекты, которые основаны на использовании специальной функции filter
.
Фильтры чаще всего используются для изображений, т.к. именно в изображениях используется масса цветов, поэтому фильтры дают очень четкий видимый эффект.
Синтаксис добавления фильтра:
1 2 3 | img { filter: func(value); } |
Варианты функций для css-свойства filter
В качестве функций можно использовать следующие:
- Размытие
blur()
- Непрозрачность
opacity()
- Тень
drop-shadow()
- Оттенки серого
grayscale()
- Сепия
sepia()
- Инверсия цвета
invert()
- Поворот цвета
hue-rotate()
- Яркость
brightness()
- Контраст
contrast()
- Насыщенность
saturate()
url()
— для SVG filters
Для каждого фильтра нужно указывать его значение в круглых скобках. Например:
1 2 3 | img { filter: opacity(0.5); } |
Этот код сделает изображение прозрачным на 50%, поскольку opacity()
имеет диапазон от 0 до 1 или процентное значение.
Мы также можем применить несколько фильтров в одной строке:
1 2 3 | img { filter: blur(20px) grayscale(20%); } |
Рассмотрим каждый фильтр подробно. Все они представлены в этом примере, но синтаксис и единицы изменений у фильтров различаются.
See the Pen CSS Filters by Fili Santillán (@filisantillan) on CodePen.
Размытиеblur()
Фильтр blur()
применяет эффект размытия к элементу. Выбранное значение определяет размер радиуса размытия. Чем выше значение, тем больше пикселей будет смешиваться, что создает большее размытие.
1 2 3 | img { filter: blur(4px); } |
Значение для фильтра можно указывать в px
, em
илиrem
.
Непрозрачность opacity()
Функция opacity()
применяет прозрачность к элементу. Фильтр принимает значение от 0 до 1 или процентное значение (например, 0,5
для 50%
), которое определяет прозрачность изображения. Значение 0 или 0%
дает полную прозрачность элемента, а 1 или 100 %
- полной непрозрачность, или другими словами, видимость элемента.
1 2 3 | img { filter: opacity(0.5); } |
В CSS также существует свойство opacity
(непрозрачность), которое указывается в диапазоне о 0 до 1. Однако производительность браузера выше при использовании свойства filter
, поэтому этот метод является предпочтительным.
Тень drop-shadow()
Фильтр drop-shadow() добавляет тень к элементу. Он принимает до 5 параметров, первые 2 из которых являются обязательными:
- offset-x определяет горизонтальное смещение.
- offset-y определяет вертикальное смещение.
1 2 3 | img { filter: drop-shadow(10px 10px); } |
- blur-radius (необязательное) определяет радиус размытия тени. По умолчанию 0 (без размытия).
1 2 3 | img { filter: drop-shadow(10px 10px 2px); } |
- spread-radius (необязательное), определяет радиус распространения. Указывается в
px
,rem
илиem
.
1 2 3 | img { filter: drop-shadow(10px 10px 2px 5px); } |
colour
(необязательное), определяет цвет тени.
1 2 3 | img { filter: drop-shadow(10px 10px 2px 5px rgba(0,0,0,.5)); } |
Пример стилизации элементов для речи персонажей и подсказок от Josetxu. Очень приятно смотрится с использованием градиента и псевдоэлементов ::after.
See the Pen Comic Speech Bubbles - CSS by Josetxu (@josetxu) on CodePen.
Оттенки серого grayscale()
Преобразует элемент в оттенки серого. Указывается в %
: 100%
соответствует полностью оттенкам серого, а 0%
оставляет элемент без изменений.
1 2 3 | img { filter: grayscale(50%); } |
Все фильтры вы можете протестировать с помощью этого примера:
See the Pen CSS Filters by Elen (@ambassador) on CodePen.
Сепия sepia()
Преобразует элемент в сепию. Опять же, значение задается в %: 100%
означает полную сепию, а 0%
оставляет элемент без изменений.
1 2 3 | img { filter: sepia(50%); } |
Инверсия цвета invert()
Фильтр инвертирует цвета элемента. Инверсия выбирает противоположный цвет в соответствии с цветовым кругом HSL.
Значение в 100%
полностью инвертирует все цвета, а значение в 0%
оставляет элемент неизменным. 50%
всегда будет отображать серый цвет, поскольку вы окажетесь в середине цветового круга.
1 2 3 | img { filter: invert(50%); } |
Пример инверсии в статье.
See the Pen Simple light&dark layout using CSS filters by Costanza Focardi (@MrsTreves) on CodePen.
Поворот цвета hue-rotate()
Цветовой круг представлен в градусах. Фильтр hue-rotate()
позволяет вращать цвет, используя положительное или отрицательное вращение. Функция принимает значение в градусах. При значении 0 градусов (0deg
) ничего не меняется, а значение 360 градусов (360deg
) является максимальным значением.
1 2 3 | img { filter: hue-rotate(90deg); } |
Яркость brightness()
Фильтрbrightness()
делает элемент более или менее ярким. При значении 0%
элемент будет выглядеть полностью черным. 100%
оставит элемент без изменений.
1 2 3 | img { filter: brightness(50%); } |
Контраст contrast()
Фильтр contrast()
изменяет контрастность элемента. При значении 0%
элемент будет выглядеть полностью серым, а 100%
оставит элемент без изменений.
1 2 3 | <span id="edb8" class="cp lm ln hc la b bv lo lp r lq" data-selectable-paragraph="">img { filter: contrast(150%); }</span> |
Пример использования контраста
Автор Dudley Storey
See the Pen Text Image Mosaic by Dudley Storey (@dudleystorey)on CodePen.
Насыщенность saturate()
Фильтр saturate()
изменяет насыщенность элемента. При значение 0% элемент является полностью ненасыщенным (т.е. будет полностью в оттенках серого). Значение 100%
оставляет элемент неизменным. Этот фильтр по действию напоминает grayscale()
.
1 2 3 | img { filter: saturate(30%); } |
SVG-фильтр url()
Фильтр url()
позволяет применить фильтр, определенный в файле SVG. Параметром будет местоположение файла.
1 2 3 | img { filter: url(filter.svg); } |
Это работает в случае, если фильтр описан во внешнем svg-файле. Если же <svg>
описан в этом же файле, то нужно указать id
внутреннего элемента <filter>
:
1 2 3 4 5 6 7 8 9 | <svg width="500" height="500" viewBox="0 0 500 500" id="myFilter"> <filter id="noise" > <feTurbulence baseFrequency="0.3" /> </filter> </svg> img { filter: url(#noise); } |
Дополнительную информацию о фильтрах SVG можно посмотреть в статьях:
Пример использования CSS-фильтра url()
:
See the Pen Text Morph by Valgo (@Valgo) on CodePen.
Еще один пример интересного использования SVG-фильтра для изображений на странице. Автор Tommy Ho.
See the Pen CPChallenge - Animated SVG filter 1 by Tommy Ho (@tommyho) on CodePen.
Генераторы CSS-фильтров
Можно также воспользоваться примерами ниже,
Здесь можно скопировать сразу несколько CSS-cвойств:
See the Pen CSS Filters by Elen (@ambassador) on CodePen.
Протестируйте каждое свойство в отдельности или в сочетании с другими.
See the Pen CSS Filters by Andreas Wik (@andreaswik) on CodePen.
Очень интересный генератор кода для фильтров с некоторыми стилями от Alexandre Vacassin. Используется много ползунков (<input type="range">
) для настроек фильтров.
See the Pen CSS / SVG Filter Generator by Alexandre Vacassin (@alexandrevacassin) on CodePen.
CSS-свойство backdrop-filter
Кроме свойства filter
можно применить еще одно свойство - backdrop-filter
. Разница между ними заключается в том, что свойство backdrop-filter
применяют к фоновому изображению, а не к тегу <img>
, как в примерах выше.
Значения backdrop-filter
такие же, как и для filter
. Задавать их элементам можно таким образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 | .element { backdrop-filter: <filter-function> [<filter-function>]* | none } /* например */ .my-bg{ backdrop-filter: blur(10px); } /* или */ .bg-section{ backdrop-filter: grayscale(0.5) hue-rotate(90deg); } |
В качестве примера можно посмотреть, как с помощью свойства backdrop-filter
можно "поменять день на ночь" (автор Jordan):
See the Pen Time sensitive background - #CodePenChallenge: filters by Jordan (@DeyJordan) on CodePen.
И от того же автора пример использования одного или нескольких фильтров:
See the Pen Demo Backdrop Filters by Elen (@ambassador) on CodePen.
Также вы можете посмотреть, как применять это свойство для создания эффекта размытого стекла.
Еще один пример анимации фона с применением backdrop-filter: blur()
и hue-rotate()
. Автор MOZZARELLA.
See the Pen Animated Hero | CSS filters by MOZZARELLA (@TheMOZZARELLA) on CodePen.
Практические примеры использования css-фильтров
Анимация фона с использованием фильтров от LM
See the Pen Multiple CSS filters and gradient by LM (@LMG)on CodePen.
Пример анимации с использованием фильтров
В этом примере фильтр blur()
дает отличный результат фокусировки на разных объектах. Автор Enger Bewza.
See the Pen #Codevember - Day 21 - Fight by Enger Bewza (@enger) on CodePen.
Еще один пример длинной анимации с фильтрами от EaterUsr.
See the Pen filter fest - challenge by EaterUsr (@EaterUsr) on CodePen.
Перспектива при прокручивании
Фильтр blur()
здесь работает также на создание эффекта перспективы
See the Pen scrollable CSS Depth of Field by Gaston Gougeon (@Glabill)on CodePen.
Еще один вариант перспективы создается с помощью фильтра blur()
при наведении на изображения. Одни из них как бы фокусируются, другие размываются. Автор Hayuse.
depth of field" user="dtweqbgd-the-vuer"]See the Pen [filter]depth of field by Hayuse (@dtweqbgd-the-vuer) on CodePen.
Сравнение картинок с фильтрами и без
Автор derp
See the Pen Compare Images by derp (@t_herper) on CodePen.
Картина с фильтрами и без от Zain Abbas. Нажмите кнопку внизу под деревом, чтобы отобразить панель с фильтрами.
See the Pen Interactive Filters - #MayCodePen Challenge (#codepenchallenge, #cpc-filter-fest) by Zain Abbas (@W3BUK) on CodePen.
Фотогалерея
Галерея изображений в серых тонах, основанная на css-grid. При наведении цвет "возвращается". Автор Teodora
See the Pen Hover me Photo gallery (responsive grid, CSS filters) by Teodora (@teodorachiosa) on CodePen.
Облака с фильтрами и без
Анимация облаков от Papiko, к которой можно добавить фильтры.
See the Pen CPC - JavaScript Fest by Papiko (@papiko) on CodePen.