Перейти к подбору цвета
PickShade

OKLCH простыми словами: формат цвета, который совпадает с глазом

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

Что такое OKLCH

OKLCH это полярная запись Oklab, перцептивного цветового пространства, которое Бьёрн Оттоссон опубликовал в 2020 году. В нём три числа. L это воспринимаемая светлота от 0 (чёрный) до 1 или 100% (белый). C это насыщенность (chroma) от 0 (серый) примерно до 0.37 у самых ярких цветов, которые способен показать экран. H это угол тона от 0 до 360 градусов.

Так выглядит один и тот же цвет в разных форматах. Все значения PickShade считает прямо на странице, их можно копировать как есть.

Пример: #ff5733
ФорматЗначение
HEX
RGB
HSL
OKLCH
OKLab

Почему OKLCH лучше HSL

Светлота в HSL это формула, а не восприятие. hsl(60 100% 50%) это яркий жёлтый, а hsl(240 100% 50%) тёмный синий, хотя у обоих «светлота 50%». Палитру на HSL приходится подгонять вручную для каждого тона.

В OKLCH цвета с одинаковой L выглядят одинаково светлыми. Можно зафиксировать L и C и вращать H, чтобы получить уравновешенный набор тонов, или зафиксировать H и C и шагать по L, чтобы получить ровную шкалу оттенков. Поэтому Tailwind CSS v4 описывает всю стандартную палитру в OKLCH.

Светлота заодно подсказывает контраст. Текст, чья L отличается от фона примерно на 0.4 и больше, обычно читается хорошо, и выбирать доступные цвета становится намного проще.

Синтаксис в CSS

Светлоту пишут в процентах или числом от 0 до 1. Насыщенность это число. Тон это угол в градусах. Прозрачность ставится после косой черты.

CSS

color: oklch(62.8% 0.258 29.23);
background: oklch(0.7 0.15 250 / 50%);
border-color: oklch(from var(--brand) calc(l - 0.1) c h);

Поддержка браузерами

oklch() работает во всех актуальных браузерах: Safari с версии 15.4, Chrome и Edge с 111, Firefox со 113. Это заметно больше 90% пользователей. Для совсем старых браузеров поставьте строкой выше HEX-значение.

CSS

color: #ff5733;
color: oklch(68% 0.21 33.7);

Предел насыщенности и охват

В OKLCH можно записать цвет, который не покажет ни один экран. Максимальная насыщенность зависит от светлоты и тона: яркий жёлтый возможен только при высокой светлоте, яркий синий только при низкой. Если значение выходит за охват sRGB или Display P3, браузер подбирает ближайший показуемый цвет, и оттенок может сместиться.

PickShade отмечает цвета за пределами sRGB и сразу даёт ближайший цвет, который помещается. Он получается снижением насыщенности при сохранении светлоты и тона, как рекомендует CSS Color 4.

Как перевести HEX в OKLCH

Путь такой: HEX в sRGB, sRGB в линейный свет, линейный sRGB в пространство колбочек LMS, кубический корень, матрица в Oklab и в конце перевод Oklab в полярные координаты. Вручную легко ошибиться, поэтому просто вставьте цвет в конвертер и скопируйте результат.

Вопросы и ответы

Поддерживают ли OKLCH все браузеры?

Да, все актуальные: Safari 15.4 и новее, Chrome и Edge 111 и новее, Firefox 113 и новее. Если нужны старые браузеры, добавьте строкой выше HEX.

Чем OKLCH отличается от LCH?

Оба формата описывают светлоту, насыщенность и тон. CSS lch() построен на CIELAB, где синие при изменении светлоты уходят в фиолетовый. OKLCH построен на Oklab и держит тон стабильным, поэтому шкала синего остаётся синей.

Почему мой OKLCH-цвет выглядит не так, как я задал?

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

Можно ли использовать OKLCH в Tailwind CSS?

Да. Tailwind CSS v4 уже использует OKLCH для стандартной палитры, а свои цвета в @theme можно сразу писать в OKLCH.

Попробуйте в PickShade