CSS 颜色函数 lab 和 lch

685 阅读2分钟

lab

lab() 函数用于定义 CIELAB 色彩空间中的颜色,它接受三个参数,其中 lab 分别表示亮度、红绿色度和黄蓝色度的值。

  1. L: 亮度(Lightness),0%100%
  2. A: 颜色通道,从深绿⾊(低亮度)到灰⾊(中亮度)再到亮粉红⾊(⾼亮度),是 Lab 颜色空间中沿 a 轴的距离。
  3. B: 颜⾊通道,从亮蓝⾊(低亮度)到灰⾊(中亮度)再到⻩⾊(⾼亮度),Lab 颜色空间中沿 b 轴的距离(见下图示意)。

image.png

Lab 颜色空间最大的优点是其可以在不同的软件中使用同一种量化颜色,也就是 Lab 颜色空间与设备无关,这在印刷中非常有用,可以抹消印刷中的颜色偏差,从而实现设计同步。例如,要定义一个亮度为 70,红绿色度为 50,黄蓝色度为 -30 的 CIELAB 颜色,可以使用如下代码:

color: lab(70, 50, -30);

lch

lch() 函数用于定义 LCh 色彩空间中的颜色,它接受三个参数,其中 lch 分别表示亮度、色度和色相的值。

  1. L: 亮度(Lightness),0%100%
  2. C: 彩度(Chroma),0~
  3. H: ⾊相(Hue),0~360(隐藏单位是角度单位 deg

image.png

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));

浏览器支持

image.png

参考资料

  1. 是时候介绍这几个全新的CSS颜色函数了