lab
lab() 函数用于定义 CIELAB 色彩空间中的颜色,它接受三个参数,其中 l、a、b 分别表示亮度、红绿色度和黄蓝色度的值。
- L: 亮度(Lightness),
0%~100%。 - A: 颜色通道,从深绿⾊(低亮度)到灰⾊(中亮度)再到亮粉红⾊(⾼亮度),是 Lab 颜色空间中沿 a 轴的距离。
- B: 颜⾊通道,从亮蓝⾊(低亮度)到灰⾊(中亮度)再到⻩⾊(⾼亮度),Lab 颜色空间中沿 b 轴的距离(见下图示意)。
Lab 颜色空间最大的优点是其可以在不同的软件中使用同一种量化颜色,也就是 Lab 颜色空间与设备无关,这在印刷中非常有用,可以抹消印刷中的颜色偏差,从而实现设计同步。例如,要定义一个亮度为
70,红绿色度为50,黄蓝色度为-30的 CIELAB 颜色,可以使用如下代码:color: lab(70, 50, -30);
lch
lch() 函数用于定义 LCh 色彩空间中的颜色,它接受三个参数,其中 l、c、h 分别表示亮度、色度和色相的值。
- L: 亮度(Lightness),
0%~100% - C: 彩度(Chroma),
0~∞ - H: ⾊相(Hue),
0~360(隐藏单位是角度单位deg)
lch函数相比lab函数多了一个色度的参数,它可以更好地表示颜色的鲜艳程度。例如要判断一个水果是否看上去新鲜诱人,则最适合的颜色函数就是lch()函数,因为明度、彩度对应的就是水果表面是否反光,颜色是否饱满等。因此,在设计师的工作中,lch函数常常被用来表示颜色的鲜艳程度和明暗变化。例如,要定义一个饱和度为50%,色调为30度的颜色,可以使用如下代码:color: lch(70, 50, 30);
lab 和 lch 互转
function lab2lch(labL, labA, labB) {
const [lchC, lchH] = [
Math.sqrt(Math.pow(labA, 2) + Math.pow(labB, 2)), // 转换为 chroma
(Math.atan2(labB, labA)) * 180 / Math.PI // 转换为 hue,角度值
];
return [labL, lchC, lchH];
}
function lch2lab(lchL, lchC, lchH) {
const [labA, labB] = [
lchC * Math.cos(lchH * Math.PI / 180),
lchC * Math.sin(lchH * Math.PI / 180)
];
return [lchL, labA, labB];
}
console.log(lab2lch(0.292345, 39.3825, 20.0664));
console.log(lch2lab(0.292345, 44.2, 27));