OKLCH — лучший формат для цвета в CSS

Влад Мержевич

Традиционно цвета в CSS задаются с помощью модели RGB (red, green, blue — красный, зелёный, синий) в шестнадцатеричном формате. Вот, к примеру, как будет выглядеть белый цвет текста на зелёном фоне.

.primary { 
  background-color: #63a03e; /* Зелёный фон */
  color: #fff; /* Белый цвет */
}

Тот же цвет можно выразить и десятичными числами через стилевую функцию rgb().

.primary {
  background-color: rgb(99 160 62); /* Зелёный фон */
  color: rgb(255 255 255); /* Белый цвет */
}

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

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

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

Но есть и другая категория веб-дизайнеров, которые хотят задавать цвет другим способом. Для них в CSS введена поддержка цветовых моделей HSL, HWB, LAB, LCH и OKLCH. О последней и поговорим подробнее.

Цветовая модель OKLCH является улучшенной версией LCH (lightness, chroma, hue — светлота, цветность, оттенок), которая разработана для более точного и единообразного представления цвета, основанного на восприятии человеческого глаза, и обладает рядом преимуществ по сравнению с другими цветовыми моделями.

  • OKLCH основана на цветовом пространстве, которое лучше соответствует тому, как человеческий глаз воспринимает цвет.
  • OKLCH работает с цветовым пространством DCI-P3, благодаря чему в CSS открываются новые цвета, недоступные в традиционных форматах.
  • Изменение значения одного из параметров приводит к предсказуемому изменению воспринимаемого цвета. Это упрощает работу с цветом и позволяет дизайнерам точнее контролировать результат.
  • OKLCH исправил ошибку LCH, связанную с неожиданным сдвигом оттенка при изменении насыщенности и яркости для голубого цвета.

Цвет в OKLCH записывается с помощью трёх обязательных параметров: светлота, цветность и оттенок. Также при желании можно добавить четвёртый параметр, который регулирует степень прозрачности цвета.

Светлота

Представляет собой световую яркость цвета (рис. 1), измеряется в диапазоне от 0% (чёрный) до 100% (белый) или в числах от 0 до 1.

Светлота

Рис. 1. Светлота

Цветность

Определяет насыщенность или чистоту цвета; начинается с 0, а вот максимальное значение теоретически неограниченно, хотя на практике не превышает 0.5 (рис. 2). Вместо чисел можно использовать проценты от 0% до 100%, при этом 100% соответствует числу 0.4.

Цветность

Рис. 2. Цветность

Оттенок

Оттенок определяется с помощью цветового круга и задаётся в градусах от 0 до 360 (рис. 3).

Оттенок

Рис. 3. Оттенок

Посмотреть доступные цвета и подобрать их в формате OKLCH можно на сайте oklch.com (рис. 4).

Подбор цвета в формате OKLCH

Рис. 4. Подбор цвета в формате OKLCH

Для использования этой цветовой модели в CSS применяется стилевая функция oklch(), в которой параметры перечисляются через пробел. Вот несколько примеров.

background: oklch(62% 0.23 30); /* Красный */
background: oklch(76% 0.16 57); /* Оранжевый */
background: oklch(62% 0.15 150); /* Зелёный */
background: oklch(48% 0.23 273); /* Синий */
background: oklch(65% 0.15 315); /* Фиолетовый */

Если требуется сделать цвет полупрозрачным, то после косой черты добавляется значение альфа-канала в процентах от 0% до 100% или в числах от 0 до 1.0.

background: oklch(65% 0.25 355 / 80%); /* Полупрозрачный розовый цвет */
background: oklch(65% 0.17 254 / 40%); /* Полупрозрачный голубой цвет */

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

Пример 1. Использование oklch() для градиента

<!DOCTYPE html>
<html lang="ru">
 <head>
  <meta charset="utf-8">
  <title>OKLCH</title>
  <style>
   body {
    background-image: linear-gradient(
      oklch(30% 0.1 270),
      oklch(47% 0.17 270)
    );
    background-attachment: fixed;
   }
  </style>
 </head>
 <body>
 </body>
</html>

Результат данного примера показан на рис. 5.

Градиент

Рис. 5. Градиент

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

Цвета в HSL

Рис. 6. Цвета в HSL

В OKLCH смена оттенка не влияет на показатели светлоты и цветности (рис. 7).

Цвета в OKLCH

Рис. 7. Цвета в OKLCH

Из-за этой особенности, в CSS удобно применять формат OKLCH для однотипных разноцветных блоков. В примере 2 такие блоки выделяются фоном и цветной толстой линией слева. Обратите внимание, что в функции oklch() для каждого фона меняется только оттенок (третий параметр) и сохраняются значения светлоты и цветности. Для линии каждого блока оттенок, наоборот, остаётся прежним, а светлота и цветность меняются.

Пример 2. Использование oklch() для блоков

<!DOCTYPE html>
<html lang="ru">
 <head>
  <meta charset="utf-8">
  <title>OKLCH</title>
  <style>
   .callout {
    padding: 1rem; /* Расстояние от текста до края */
    margin-bottom: 1rem; /* Расстояние снизу */
    border-left: 5px solid; /* Линия слева */
   }
   .callout.info {
    background-color: oklch(96% 0.03 245); /* Цвет фона */
    border-left-color: oklch(76% 0.13 245); /* Цвет линии */
   }
   .callout.success {
    background-color: oklch(96% 0.03 155);
    border-left-color: oklch(76% 0.13 155);
   }
   .callout.warning {
    background-color: oklch(96% 0.03 85);
    border-left-color: oklch(76% 0.13 85);
   }
  </style>
 </head>
 <body>
  <div class="callout info">Информация</div>
  <div class="callout success">Успех</div>
  <div class="callout warning">Предупреждение</div>
 </body>
</html>

Результат данного примера показан на рис. 8.

Цветные блоки

Рис. 8. Цветные блоки

Итоги

  • Цветовая модель OKLCH применяется для выбора цвета элементов веб-страниц и обладает рядом преимуществ по сравнению с моделью RGB.
  • Для использования этой модели предназначена стилевая функция oklch(), которая имеет три обязательных параметра: светлота, цветность, оттенок. Четвёртый необязательный параметр устанавливает степень прозрачности цвета.
  • Меняя значение лишь светлоты в oklch() мы делаем цвет светлее или темнее. При изменении лишь оттенка мы получаем другой цвет, который при этом сохраняет значения светлоты и цветности.

Не выкладывайте свой код напрямую в комментариях, он отображается некорректно. Воспользуйтесь сервисом cssdeck.com или jsfiddle.net, сохраните код и в комментариях дайте на него ссылку. Так и результат сразу увидят.