CSS-свойство background-blend-mode определяет, как несколько фоновых слоёв одного элемента смешиваются между собой — фоновое изображение с цветом фона, два градиента друг с другом, изображение с градиентом. Формула бленда одна и та же, что в Photoshop или Figma: multiply, screen, overlay, difference и ещё дюжина режимов, каждый со своим математическим правилом наложения.

.hero {
  background-image: url('photo.jpg');
  background-color: #14336f;         /* глубокий синий */
  background-blend-mode: multiply;   /* фото окрашивается в синий */
}

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

Затемняющие режимы: multiply, darken, color-burn

Все три делают результат темнее исходной картинки. Разница — в математике смешивания.

  • multiply — значения RGB перемножаются и делятся на 255. Белый цвет становится прозрачным (не влияет), чёрный полностью закрашивает, промежуточные тона окрашивают. Самый ходовой режим для tint-эффектов;
  • darken — для каждого пикселя берётся тёмный из двух слоёв. Работает как маска «оставить только тени»;
  • color-burn — агрессивная версия multiply: сильно затемняет средние тона, тени становятся насыщенными. Похоже на «выжигание» цвета.

Классический рецепт — винтажный tint. Хочешь превратить обычную фотографию в вечернюю, ностальгическую? Наложи на неё тёплый цвет через multiply:

.vintage-photo {
  background-image: url('photo.jpg');
  background-color: #d4a574;      /* тёплый бежево-охристый */
  background-blend-mode: multiply;
  /* результат — фото в сепия-подобной гамме */
}

Осветляющие режимы: screen, lighten, color-dodge

Зеркальная семья затемняющих. Делают результат светлее.

  • screen — инверсия multiply. Значения инвертируются, перемножаются, снова инвертируются. Чёрный не влияет, белый полностью закрашивает. Идеально для добавления «свечения»;
  • lighten — берётся светлый из двух пикселей. Обратно darken;
  • color-dodge — агрессивное осветление, средние тона теряют насыщенность. Хорошо для эффекта «засветки».

Рецепт: hero-баннер с читаемым текстом на фото. Тёмный градиент через screen осветляет верх, где ляжет заголовок:

.hero {
  background:
    linear-gradient(to bottom, rgba(0,0,0,0.7) 0%, transparent 60%),
    url('background.jpg');
  background-blend-mode: multiply, normal;
  color: white;
}

Режимы контраста: overlay, hard-light, soft-light, difference, exclusion

Здесь эффект зависит от того, светлый или тёмный пиксель — логика ветвится.

  • overlay — светлые пиксели фонового цвета работают как screen, тёмные — как multiply. Сохраняет средние тона, усиливает контраст;
  • hard-light — overlay наоборот: критерий берётся из фонового изображения, а не из цвета. Более резкий эффект;
  • soft-light — смягчённая версия overlay. Как рассеянный прожектор поверх фото;
  • difference — вычитание. Одинаковые пиксели дают чёрный, инвертированные — белый. Даёт психоделические кислотные эффекты;
  • exclusion — смягчённая difference, меньше насыщенных цветов.

Рецепт: dramatic-эффект для героя лендинга. Насыщенный цвет через overlay даёт то, что дизайнеры называют «киношным градингом» — сохраняются полутона, но насыщенность растёт:

.dramatic-hero {
  background-image: url('portrait.jpg');
  background-color: #2c1250;      /* глубокий фиолетовый */
  background-blend-mode: overlay;
}

Компонентные режимы: hue, saturation, color, luminosity

Эта группа работает не по RGB-каналам, а по HSL-компонентам (оттенок, насыщенность, яркость). Каждый режим сохраняет одни компоненты и подменяет другие.

  • hue — оттенок из фонового цвета, насыщенность и яркость из изображения. Перекрашивает фото в один тон, сохраняя контраст;
  • saturation — насыщенность из цвета, остальное из изображения. Позволяет обесцветить или, наоборот, форсировать сатурацию;
  • color — и оттенок, и насыщенность из фонового цвета; только яркость из фото. Классический duotone-эффект;
  • luminosity — яркость из изображения, оттенок и насыщенность из цвета. Обратный color, чаще всего даёт монохромную тонировку.

Рецепт: duotone одним свойством, без Photoshop. Кладём фото и цвет, включаем luminosity или color — получаем эффект, за который в Photoshop чистят карму часами:

.duotone {
  background-image: url('photo.jpg');
  background-color: #ff2e63;         /* контрастный розовый */
  background-blend-mode: luminosity;
  /* фото перекрашено в розовый, с сохранением тональных переходов */
}

Мульти-слойный синтаксис

Элемент может иметь несколько фоновых слоёв через запятую в background-image. Для каждого можно указать свой blend-mode — тоже через запятую в background-blend-mode. Слои считаются сверху вниз (первый в списке — верхний):

.layered {
  background:
    linear-gradient(45deg, #ff2e63 0%, transparent 60%),  /* слой 1 (верхний) */
    linear-gradient(-45deg, #08d9d6 0%, transparent 60%), /* слой 2 */
    url('texture.jpg'),                                   /* слой 3 */
    #1a2434;                                              /* фоновый цвет (низ) */
  background-blend-mode: screen, screen, multiply;
  /* слой 1 через screen поверх слоя 2,
     то что получилось — через screen поверх слоя 3,
     и это через multiply поверх фонового цвета */
}

Значений в background-blend-mode может быть меньше, чем слоёв — браузер зациклит список. То есть background-blend-mode: multiply при трёх фонах применит multiply ко всем.

background-blend-mode vs mix-blend-mode — частая путаница

Два похожих по имени свойства делают разные вещи.

/* background-blend-mode: смешивает фоны ВНУТРИ одного элемента */
.a {
  background-image: url('photo.jpg');
  background-color: red;
  background-blend-mode: multiply;
  /* фото смешивается со своим же background-color */
}

/* mix-blend-mode: смешивает ЭЛЕМЕНТ с тем, что ЗА ним в DOM */
.b {
  mix-blend-mode: difference;
  /* элемент .b накладывается со своей поверхности на родителя */
}

Правило простое: если нужно смешать фоны одного элементаbackground-blend-mode. Если нужно смешать один элемент с другимmix-blend-mode. Классический кейс mix-blend-mode — текст, который меняет цвет в зависимости от того, что под ним (например, белый на светлом фоне и чёрный на тёмном одновременно).

Подводные камни

Производительность на мобильных. Каждый бленд-мод требует композита слоёв на GPU. Один элемент с одним blend-mode — незаметно. Пять элементов с blend-mode на анимированном стриме — уже могут дать jank. Проверяй в DevTools → Performance → Layers, что бленды не подсвечивают «paint» на скролле.

Взаимодействие с filter и backdrop-filter. Оба свойства создают stacking context, и blend-mode применяется внутри этого контекста, не выходя наружу. Хочешь blend через несколько родителей — убедись, что промежуточные не имеют filter, transform или opacity < 1.

background-attachment: fixed. Фиксированный фон + blend-mode работают, но в некоторых мобильных браузерах (особенно iOS Safari) даёт заметные лаги на скролле — фиксированный фон сам по себе тяжёлый, а бленд поверх делает хуже. По возможности используй CSS position: sticky на элементе-обёртке вместо fixed-фона.

Разница между normal и initial. Начальное значение — normal (никакого блендинга). initial — общее CSS-ключевое слово, сбрасывающее свойство в его начальное значение. Функционально они здесь эквивалентны, но в коде принято писать normal — яснее для читателя, что именно происходит.

Поддержка браузерами
chrome
Chrome
35
firefox
Firefox
30
edge
Edge
79
safari
Safari
10.1
opera
Opera
22