Background-blend-mode

На этой неделе в Firefox 30 было включено по умолчанию свойство background-blend-mode. Таким образом, Firefox стал третьим браузером, поддерживающим это свойство (два других — Opera и Chrome). Safari будет поддерживать это свойство в следующей версии, про планы IE мне ничего найти не удалось.

Внимание: все демо в посте — действующие примеры без фолбеков. Для просмотра лучше всего воспользоваться последними версиями Chrome, Opera или Firefox.

Что делает это новое свойство и какие возможности оно нам дает?

background-blend-mode управляет режимами наложения слоев фона, заданного в CSS.

Пример:

See the Pen gftIl by yoksel (@yoksel) on CodePen.

Наведите курсор на картинку, чтобы увидеть исходное изображение.

background-blend-mode аналогичен режимам наложения слоев в фотошопе, и список возможных значений свойства вам, скорее всего, покажется знакомым:

  • normal
  • multiply
  • screen
  • overlay
  • darken
  • lighten
  • color-dodge
  • color-burn
  • hard-light
  • soft-light
  • difference
  • exclusion
  • hue
  • saturation
  • color
  • luminosity

Как это работает?

Возьмем, к примеру, картинку с котиком и зададим её фоном:

background: teal url(http://placekitten.com/250/200);

Для наложения слоев обязательное условие, чтобы слоев было больше одного. В нашем случае первым слоем является цвет (teal).

Теперь можно добавить режим наложения, например:

background: teal url(http://placekitten.com/250/200);
background-blend-mode: hard-light;

Результат:

See the Pen kGAsK by yoksel (@yoksel) on CodePen.

Вы можете поиграться с режимами здесь или посмотреть их списком на одной странице вот тут.

Слоев фона может быть больше двух, и для каждого слоя можно отдельно задавать режим наложения:

background: teal url(http://placekitten.com/250/200);
background-blend-mode: hard-light, multiply, normal;

Фоны могут содержать не только изображения, но и градиенты, что позволяет делать разные интересные эффекты:

See the Pen mJohl by yoksel (@yoksel) on CodePen.

Как можно использовать background-blend-mode?

Предположим, есть сайт в определенной цветовой гамме, и в дизайне нужно разместить несколько картинок:

See the Pen background-blend-mode for usage in design by yoksel (@yoksel) on CodePen.

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

background-blend-mode: luminosity;

Результат:

See the Pen background-blend-mode for usage in design by yoksel (@yoksel) on CodePen.

Способ имеет свои преимущества:

  1. Экономит время — не нужно вручную красить картинки, используемые в дизайне. Особо пригодятся режимы наложения в прототипировании, когда картинки, скорее всего, ещё будут меняться.
  2. Позволяет легко сделать эффект, когда при наведении картинка показывается в оригинальном цвете. При этом не нужно готовить два изображения и менять их по наведению курсора — достаточно одного.

А если потом изменится цветовая схема сайта — не нужно будет заново перекрашивать картинки под новую схему — всё произойдет само собой:

See the Pen background-blend-mode for usage in design by yoksel (@yoksel) on CodePen.

Правда, мне не удалось сделать плавную смену режимов наложения. Насколько я понимаю, они не анимируются. Но это можно обойти используя псевдоэлементы: через :before создается дублирующий слой с той же картинкой, и ему по наведению меняется прозрачность — это можно сделать плавно (пример справа):

See the Pen FCLHx by yoksel (@yoksel) on CodePen.

Ещё один способ покрасить картинку в дизайне — подложить полосатый градиент:

See the Pen background-blend-mode for usage in design by yoksel (@yoksel) on CodePen.

Приятный бонус background-blend-mode — плавная деградация: если браузер не поддерживает режимы наложения, посетитель увидит обычную картинку. Может быть, она будет не очень вписана в цветовую схему, но это лучше чем ничего.

Интересно, что в некоторых режимах результат различается в зависимости от того, наложена ли картинка на цвет или цвет поверх картинки (слева картинка поверх цвета, справа наоборот):

See the Pen Is it matter color on top or image on top? by yoksel (@yoksel) on CodePen.

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

С изображениями всё более-менее понятно, но вот для CSS-градиентов режимы наложения поистине открывают новые горизонты. Теперь слои градиентов могут не просто просвечивать друг под другом в областях полной или частичной прозрачности, но также они могут взаимодействовать с нижележащими слоями, образовуя новые сочетания. Делать такие градиенты безусловно сложнее, но и интереснее тоже.

Уже есть первая галерея с примерами: bennettfeely.com/gradients/. Ниже на странице можно найти JS-фолбек и взвешивание одних и тех же градиентов, сделанных на CSS или в виде изображений различных форматов. CSS, конечно, выигрывает.

И даже если пока что не все браузеры позволяют использовать background-blend-mode, имеет смысл поинтересоваться какие из используемых вами изображений уже можно заменить CSS-паттернами, чтобы получить выигрыш в весе и производительности.

Вдохновившись примерами из галереи, я решила посмотреть что ещё можно сделать. Одно из забавных открытий — шахматная доска:

See the Pen Easy way to make chess-board : ) by yoksel (@yoksel) on CodePen.

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

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

Ещё несколько градиентов:

See the Pen Playing with background-blend-mode by yoksel (@yoksel) on CodePen.

See the Pen Grassy waves by yoksel (@yoksel) on CodePen.

See the Pen Playing with background-blend-mode by yoksel (@yoksel) on CodePen.

See the Pen Sunny by yoksel (@yoksel) on CodePen.

See the Pen Rainbow eyes by yoksel (@yoksel) on CodePen.

See the Pen Lightblue by yoksel (@yoksel) on CodePen.

See the Pen Rainbow cells by yoksel (@yoksel) on CodePen.

See the Pen Water by yoksel (@yoksel) on CodePen.

See the Pen vbwKF by yoksel (@yoksel) on CodePen.

See the Pen Red by yoksel (@yoksel) on CodePen.

See the Pen Radial gradients + background-blend-mode by yoksel (@yoksel) on CodePen.

See the Pen The Cicada background + background-blend-modes by yoksel (@yoksel) on CodePen.

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

background-blend-mode выглядит очень привлекательно, позволяя добавить немного магии фотошопа в привычный CSS.

Ссылки по теме:
The background-blend-mode property
Background blending now available in Firefox 30
Gradients gallery
Getting to know CSS Blend Modes
CSS-паттерны
Свежие CSS-паттерны
СSS-градиенты и 3D
Секреты режимов наложения
CSS Image Effects
Если вы нашли ошибку или неточность, вы можете отредактировать статью с помощью prose.io, а также можно написать мне в комментариях или в Twitter.
Система комментирования от Disqus