Функция CSS `oklch()`
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и во многих версиях браузеров. Она доступна в браузерах с мая 2023 года.
Функциональная запись oklch() задаёт цвет в цветовом пространстве Oklab. oklch() — это цилиндрическая форма oklab(), использующая ту же ось L, но полярные координаты цветности (C) и оттенка (h).
Синтаксис
/* Absolute values */ oklch(40.1% 0.123 21.57) oklch(59.69% 0.156 49.77) oklch(59.69% 0.156 49.77 / .5) /* Relative values */ oklch(from green l c h / 0.5) oklch(from #123456 calc(l + 0.1) c h) oklch(from hsl(180 100% 50%) calc(l - 0.1) c h) oklch(from var(--color) l c h / calc(alpha - 0.1))
Значения
Ниже описаны допустимые значения для абсолютных и относительных цветов.
Примечание: Обычно, когда процентные значения имеют числовой эквивалент в CSS, 100% равно числу 1. Однако это справедливо не для всех значений компонентов oklch(). Здесь 100% равно 0.4 для значения C.
Синтаксис абсолютных значений
oklch(L C H[ / A])
Параметры:
-
L -
<number>от0до1,<percentage>от0%до100%или ключевое словоnone(в данном случае эквивалентное0%). В этом случае число0соответствует0%(чёрному), а число1соответствует100%(белому). Это значение задаёт воспринимаемую светлоту цвета, или его «яркость».Примечание:
Lвoklch()— это воспринимаемая светлота, то есть «яркость», которую мы видим глазами. Она отличается отLвhsl(), где светлота представляет собой сравнение с другими цветами. -
C <number>,<percentage>или ключевое словоnone(в данном случае эквивалентное0%). Это значение измеряет цветность цвета (примерно соответствует «количеству цвета»). Минимальное практически полезное значение —0, а максимальное теоретически не ограничено (но на практике не превышает0.5). В этом случае0%— это0, а100%— число0.4.-
H -
<number>,<angle>или ключевое словоnone(в данном случае эквивалентное0deg), обозначающее угол<hue>цвета.Примечание: Углы, соответствующие определённым оттенкам, различаются в цветовых пространствах sRGB (используется в
hsl()иhwb()), CIELAB (используется вlch()) и Oklab (используется вoklch()). Подробнее см. пример «Оттенки вoklch()» ниже и справочную страницу о типе данных<hue>, где также приведены примеры. -
AНеобязательно <alpha-value>, задающее значение альфа-канала цвета: число0соответствует0%(полностью прозрачный), а1—100%(полностью непрозрачный). Кроме того, ключевое словоnoneможно использовать, чтобы явно указать отсутствие альфа-канала. Если значение каналаAявно не задано, по умолчанию оно равно 100%. Если значение указано, перед ним ставится косая черта (/).
Примечание: Подробнее о влиянии none см. в разделе Отсутствующие компоненты цвета.
Синтаксис относительных значений
oklch(from <color> L C H[ / A])
Параметры:
-
from <color> - При задании относительного цвета всегда указывается ключевое слово
from, за которым следует значениеcolor, представляющее исходный цвет: это исходный цвет, на основе которого задаётся относительный цвет. Исходным цветом может быть любой допустимый синтаксисcolor, в том числе другой относительный цвет. -
L <number>от0до1,<percentage>от0%до100%или ключевое словоnone(в данном случае эквивалентное0%). Это значение задаёт светлоту результирующего цвета. Здесь число0соответствует0%(чёрному), а число1соответствует100%(белому).-
C <number>,<percentage>или ключевое словоnone(в данном случае эквивалентное0%). Это значение задаёт цветность результирующего цвета (примерно соответствует «количеству цвета»). Минимальное практически полезное значение —0, а максимальное теоретически не ограничено (но на практике не превышает0.5). В этом случае0%— это0, а100%— число0.4.-
H <number>,<angle>или ключевое словоnone(в данном случае эквивалентное0deg), обозначающее угол<hue>результирующего цвета. Пример разных оттенков см. в разделе «Результат» ниже.-
AНеобязательно <alpha-value>, задающее значение альфа-канала результирующего цвета: число0соответствует0%(полностью прозрачный), а1—100%(полностью непрозрачный). Кроме того, ключевое словоnoneможно использовать, чтобы явно указать отсутствие альфа-канала. Если значение каналаAявно не задано, по умолчанию оно равно значению альфа-канала исходного цвета. Если значение указано, перед ним ставится косая черта (/).
Задание компонентов каналов результирующего относительного цвета
При использовании синтаксиса относительных цветов внутри функции oklch() браузер преобразует исходный цвет в эквивалентный цвет OkLCh (если он ещё не задан в этом формате). Цвет задаётся тремя отдельными значениями цветовых каналов — l (светлота), c (цветность) и h (оттенок), — а также значением альфа-канала (alpha). Эти значения каналов доступны внутри функции и используются при задании значений каналов результирующего цвета:
- Значение канала
lпреобразуется в<number>от0до1включительно. - Значение канала
cпреобразуется в<number>от0до0.4включительно. - Значение канала
hпреобразуется в<number>от0до360включительно. - Значение канала
alphaпреобразуется в<number>от0до1включительно.
При задании относительного цвета разные каналы результирующего цвета можно выразить несколькими способами. Ниже рассмотрим несколько примеров.
В первых двух примерах ниже мы используем синтаксис относительных цветов. Однако первый пример возвращает тот же цвет, что и исходный, а второй — цвет, никак не связанный с исходным. По сути, они не создают относительные цвета! В реальном коде вы вряд ли когда-либо использовали бы такие варианты и, вероятно, просто указали бы абсолютное значение цвета. Мы включили эти примеры, чтобы начать изучение синтаксиса относительных oklch().
Возьмём исходный цвет hsl(0 100% 50%) (эквивалентный red). Следующая функция возвращает тот же цвет, что и исходный: она использует значения каналов l, c и h исходного цвета (0.627966, 0.257704 и 29.2346) в качестве значений каналов результата:
oklch(from hsl(0 100% 50%) l c h)
Результирующий цвет этой функции — oklch(0.627966 0.257704 29.2346).
Следующая функция использует абсолютные значения каналов результирующего цвета и возвращает совершенно другой цвет, не основанный на исходном:
oklch(from hsl(0 100% 50%) 42.1% 0.25 328.363)
В этом случае результирующий цвет — oklch(0.421 0.25 328.363).
Следующая функция создаёт относительный цвет на основе исходного:
oklch(from hsl(0 100% 50%) 0.8 0.4 h)
Этот пример:
- Преобразует исходный цвет
hsl()в эквивалентный цветoklch()—oklch(0.627966 0.257704 29.2346). - Задаёт для канала
Hрезультирующего цвета значение каналаHэквивалента исходного цветаoklch()—29.2346. - Задаёт новые значения каналов
LиCрезультирующего цвета, не основанные на исходном: соответственно0.8и0.4.
Итоговый результирующий цвет — oklch(0.8 0.4 29.2346).
Примечание: Как упоминалось выше, если для результирующего цвета используется другая цветовая модель, исходный цвет в фоновом режиме преобразуется в ту же модель, что и результирующий цвет, чтобы представить его в совместимом виде (то есть с использованием тех же каналов).
В рассмотренных до сих пор примерах альфа-каналы не были явно заданы ни для исходного, ни для результирующего цвета. Если альфа-канал результирующего цвета не задан, по умолчанию используется то же значение, что и для альфа-канала исходного цвета. Если альфа-канал исходного цвета не задан (и это не относительный цвет), по умолчанию используется 1. Поэтому в приведённых выше примерах значения альфа-каналов исходного и результирующего цветов равны 1.
Рассмотрим примеры с заданными значениями альфа-каналов исходного и результирующего цветов. В первом примере значение альфа-канала результата совпадает со значением альфа-канала исходного цвета, а во втором задано другое значение, не связанное со значением альфа-канала исходного цвета.
oklch(from hsl(0 100% 50% / 0.8) l c h / alpha) /* Computed output color: oklch(0.627966 0.257704 29.2346 / 0.8) */ oklch(from hsl(0 100% 50% / 0.8) l c h / 0.5) /* Computed output color: oklch(0.627966 0.257704 29.2346 / 0.5) */
В следующем примере исходный цвет hsl() снова преобразуется в эквивалентный цвет oklch() — oklch(0.627966 0.257704 29.2346). К значениям L, C, H и A применяются вычисления calc(), в результате чего получается цвет oklch(0.827966 0.357704 9.23462 / 0.9):
oklch(from hsl(0 100% 50%) calc(l + 0.2) calc(c + 0.1) calc(h - 20) / calc(alpha - 0.1))
Примечание: Поскольку значения каналов исходного цвета преобразуются в значения <number>, при использовании их в вычислениях нужно прибавлять к ним числа, даже если для канала обычно допускаются значения <percentage>, <angle> или значения других типов. Например, сложение <percentage> и <number> не работает.
Формальный синтаксис
<oklch()> = oklch( [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ <hue> | none] [ / [<alpha-value> | none] ]? ) <hue> = <number> | <angle> <alpha-value> = <number> | <percentage>
Примеры
Изменение яркости цвета
В этом примере показан эффект изменения значения L (светлоты) функциональной записи oklch().
HTML
<div data-color="blue-dark"></div> <div data-color="blue"></div> <div data-color="blue-light"></div> <div data-color="red-dark"></div> <div data-color="red"></div> <div data-color="red-light"></div> <div data-color="green-dark"></div> <div data-color="green"></div> <div data-color="green-light"></div>
CSS
body {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 20px;
}
div {
height: 50px;
border: 1px solid black;
}
[data-color="blue-dark"] {
background-color: oklch(10% 0.4 240);
}
[data-color="blue"] {
background-color: oklch(50% 0.4 240);
}
[data-color="blue-light"] {
background-color: oklch(90% 0.4 240);
}
[data-color="red-dark"] {
background-color: oklch(10% 0.4 20);
}
[data-color="red"] {
background-color: oklch(50% 0.4 20);
}
[data-color="red-light"] {
background-color: oklch(90% 0.4 20);
}
[data-color="green-dark"] {
background-color: oklch(10% 0.4 130);
}
[data-color="green"] {
background-color: oklch(50% 0.4 130);
}
[data-color="green-light"] {
background-color: oklch(90% 0.4 130);
}
Результат
Изменение интенсивности цвета с помощью цветности
В следующем примере показан эффект изменения значения C (цветности) функциональной записи oklch(): по мере уменьшения значения C цвета теряют интенсивность и становятся почти серыми.
HTML
<div data-color="blue"></div> <div data-color="blue-chroma1"></div> <div data-color="blue-chroma2"></div> <div data-color="blue-chroma3"></div> <div data-color="red"></div> <div data-color="red-chroma1"></div> <div data-color="red-chroma2"></div> <div data-color="red-chroma3"></div> <div data-color="green"></div> <div data-color="green-chroma1"></div> <div data-color="green-chroma2"></div> <div data-color="green-chroma3"></div>
CSS
Для исходных синего, красного и зелёного цветов мы задаём для них постепенно уменьшающиеся значения цветности: от полной насыщенности при высоком значении 0.4 (эквивалентном 100%) до 0.01 (эквивалентного 2%), при котором все цвета становятся почти серыми.
body {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
gap: 20px;
}
div {
height: 50px;
border: 1px solid black;
}
[data-color="blue"] {
background-color: oklch(50% 0.4 240);
}
[data-color="blue-chroma1"] {
background-color: oklch(50% 0.2 240);
}
[data-color="blue-chroma2"] {
background-color: oklch(50% 0.1 240);
}
[data-color="blue-chroma3"] {
background-color: oklch(50% 0.01 240);
}
[data-color="red"] {
background-color: oklch(50% 100% 20deg);
}
[data-color="red-chroma1"] {
background-color: oklch(50% 50% 20deg);
}
[data-color="red-chroma2"] {
background-color: oklch(50% 25% 20deg);
}
[data-color="red-chroma3"] {
background-color: oklch(50% 2% 20deg);
}
[data-color="green"] {
background-color: oklch(50% 0.4 130);
}
[data-color="green-chroma1"] {
background-color: oklch(50% 0.2 130);
}
[data-color="green-chroma2"] {
background-color: oklch(50% 0.1 130);
}
[data-color="green-chroma3"] {
background-color: oklch(50% 0.01 130);
}
Результат
Если бы вместо 0.01 и 2% мы использовали 0 с теми же значениями светлоты, все цвета были бы одного и того же оттенка серого. В этом примере они почти серые.
Оттенки в OkLCh
В следующем примере показаны образцы с разными значениями H (оттенка) функциональной записи oklch().
HTML
<div data-color="0">0deg</div> <div data-color="20">20deg</div> <div data-color="40">40deg</div> <div data-color="60">60deg</div>
и так далее.
<div data-color="80">80deg</div> <div data-color="100">100deg</div> <div data-color="120">120deg</div> <div data-color="140">140deg</div> <div data-color="160">160deg</div> <div data-color="180">180deg</div> <div data-color="200">200deg</div> <div data-color="220">220deg</div> <div data-color="240">240deg</div> <div data-color="260">260deg</div> <div data-color="280">280deg</div> <div data-color="300">300deg</div> <div data-color="320">320deg</div> <div data-color="340">340deg</div> <div data-color="360">360deg</div>
CSS
body {
display: flex;
flex-wrap: wrap;
gap: 3px;
}
div {
flex: 0 0 4em;
text-align: center;
line-height: 4em;
display: inline-block;
border: 1px solid black;
color: white;
font-family: monospace;
}
[data-color="0"] {
background-color: oklch(50% 0.4 0deg);
}
[data-color="20"] {
background-color: oklch(50% 0.4 20deg);
}
[data-color="40"] {
background-color: oklch(50% 0.4 40deg);
}
[data-color="60"] {
background-color: oklch(50% 0.4 60deg);
}
и так далее.
[data-color="80"] {
background-color: oklch(50% 0.4 80deg);
}
[data-color="100"] {
background-color: oklch(50% 0.4 100deg);
}
[data-color="120"] {
background-color: oklch(50% 0.4 120deg);
}
[data-color="140"] {
background-color: oklch(50% 0.4 140deg);
}
[data-color="160"] {
background-color: oklch(50% 0.4 160deg);
}
[data-color="180"] {
background-color: oklch(50% 0.4 180deg);
}
[data-color="200"] {
background-color: oklch(50% 0.4 200deg);
}
[data-color="220"] {
background-color: oklch(50% 0.4 220deg);
}
[data-color="240"] {
background-color: oklch(50% 0.4 240deg);
}
[data-color="260"] {
background-color: oklch(50% 0.4 260deg);
}
[data-color="280"] {
background-color: oklch(50% 0.4 280deg);
}
[data-color="300"] {
background-color: oklch(50% 0.4 300deg);
}
[data-color="320"] {
background-color: oklch(50% 0.4 320deg);
}
[data-color="340"] {
background-color: oklch(50% 0.4 340deg);
}
[data-color="360"] {
background-color: oklch(50% 0.4 360deg);
}
Результат
Углы оттенков в oklch() отличаются от углов в hsl(). Подробнее см. раздел <hue>. В hsl() цвет sRGB 0deg обозначает красный. Однако в цветовом пространстве CIELab значение 0deg соответствует пурпурному, а красному соответствует приблизительно 41deg.
Изменение значения альфа-канала цвета
В следующем примере показан эффект изменения значения A (альфа-канала) цветовой функции oklch(). Элементы red и red-alpha перекрывают элемент #background-div, чтобы продемонстрировать эффект прозрачности. Значение 0.4 для A делает цвет непрозрачным на 40%.
HTML
<div id="background-div"> <div data-color="red"></div> <div data-color="red-alpha"></div> </div>
CSS
div {
width: 50px;
height: 50px;
padding: 5px;
margin: 5px;
display: inline-block;
border: 1px solid black;
}
#background-div {
background-color: oklch(100% 0.57 217);
width: 150px;
height: 40px;
}
[data-color="red"] {
background-color: oklch(50% 0.5 20);
}
[data-color="red-alpha"] {
background-color: oklch(50% 0.5 20 / 0.4);
}
Результат
Использование относительных цветов с oklch()
В этом примере для трёх элементов <div> заданы разные цвета фона. Центральному элементу назначен исходный цвет --base-color без изменений, а левому и правому — его осветлённый и затемнённый варианты --base-color.
Эти варианты задаются с помощью относительных цветов: пользовательское свойство --base-color передаётся функции oklch(), а светлота результирующих цветов изменяется с помощью функции calc(). Для осветлённого цвета к каналу светлоты прибавляется 0.15 (15%), а для затемнённого из него вычитается 0.15 (15%).
<div id="container"> <div class="item" id="one"></div> <div class="item" id="two"></div> <div class="item" id="three"></div> </div>
CSS
#container {
display: flex;
width: 100vw;
height: 100vh;
box-sizing: border-box;
}
.item {
flex: 1;
margin: 20px;
}
:root {
--base-color: orange;
}
#one {
background-color: oklch(from var(--base-color) calc(l + 0.15) c h);
}
#two {
background-color: var(--base-color);
}
#three {
background-color: oklch(from var(--base-color) calc(l - 0.15) c h);
}
Результат
Результат:
Спецификации
Совместимость с браузерами
| Настольные устройства | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome для Android | Firefox для Android | Opera для Android | Safari на iOS | Samsung Internet | WebView для Android | WebView на iOS | |
oklch |
111 |
111 |
113 |
97 |
15.4 |
111 |
113 |
75 |
15.4 |
22.0 |
111 |
15.4 |
mixed_type_parameters |
116 |
116 |
113 |
102 |
16.2 |
116 |
113 |
78 |
16.2 |
24.0 |
116 |
16.2 |
relative_syntax |
122
119–122Значения каналаl некорректно преобразуются в числа от 0 до 100 вместо диапазона от 0 до 1. В результате для вычислений со значениями каналов требуется задавать значения l в виде чисел-процентов без единиц измерения (например, 20 вместо 0.2). См. ошибку 40940488. |
122
119–122Значения каналаl некорректно преобразуются в числа от 0 до 100 вместо диапазона от 0 до 1. В результате для вычислений со значениями каналов требуется задавать значения l в виде чисел-процентов без единиц измерения (например, 20 вместо 0.2). См. ошибку 40940488. |
128 |
108
105–108Значения каналаl некорректно преобразуются в числа от 0 до 100 вместо диапазона от 0 до 1. В результате для вычислений со значениями каналов требуется задавать значения l в виде чисел-процентов без единиц измерения (например, 20 вместо 0.2). См. ошибку 40940488. |
18
16.4–18Реализация основана на более старой версии спецификации. Поэтому вычисления со значениями каналаh работают некорректно: значения нужно задавать с единицами измерения (deg). |
122
119–122Значения каналаl некорректно преобразуются в числа от 0 до 100 вместо диапазона от 0 до 1. В результате для вычислений со значениями каналов требуется задавать значения l в виде чисел-процентов без единиц измерения (например, 20 вместо 0.2). См. ошибку 40940488. |
128 |
81
79–81Значения каналаl некорректно преобразуются в числа от 0 до 100 вместо диапазона от 0 до 1. В результате для вычислений со значениями каналов требуется задавать значения l в виде чисел-процентов без единиц измерения (например, 20 вместо 0.2). См. ошибку 40940488. |
18
16.4–18Реализация основана на более старой версии спецификации. Поэтому вычисления со значениями каналаh работают некорректно: значения нужно задавать с единицами измерения (deg). |
26.0
25.0–26.0Значения каналаl некорректно преобразуются в числа от 0 до 100 вместо диапазона от 0 до 1. В результате для вычислений со значениями каналов требуется задавать значения l в виде чисел-процентов без единиц измерения (например, 20 вместо 0.2). См. ошибку 40940488. |
122
119–122Значения каналаl некорректно преобразуются в числа от 0 до 100 вместо диапазона от 0 до 1. В результате для вычислений со значениями каналов требуется задавать значения l в виде чисел-процентов без единиц измерения (например, 20 вместо 0.2). См. ошибку 40940488. |
18
16.4–18Реализация основана на более старой версии спецификации. Поэтому вычисления со значениями каналаh работают некорректно: значения нужно задавать с единицами измерения (deg). |
См. также
- Список всех обозначений цветов
- Использование относительных цветов
- Модуль CSS colors
-
Тип данных
<hue> -
Цветовые функции
lch()иoklab() - Интерактивная статья о цветовом пространстве OkLCh (2024)
- OKLCH в CSS: почему мы отказались от RGB и HSL (2024)
- Перцептивное цветовое пространство для обработки изображений (2020)
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/color_value/oklch