Статьи

Создавайте потрясающие эффекты изображения с помощью CSS Backdrop-фильтра

CSS свойство фонового фильтра

Сегодня мы собираемся узнать о свойстве CSS background-filter CSS, которое было введено в спецификации Filter Effects Module Level 2. В частности, мы рассмотрим синтаксис свойства backdrop-filter , поддержку браузера и практические приложения .

Все изображения, включенные в демоверсии этой статьи, взяты с Pixabay.com .

Фоновый фильтр — это не то же самое, что фильтр

Вы, наверное, уже слышали о CSS-фильтрах. Если вам нужно освежить в этой теме, CSS Filter Effects: Blur, Grayscale, Brightness и More в CSS! это отличное чтение.

В то время как свойство filter помогает нам применять эффекты, такие как размытие и сепия, к данному элементу, свойство backdrop-filter поможет нам применить те же эффекты к области позади элемента . Вот демонстрация, чтобы проиллюстрировать разницу (убедитесь, что вы используете способный браузер, такой как Chrome, с включенным флагом Experimental Web Platform Features — подробнее о поддержке браузера в следующем разделе):

В первом случае фильтр был применен ко всему изображению, во втором случае он просто был применен к части прямо за нашим текстовым содержимым. Я хотел бы прояснить, что эффект применяется не к собственному фону элемента, а к тому, что находится ниже элемента. Вы также должны держать собственный фон элемента как минимум слегка прозрачным, иначе посетители не смогут увидеть предполагаемые визуальные эффекты.

Поддержка синтаксиса и браузера

Свойство backdrop-filter имеет ряд общих свойств со свойством filter которым вы, вероятно, уже знакомы. Вы можете применить его к любому элементу, используя следующий синтаксис:

 backdrop-filter: <filter-function> [<filter-function>]* | none 

Как и свойство filter , вы можете применить несколько фильтров к фону элемента. Все значения, которые действительны для свойства filter , также действительны для свойства backdrop-filter . Это свойство также можно анимировать.

Несмотря на много общего между обоими свойствами, backdrop-filter не имеет такой же широкой поддержки браузера, как свойство filter . В настоящее время только Safari 9 поддерживает это свойство без флага, и даже в этом случае вы должны использовать префикс -webkit- .

Для Chrome и Opera вы можете включить флаг «Экспериментальные возможности веб-платформы» в «chrome: // flags». Свойство вообще не поддерживается в Firefox и Edge. Подробнее о поддержке браузером backdrop-filter вы можете прочитать в backdrop-filter Могу ли я использовать» .

Использование Backdrop-фильтра

Для свойства backdrop-filter необходимы по крайней мере два элемента — целевой элемент и другой элемент прямо под нашей целью, к которому будут применены эффекты. Чтобы создать эффект фона в нашей демонстрации выше, мы использовали следующую разметку:

 <div class="backdrop"> <div class="content"> <h3>A Heading</h3> <p>Some random text related to the heading.</p> </div> </div> 

Мы также использовали следующий CSS, чтобы применить фильтр к фону нашего элемента и установить фон для нашего текстового содержимого:

 .backdrop { background: url('path/to/image.jpg'); } .content { position: relative; top: 30%; background: rgba(100,150,100,0.35); backdrop-filter: hue-rotate(180deg); } 

Еще одно интересное использование этого свойства — применение разных фильтров к разным частям изображения. Я не говорю о применении нескольких фильтров одновременно ко всему изображению, что, кстати, также возможно. Я говорю о применении, скажем, фильтра в grayscale в левой части нашего изображения и фильтра sepia в правой части, или разделите изображение на несколько частей и примените hue-rotate ко всем частям с различными значениями. Один из способов добиться этого — установить непрозрачность наших целевых элементов на ноль, чтобы они не мешали изображению под ними, к которому мы пытаемся применить фильтры.

background-filter Пример свойства нескольких фильтров бок о бок

Вот разметка, которая вам нужна:

 <div class="backdrop"> <div class="target a"> </div> <div class="target b"> </div> .... </div> 

И это CSS:

 .target { position: absolute; top: 0%; height: 100%; width: 20%; opacity: 0; } .a { left: 0%; backdrop-filter: hue-rotate(30deg); } .b { left: 20%; backdrop-filter: hue-rotate(90deg); } /* Filters for other sections of the image */ 

Это окончательный результат в моем случае:

То, насколько хорошо изображение будет выглядеть в конечном итоге, будет зависеть от вашего изображения, а также от выбранных вами фильтров, но при правильном использовании это свойство может создавать действительно интересные эффекты. Вы должны поэкспериментировать с различными фильтрами, чтобы увидеть, что вы можете придумать сами.

Мы также можем анимировать различные свойства наших целевых элементов. Например, в следующей демонстрации есть два элемента div в верхней части нашего изображения, и я применил свой фильтр к каждому из них.

Фоновый фильтр Свойство Animating Target Example

Когда кто-то наводит курсор на изображение, ширина первого элемента div и высота второго элемента изменяются с 0% до 80% в течение периода 0,5 с. Это делит наше изображение на четыре различных раздела, каждый со своей собственной комбинацией фильтров, примененных к нему:

Другие возможности включают использование фильтров SVG и анимацию фильтров, применяемых к целевым элементам.

Приложения

Создание всех этих причудливых эффектов с использованием backdrop-filter — это хорошо, но свойство также может иметь множество практических приложений. Одна вещь, которая сразу пришла мне в голову, когда я узнал об этом свойстве, это то, как мы можем использовать его, чтобы размыть изображение и предупредить пользователей, прежде чем показывать им некоторый графический контент.

Размытие с использованием фонового фильтра

Это разметка, которая нам нужна для начала:

 <div class="graphic-content"> <img src="path/to/graphic/image.jpg"> <div class="warning"> <p>Click on the button below to see the image from the murder scene.</p> <button>Show Me</button> </div> </div> 

Мы обертываем изображение, которое мы собираемся размыть, и текст предупреждения внутри div . Текст предупреждения дополнительно оборачивается внутри другого div , ширина и высота которого равна ширине изображения.

А вот CSS для создания эффекта размытия на изображении:

 .warning { background: rgba(0,0,0,0.75); backdrop-filter:contrast(4) blur(20px); } 

Вы можете поэкспериментировать с различными цветами фона и фильтрами, чтобы увидеть, что подходит вам больше всего. В демоверсии я также добавил немного JavaScript, чтобы скрыть текст предупреждения после того, как пользователь нажимает кнопку «Показать меня». Вы должны попробовать это:

Вы также можете использовать свойство backdrop-filter для создания размытого фона при показе пользователю модального изображения или для размытия фона позади меню вне холста, когда оно появляется. Другое использование backdrop-filter — размытие изображений на вашей веб-странице до тех пор, пока они не будут полностью загружены, как они это делают на Medium .

Вывод

Используя свойство backdrop-filter , вы сможете воссоздать множество эффектов, для которых ранее требовался JavaScript. Тем не менее, я бы рекомендовал подождать, пока браузер не получит достаточную поддержку, прежде чем использовать его в работе. Еще одна вещь, которую вы должны иметь в виду при использовании backdrop-filter это производительность . Использование этого свойства на значительном количестве элементов или на большой площади вашей веб-страницы отрицательно скажется на производительности.

Вы можете прочитать больше о свойстве backdrop-filter в черновике W3C и документации MDN .

Можете ли вы предложить какие-либо другие интересные варианты использования этого имущества? Как вы планируете использовать его в будущем? Дайте нам знать об этом в комментариях.