CSS-функция `lab()`
Базовая поддержка Широко доступна
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и во многих версиях браузеров. Она доступна во всех браузерах с мая 2023 года.
Функциональная запись lab() выражает заданный цвет в цветовом пространстве CIE L*a*b*.
Lab представляет весь диапазон цветов, видимых человеку, задавая светлоту цвета, значение на оси красный/зелёный, значение на оси синий/жёлтый и необязательное значение прозрачности альфа-канала.
Синтаксис
/* Absolute values */ lab(29.2345% 39.3825 20.0664); lab(52.2345% 40.1645 59.9971); lab(52.2345% 40.1645 59.9971 / .5); /* Relative values */ lab(from green l a b / 0.5) lab(from #123456 calc(l + 10) a b) lab(from hsl(180 100% 50%) calc(l - 10) a b)
Значения
Ниже описаны допустимые значения как для абсолютных, так и для относительных цветов.
Синтаксис абсолютных значений
lab(L a b[ / A])
Параметры следующие:
-
L <number>от0до100,<percentage>от0%до100%или ключевое словоnone(в данном случае эквивалентное0%). Это значение задаёт светлоту цвета. Здесь число0соответствует0%(чёрному цвету), а число100соответствует100%(белому цвету).-
a <number>от-125до125,<percentage>от-100%до100%или ключевое словоnone(в данном случае эквивалентное0%). Это значение задаёт расстояние цвета вдоль осиa, определяющей, насколько цвет зелёный (при движении к-125) или красный (при движении к+125). Обратите внимание, что эти значения знаковые (могут быть как положительными, так и отрицательными) и теоретически не ограничены, то есть можно задавать значения за пределами±125(±100%). На практике значения не могут превышать±160.-
b <number>от-125до125,<percentage>от-100%до100%или ключевое словоnone(в данном случае эквивалентное0%). Это значение задаёт расстояние цвета вдоль осиb, определяющей, насколько цвет синий (при движении к-125) или жёлтый (при движении к+125). Обратите внимание, что эти значения знаковые (могут быть как положительными, так и отрицательными) и теоретически не ограничены, то есть можно задавать значения за пределами±125(±100%). На практике значения не могут превышать±160.-
AНеобязательно <alpha-value>, представляющее значение альфа-канала цвета, где число0соответствует0%(полностью прозрачный), а1соответствует100%(полностью непрозрачный). Кроме того, ключевое словоnoneможно использовать для явного указания отсутствия альфа-канала. Если значение каналаAне указано явно, по умолчанию оно равно 100%. Если значение указано, перед ним ставится косая черта (/).
Примечание: Подробнее о влиянии none см. в разделе Отсутствующие компоненты цвета.
Синтаксис относительных значений
lab(from <color> L a b[ / A])
Параметры следующие:
-
from <color> - При определении относительного цвета всегда используется ключевое слово
from, за которым следует значениеcolor, представляющее исходный цвет. Это исходный цвет, на основе которого формируется относительный цвет. Исходный цвет может быть задан любым допустимым синтаксисомcolor, в том числе другим относительным цветом. -
L <number>от0до100,<percentage>от0%до100%или ключевое словоnone(в данном случае эквивалентное0%). Это значение задаёт светлоту результирующего цвета. Здесь число0соответствует0%(чёрному цвету), а число100соответствует100%(белому цвету).-
a <number>от-125до125,<percentage>от-100%до100%или ключевое словоnone(в данном случае эквивалентное0%). Это значение задаёт расстояние результирующего цвета вдоль осиa, определяющей, насколько цвет зелёный (при движении к-125) или красный (при движении к+125). Обратите внимание, что эти значения знаковые (могут быть как положительными, так и отрицательными) и теоретически не ограничены, то есть можно задавать значения за пределами±125(±100%). На практике значения не могут превышать±160.-
b <number>от-125до125,<percentage>от-100%до100%или ключевое словоnone(в данном случае эквивалентное0%). Это значение задаёт расстояние результирующего цвета вдоль осиb, определяющей, насколько цвет синий (при движении к-125) или жёлтый (при движении к+125). Обратите внимание, что эти значения знаковые (могут быть как положительными, так и отрицательными) и теоретически не ограничены, то есть можно задавать значения за пределами±125(±100%). На практике значения не могут превышать±160.-
AНеобязательно <alpha-value>, представляющее значение альфа-канала результирующего цвета, где число0соответствует0%(полностью прозрачный), а1соответствует100%(полностью непрозрачный). Кроме того, ключевое словоnoneможно использовать для явного указания отсутствия альфа-канала. Если значение каналаAне указано явно, по умолчанию оно равно значению альфа-канала исходного цвета. Если значение указано, перед ним ставится косая черта (/).
Примечание: Обычно, когда процентные значения имеют числовой эквивалент в CSS, 100% равен числу 1. Однако, как отмечено выше, для светлоты Lab и осей a и b это не всегда так. Для L диапазон составляет от 0 до 100, причём 100% равен 100. Значения a и b могут быть как отрицательными, так и положительными: 100% равен 125, а -100% равен -125.
Задание компонентов каналов результирующего относительного цвета
При использовании синтаксиса относительных цветов внутри функции lab() браузер преобразует исходный цвет в эквивалентный цвет Lab (если он ещё не задан в этом цветовом пространстве). Цвет задаётся тремя отдельными значениями цветовых каналов — l (светлота), a (ось зелёный/красный) и b (ось синий/жёлтый), — а также значением альфа-канала (alpha). Эти значения каналов доступны внутри функции и могут использоваться при задании значений каналов результирующего цвета:
- Значение канала
lпреобразуется в<number>от0до100включительно. - Каждый из каналов
aиbпреобразуется в<number>от-125до125включительно. - Канал
alphaпреобразуется в<number>от0до1включительно.
При задании относительного цвета его каналы можно выразить несколькими способами. Ниже рассмотрим примеры, которые помогут их проиллюстрировать.
В первых двух примерах ниже используется синтаксис относительных цветов. Однако первый пример возвращает тот же цвет, что и исходный, а второй — цвет, никак не связанный с исходным. По сути, они не создают относительные цвета! Вряд ли вы когда-либо будете использовать их в реальном коде; вероятно, вместо этого вы просто зададите абсолютное значение цвета. Мы включили эти примеры в качестве отправной точки для изучения синтаксиса относительных цветов lab().
Начнём с исходного цвета hsl(0 100% 50%) (эквивалентного red). Следующая функция возвращает тот же цвет, что и исходный: в качестве выходных значений каналов она использует значения каналов l, a и b исходного цвета (54.29, 80.8198 и 69.8997):
lab(from hsl(0 100% 50%) l a b)
Результирующий цвет этой функции — lab(54.29 80.8198 69.8997).
Следующая функция задаёт для каналов результирующего цвета абсолютные значения и возвращает совершенно другой цвет, не основанный на исходном:
lab(from hsl(0 100% 50%) 29.692% 44.89% -29.034%)
В этом случае результирующий цвет — lab(29.692 56.1125 -36.2925).
Следующая функция создаёт относительный цвет на основе исходного:
lab(from hsl(0 100% 50%) l -100 b)
В этом примере:
- Исходный цвет
hsl()преобразуется в эквивалентный цветlab()—lab(54.29 80.8198 69.8997). - Для каналов
lиbрезультирующего цвета задаются значения каналовLиbэквивалентного исходного цветаlab()— эти значения равны54.29и69.8997соответственно. - Для канала
aрезультирующего цвета задаётся новое значение, не основанное на исходном цвете:-100.
Итоговый результирующий цвет — lab(54.29 -100 69.8997).
Примечание: Как упоминалось выше, если для результирующего и исходного цветов используются разные цветовые модели, исходный цвет преобразуется в фоновом режиме в ту же модель, что и результирующий. Это позволяет представить его в совместимом виде (то есть с использованием тех же каналов).
В рассмотренных до сих пор примерах альфа-каналы ни исходных, ни результирующих цветов не задавались явно. Если альфа-канал результирующего цвета не указан, по умолчанию используется то же значение, что и для альфа-канала исходного цвета. Если альфа-канал исходного цвета не указан (и он не является относительным цветом), по умолчанию используется 1. Поэтому в приведённых выше примерах значения альфа-каналов исходного и результирующего цветов равны 1.
Рассмотрим несколько примеров с заданными значениями альфа-каналов исходного и результирующего цветов. В первом значение альфа-канала результирующего цвета совпадает со значением альфа-канала исходного цвета, а во втором оно отличается от значения альфа-канала исходного цвета.
lab(from hsl(0 100% 50% / 0.8) l a b / alpha) /* Computed output color: lab(54.29 80.8198 69.8997 / 0.8) */ lab(from hsl(0 100% 50% / 0.8) l a b / 0.5) /* Computed output color: lab(54.29 80.8198 69.8997 / 0.5) */
В следующем примере исходный цвет hsl() снова преобразуется в эквивалент lab() — lab(54.29 80.8198 69.8997). К значениям L, a, b и A применяются вычисления calc(), в результате чего получается цвет lab(74.29 60.8198 29.8997 / 0.9):
lab(from hsl(0 100% 50%) calc(l + 20) calc(a - 20) calc(b - 40) / calc(alpha - 0.1))
Примечание: Поскольку значения каналов исходного цвета преобразуются в значения <number>, при использовании их в вычислениях к ним нужно прибавлять числа, даже если для канала обычно допускаются значения <percentage>, <angle> или другие типы значений. Например, сложение <percentage> и <number> не работает.
Формальный синтаксис
<lab()> = lab( [<percentage> | <number> | none] [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ / [<alpha-value> | none] ]? ) <alpha-value> = <number> | <percentage>
Примеры
Настройка светлоты
В следующем примере показан эффект изменения значения светлоты функции lab().
HTML
<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> <div data-color="blue-dark"></div> <div data-color="blue"></div> <div data-color="blue-light"></div>
CSS
body {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
div {
height: 50px;
flex: 0 0 28%;
border: 1px solid black;
}
[data-color="red-dark"] {
background-color: lab(5 125 71);
}
[data-color="red"] {
background-color: lab(40 125 71);
}
[data-color="red-light"] {
background-color: lab(95 125 71);
}
[data-color="green-dark"] {
background-color: lab(10% -120 125);
}
[data-color="green"] {
background-color: lab(50% -120 125);
}
[data-color="green-light"] {
background-color: lab(90% -120 125);
}
[data-color="blue-dark"] {
background-color: lab(10 -120 -120);
}
[data-color="blue"] {
background-color: lab(50 -120 -120);
}
[data-color="blue-light"] {
background-color: lab(90 -120 -120);
}
Результат
Настройка цветовых осей
В этом примере показано влияние задания значений a и b функции lab() в крайних точках и серединах оси a, которая идёт от зелёного (-125) до красного (125), и оси b, которая идёт от жёлтого (-125) до синего (125).
HTML
<div data-color="red-yellow"></div> <div data-color="red-zero"></div> <div data-color="red-blue"></div> <div data-color="zero-yellow"></div> <div data-color="zero-zero"></div> <div data-color="zero-blue"></div> <div data-color="green-yellow"></div> <div data-color="green-zero"></div> <div data-color="green-blue"></div>
CSS
Используя свойство CSS background-color, мы изменяем значения a и b функции цвета lab() вдоль осей a и b, демонстрируя эффекты максимальных, средних и минимальных значений в каждом случае.
body {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 10px;
}
div {
height: 50px;
flex: 0 0 28%;
border: 1px solid black;
}
/* a-axis max, variable b-axis */
[data-color="red-yellow"] {
background-color: lab(50 125 125);
}
[data-color="red-zero"] {
background-color: lab(50 125 0);
}
[data-color="red-blue"] {
background-color: lab(50 125 -125);
}
/* a-axis center, variable b-axis */
[data-color="zero-yellow"] {
background-color: lab(50 0 125);
}
[data-color="zero-zero"] {
background-color: lab(50 0 0);
}
[data-color="zero-blue"] {
background-color: lab(50 0 -125);
}
/* a-axis min, variable b-axis */
[data-color="green-yellow"] {
background-color: lab(50 -125 125);
}
[data-color="green-zero"] {
background-color: lab(50 -125 0);
}
[data-color="green-blue"] {
background-color: lab(50 -125 -125);
}
Результат
В левом столбце показан жёлтый край (-125) оси b, а в правом — синий край (125). В верхней строке представлены цвета на красном краю оси a (-125), а в нижней — на зелёном краю (125). Средний столбец и средняя строка соответствуют средним точкам (0) каждой оси; центральная ячейка серая: в ней нет красного, зелёного, жёлтого или синего, а значения обеих осей равны 0.
Линейные градиенты вдоль осей a и b
В этом примере используются линейные градиенты, чтобы показать изменение значений функции lab() вдоль оси a (от красного к зелёному) и вдоль оси b (от жёлтого к синему). На каждом изображении градиента одна ось остаётся неизменной, а значение другой оси меняется от минимального до максимального.
<div data-color="red-to-green-yellow"> <span>red</span><span>`b`= -125 (yellow)</span><span>green</span> </div> <div data-color="red-to-green-zero"> <span>red</span><span>no yellow or blue</span><span>green</span> </div> <div data-color="red-to-green-blue"> <span>red</span><span>`b`= 125 (blue)</span><span>green</span> </div> <div data-color="yellow-to-blue-red"> <span>yellow</span><span>`a` = -125 (red)</span><span>blue</span> </div> <div data-color="yellow-to-blue-zero"> <span>yellow</span><span>no red or green</span><span>blue</span> </div> <div data-color="yellow-to-blue-green"> <span>yellow</span><span>`a` = 125 (green)</span><span>blue</span> </div>
CSS
div {
height: 50px;
padding: 5px;
margin: 5px;
border: 1px solid black;
display: flex;
justify-content: space-between;
align-items: center;
}
span {
background-color: #ffffffcc;
padding: 3px;
}
/* a-axis gradients */
[data-color="red-to-green-yellow"] {
background-image: linear-gradient(to right, lab(50 125 125), lab(50 -125 125));
}
[data-color="red-to-green-zero"] {
background-image: linear-gradient(to right, lab(50 125 0), lab(50 -125 0));
}
[data-color="red-to-green-blue"] {
background-image: linear-gradient(to right, lab(50 125 -125), lab(50 -125 -125));
}
/* b-axis gradients */
[data-color="yellow-to-blue-red"] {
background-image: linear-gradient(to right, lab(50 125 125), lab(50 125 -125));
}
[data-color="yellow-to-blue-zero"] {
background-image: linear-gradient(to right, lab(50 0 125), lab(50 0 -125));
}
[data-color="yellow-to-blue-green"] {
background-image: linear-gradient(to right, lab(50 -125 125),lab(50 -125 -125));
}
Результат
Настройка непрозрачности
В следующем примере показан эффект изменения значения A (альфа-канала) функциональной записи lab(). Элементы 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: lightblue;
width: 150px;
height: 40px;
}
[data-color="red"] {
background-color: lab(80 125 125);
}
[data-color="red-alpha"] {
background-color: lab(80 125 125 / 0.4);
}
Результат
Использование относительных цветов с lab()
В этом примере для трёх элементов <div> задаются разные цвета фона. Среднему элементу назначен неизменённый --base-color, а левому и правому — его осветлённый и затемнённый варианты --base-color.
Эти варианты задаются с помощью относительных цветов: пользовательское свойство --base-color передаётся функции lab(), а в результирующих цветах изменяется канал светлоты для достижения нужного эффекта с помощью функции calc(). Для осветлённого цвета значение канала светлоты увеличивается на 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;
/* equivalent of lab(75 24 79) */
}
#one {
background-color: lab(from var(--base-color) calc(l + 15) a b);
}
#two {
background-color: var(--base-color);
}
#three {
background-color: lab(from var(--base-color) calc(l - 15) a b);
}
Результат
Результат выглядит следующим образом:
Спецификации
Совместимость с браузерами
| Компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | WebView на iOS | |
lab |
111 |
111 |
113 |
97 |
15 |
111 |
113 |
75 |
15 |
22.0 |
111 |
15 |
mixed_type_parameters |
116 |
116 |
113 |
102 |
16.2 |
116 |
113 |
78 |
16.2 |
24.0 |
116 |
16.2 |
relative_syntax |
119 |
119 |
128 |
105 |
16.4 |
119 |
128 |
79 |
16.4 |
25.0 |
119 |
16.4 |
См. также
-
colorтип данных -
<color-function>тип данных - Использование относительных цветов
- Модуль «Цвета CSS»
- Цвета LCH в CSS: что это, зачем они нужны и как их использовать? — Lea Verou (2020)
-
Примечания к выпуску Safari Technology Preview 122: включает цвета
lab()иlch()
© 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/lab