Advertisement
  1. Web Design
  2. UX/UI
  3. Design Theory

Режимы смешивания в CSS: Цветовая теория и практическое применение.

Scroll to top

() translation by (you can also view the original English article)

Вы можете быть знакомы с "режимами смешивания", если вы пользуетесь Photoshop; они позволяют совмещать слои разными способами и с ними интересно экспериментировать. Режимы смешивания в CSS полностью не поддерживаются на данный момент, но они на пути к этому.

В этом туториале мы разберем, как работают режимы смешивания и рассмотрим разные способы применения этих режимов посредством CSS.

Основы смешивания

Если вы никогда не работали с режимами смешивания, то на первый взгляд, то, как они работают может выглядеть немного неясным. Давайте рассмотрим подробнее.

Что же "режим смешивания" значит на самом деле?

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

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

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

An untreated image of a jellyfishAn untreated image of a jellyfishAn untreated image of a jellyfish
Оригинальная картинка с медузой
The same jellyfish with a solid orange layer placed over itThe same jellyfish with a solid orange layer placed over itThe same jellyfish with a solid orange layer placed over it
Та же картинка с непрозрачным оранжевым слоем-"исходником" наложенным поверх.
Heres the orange layer with the screen blending mode appliedHeres the orange layer with the screen blending mode appliedHeres the orange layer with the screen blending mode applied
Тот же исходник с режимом наложения "экран" ("screen")

Займёмся вычислениями

Если у вас действительно амбициозны, посмотрите официальную документацию W3C FX Task Force, в которой объясняются математические операции для каждого режима смешивания (наложения). Там приводятся формулы, которые использутся при вычислении результатов наложения.

Cm = B(Cb, Cs)
  • Здесь, Cm - результирующий цвет после наложения.
  • B обозначает функцию наложения.
  • Cb обозначает цвет фона.
  • И переменная  Cs для источника цвета.

Все цвета описываются в пределах шкалы 0-1, которая преобразуется в шкалу rgb с диапазоном 0-255.

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

Все режимы смешивания могут возвращать цвета которые лежат в диапазоне от 0 до 255. Все что за пределами этого диапазона, будет обрезаться. Когда вы видите большую полощадь белого или черного цвета после наложения, вероятно, что в этих областях, произошло обрезание величин.

Типы Режимов Наложения Доступные в CSS

В СSS режимы наложения, поддерживаются, и существуют разные варианты. Первый тип режима наложения называется background-blend-mode. Это свойство позволяет вам смешать все фоны внутри одного элемента друг с другом.

Если, например, вы зададите, фон с несколькими изображениями (поддерживается во всех браузерах выше IE8), первое изображение будет обрабатываться как источник,  и другие изображения добавленные потом, будут обрабатываться как фоновые изображения, лежащие под первым.

При добавлении цвета (который должен быть последним в списке) создается в самом низу дополнительный слой. Цветной фон будет отрабатываться как фоновое изображения, а  изображение, как источник. Рассмотрим это на примере:

1
div {
2
    background: 
3
    url(img/pattern.png), 
4
    url(img/jellyfish.jpg),  
5
    #f07e32 ;
6
}

Это дает нам:

И далее мы можем добавить режим наложения, чтобы все смешать:

1
div {
2
    background: 
3
    url(img/pattern.png), 
4
    url(img/jellyfish.jpg),  
5
    #f07e32 ;
6
    background-blend-mode: screen;
7
}

Здесь у нас два div-а, один используется без режима наложения, а другой с ним:

Второй тип наложения, mix-blend-mode, позволяет независимые элементы смешивать друг с другом. Это более специфичный режим, но смешивание происходит в "контексте наложения".

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

1
.my-overlay-element {
2
  background-color: #f07e32;
3
  background-image: url(img/jellyfish.jpg); // Note: This image will not be blended with the background color.
4
  mix-blend-mode: color-dodge;
5
}

Ниже, вы можете найти интерактивную демонстрацию, для исследования эффектов данного наложения.

Разделяемые Режимы Наложения

Давайте рассмотрим доступные режимы наложения, проверив используемые формулы, и применим их к красному кругу размещенному поверх нашей медузы.

Без использования наложения

Screen:

1
B(Cb, Cs) = 1 - [(1 - Cb) x (1 - Cs)]

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

Screen blend modeScreen blend modeScreen blend mode
Режим наложения Screen

Darken:

1
B(Cb, Cs) = min(Cb, Cs)

Выбирает более темный из двух цветов.

Darken blend modeDarken blend modeDarken blend mode
Режим наложения Darken

Lighten:

1
B(Cb, Cs) = max(Cb, Cs)

Выбирает более светлый из двух цветов.

Lighten blend modeLighten blend modeLighten blend mode
Режим наложения Lighten

Color dodge:

1
if(Cb == 0)
2
    B(Cb, Cs) = 0
3
else if(Cs == 1)
4
    B(Cb, Cs) = 1
5
else

6
    B(Cb, Cs) = min(1, Cb / (1 - Cs))

Режим Color dodge высветляет фоновый цвет, отражая цвет источника.

Color dodge blend modeColor dodge blend modeColor dodge blend mode
Режим наложения Color dodge

Color burn:

1
if(Cb == 1)
2
    B(Cb, Cs) = 1
3
else if(Cs == 0)
4
    B(Cb, Cs) = 0
5
else

6
    B(Cb, Cs) = 1 - min(1, (1 - Cb) / Cs)

Color burn затемняет фоновый цвет, увеличивая контраст между источником и фоном.

Color burn blend modeColor burn blend modeColor burn blend mode
Режим наложения Color burn

Hard light:

1
if(Cs <= 0.5)
2
    B(Cb, Cs) = Multiply(Cb, 2 x Cs)
3
else

4
    B(Cb, Cs) = Screen(Cb, 2 x Cs -1)  

Использует умножения для светлых цветов и режим screen для темных. По сути, “hard light” является противоположностью режиму “overlay”, который идет у нас следующим.

Hard light blend modeHard light blend modeHard light blend mode
Режим наложения Hard light

Overlay:

1
B(Cb, Cs) = HardLight(Cs, Cb)

Использует режим “screen” для светлых цветов и  “multiply” для темных; записывается так же как и “hard light”, только аргументы меняются местами.

Overlay blend modeOverlay blend modeOverlay blend mode
Режим наложения  Overlay

Soft light:

1
if(Cs <= 0.5)
2
        B(Cb, Cs) = Cb - (1 - 2 x Cs) x Cb x (1 - Cb)
3
    else

4
        B(Cb, Cs) = Cb + (2 x Cs - 1) x (D(Cb) - Cb)
5
with
6
    if(Cb <= 0.25)
7
        D(Cb) = ((16 * Cb - 12) x Cb + 4) x Cb
8
    else

9
        D(Cb) = sqrt(Cb)

При этом режиме наложения используется умножение для темных областей и режим screen, для светлых (похож на screen).

В этом алгоритме мы видим вторичную функцию D, которая задается в множестве with на основе доли синего цвета в цвете. Конечный результат обычно намного более мягкий, чем «overlay».

Sof light blend modeSof light blend modeSof light blend mode
Режим наложения Soft light

Difference:

1
B(Cb, Cs) = | Cb - Cs |

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

Difference blend modeDifference blend modeDifference blend mode
Режим наложения Difference

Exclusion:

1
B(Cb, Cs) = Cb + Cs - 2 x Cb x Cs

Режим exclusion похож на “difference”, за исключением того, что подобные цвета приводят к более низкому контрасту между величинами (менее темным областям).

Exclusion blend modeExclusion blend modeExclusion blend mode
Режим наложения Exclusion

Не-разделяемые Режимы Наложения

При расчете не-разделяемых режимов наложения используются дополнительные функции, которые включаются в себя функцию ClipColor,  функцию SetLum, и функцию Sat .

Важное замечание: Safari не поддерживает режимы “hue”, “saturation”, “color”, или “luminosity” ни в режиме mix-blend-mode ни в режиме background-blend-mode.

1
ClipColor(C)
2
  l = Lum(C)
3
  n = min(Cred, Cgreen, Cblue)
4
  x = max(Cred, Cgreen, Cblue)
5
6
  if n < 0.0
7
    Cred = l + (((Cred - l) * l) / (l - n))
8
    Cgreen = l + (((Cgreen - l) * l) / (l - n))
9
    Cblue = l + (((Cblue - l) * l) / (l - n))
10
11
  if x > 1.0
12
13
    Cred = l + (((Cred - l) * (1 - l)) / (x - l))
14
    Cgreen = l + (((Cgreen - l) * (1 - l)) / (x - l))
15
    Cblue = l + (((Cblue - l) * (1 - l)) / (x - l))
16
17
  return C
18
19
SetLum(C, l)
20
  d = l - Lum(C)
21
  Cred = Cred + d
22
  Cgreen = Cgreen + d
23
  Cblue = Cblue + d
24
25
  return ClipColor(C)
26
27
Sat(C) = max(Cred, Cgreen, Cblue) - min(Cred, Cgreen, Cblue)

Обратите внимание, что функции min, mid и max вычисляют минимальную, максимальную и среднюю величины соответственно. (Мid - это не среднее значение трех величин) Величины Cred, Cgreen и Cblue - обозначаются количество красного, зеленого и синего цвета представленное в цвете С.

Разобравшись с этими определениями, мы теперь можем взглянуть на неразделяемые режимы наложения.

Hue:

1
B(Cb, Cs) = SetLum(SetSat(Cs, Sat(Cb)), Lum(Cb))

Этот режим применяет оттенок исходного слоя к яркости и насыщенности цвета фона.

Hue blend modeHue blend modeHue blend mode
Режим наложения Hue (оттенок)

Saturation:

1
B(Cb, Cs) = SetLum(SetSat(Cb, Sat(Cs)), Lum(Cb))

Этот режим делает то же самое, что и режим hue-«оттенок», но вместо этого применяет насыщенность переднего плана к оттенку и яркости фона.

Saturation blend modeSaturation blend modeSaturation blend mode
Режим наложения Saturation (Насыщенность)

Color:

1
B(Cb, Cs) = SetLum(Cs, Lum(Cb))

Применяет оттенок и насыщенность переднего плана к яркости фона.

Color blend modeColor blend modeColor blend mode
Режим наложения Color (цвет)

Luminosity:

1
B(Cb, Cs) = SetLum(Cb, Lum(Cs))

Этот режим применяет яркость слоя с источником к оттенку и насыщенности фонового слоя.

Luminosity blend modeLuminosity blend modeLuminosity blend mode
Режим наложения Luminosity

Заключение

Режимы наложения в CSS дают новую возможность и гибкость, позволяют эксперементировать с эстетикой дизайна. Понимание математики и теории цвета, которые стоят за этими режимами наложения, дает для вас доступным более целостное и осознанное использование этого инструмента.

Что вы будете делать, если браузеры будут развивать возможности использования режимов наложения?

Ссылки по теме

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.