一种名为OKLCH的新颜色空间已经出现。像Tailwind CSS这样的主要框架已经开始采用它,现代浏览器也支持它。在本文中,让我们探索OKLCH是什么,它与现有颜色空间方法有何不同,以及为什么它被开发出来。
颜色模型的演变
RGB颜色模型的局限性
RGB颜色模型设计用于匹配计算机显示器的工作方式,是计算机图形和网页中最广泛使用的方法。它通过组合三个通道(红、绿、蓝)的值(0-255)来表示颜色,但它有以下局限性:
- 非直观的颜色操作:很难预测RGB值会产生什么颜色。例如,试着猜一下
rgb(128, 57, 198)
代表什么颜色! - 非线性亮度:在RGB中,亮度计算为三个通道的平均值或加权平均值,这与人类视觉感知不一致。例如,纯蓝色(rgb(0, 0, 255))和纯绿色(rgb(0, 255, 0))的RGB值总和相同,但对人类来说,绿色看起来要亮得多。
- 渐变问题:RGB颜色之间的渐变通常在中间显示不需要的灰色或暗淡的颜色。这个问题在互补色之间的渐变(例如,红→蓝)中特别明显。
css
background: linear-gradient(90deg,rgba(255, 0, 0, 1) 0%, rgba(0, 0, 255, 1) 100%);
- 有限的色域:它局限于sRGB色域,无法利用现代显示器可以表示的更广泛的色域(如P3)。
HSL颜色模型的局限性
HSL(色相、饱和度、亮度)是比RGB更直观的颜色模型,但它仍然有几个局限性:
- 缺乏感知均匀性:与RGB一样,HSL的亮度(L)与人类视觉感知不一致。例如,具有相同亮度(L)值的不同色相(H)在眼睛看来可能具有不同的亮度。
- 饱和度不平衡:饱和度(S)的效果因亮度(L)而异。在非常暗或非常亮的颜色中,饱和度变化几乎不明显。
HSL - Blue (Hue: 240°)
Lightness: 10%
S=0%S=50%S=100%Lightness: 50%
S=0%S=50%S=100%Lightness: 90%
S=0%S=50%S=100% - 持续的渐变问题:HSL与RGB一样,在渐变中存在中间颜色暗淡的问题。
- 有限的色域:HSL也在sRGB色域内运行,因此无法表示更广泛色域的颜色。
颜色空间的演变:LAB、LCH、Oklab
为了克服这些局限性,不断开发新的颜色空间模型。要解释详细的差异需要数学讨论,我在这里会跳过。
LAB
CIE LAB(或CIELAB)是国际照明委员会(CIE)在1976年开发的颜色空间。LAB设计用于匹配人类视觉感知,由三个轴组成:
- L:亮度,0(黑色)到100(白色)
- a:绿-红轴,负值为绿色,正值为红色
- b:蓝-黄轴,负值为蓝色,正值为黄色
LCH(CIELCh)
LCH是LAB颜色空间转换为极坐标的结果。这里,'L'与LAB中的亮度值相同,'C'是色度(a和b轴的距离),'H'是色相(a和b轴的角度)。LCH保持了LAB的感知均匀性,同时允许直观地操作颜色和色度。
然而,CIE LAB和LCH也有局限性。在蓝色区域存在失真现象。
Oklab颜色空间
Oklab是Björn Ottosson在2020年开发的新颜色空间,旨在克服CIE LAB的局限性。Oklab具有与LAB相同的结构(L、a、b),但使用不同的颜色转换方法。
开发者说"Ok"前缀是因为这个颜色模型做了一个OK的工作...
什么是OKLCH?
OKLCH是一种设计用于更接近人类视觉感知地表示颜色的颜色空间。它是Oklab转换为极坐标的结果,保持了Oklab的所有优点,同时允许直观地操作色相(H)和色度(C)。它可以被视为CIELCh和Oklab优点的结合。
OKLCH的组成部分
-
L(亮度)
- 表示颜色的亮度,从0(黑色)到1(白色)或0%到100%
- 与人类视觉感知一致,因此值的变化在我们眼中被感知为相等的亮度变化水平
-
C(色度,饱和度/颜色强度)
- 表示颜色的鲜艳度或强度
- 0是完全灰色(无色),值越高,颜色越鲜艳
- 最大值因显示器的色域(sRGB、P3等)而异,通常低于0.37
-
H(色相)
- 表示颜色的类型,以0到360度的角度表示
- 红色(0/360)、黄色(90)、绿色(140)、蓝色(220)、紫色(320)等,以角度表示围绕一个完整的圆
-
A(透明度)
- 可选地,透明度可以在
/
后指定为0到1或0%到100%的值
- 可选地,透明度可以在
这些组成部分彼此独立运行。改变一个值不会影响其他值。这是解决现有颜色模型如RGB或HSL主要缺点的特性之一。
在CSS中使用OKLCH
/* 基本语法 */
color: oklch(L C H);
color: oklch(L C H / A);
/* 亮蓝色 */
color: oklch(0.7 0.2 240);
/* 透明黄色 */
color: oklch(60% 0.25 90 / 80%);
/* 非常鲜艳的红色(P3色域) */
color: oklch(0.6 0.34 30);
/* 灰度(色度0) */
color: oklch(0.5 0 0); /* 中灰色 */
color: oklch(0.8 0 0); /* 浅灰色 */
color: oklch(0.2 0 0); /* 深灰色 */
- L值可以表示为小数(0~1)或百分比(0%~100%)
- C值通常表示为小数,值低于0.37在大多数显示器上可以安全表示
- H值表示为0到360的角度,单位(deg)可以省略
OKLCH的优势
-
感知均匀性: OKLCH的设计使得值的变化在视觉上均匀感知。例如,亮度变化10%在所有颜色中感觉都是相似的亮度水平。
RGBOKLCH -
直观的颜色操作: 在OKLCH中,亮度、色度和色相可以独立调整。这使得创建颜色调色板或设计无障碍性更容易且更可预测。
HSL0%20%40%60%80%100%OKLCH00.050.10.150.20.25 -
广泛的色域支持: OKLCH不仅支持sRGB,还支持现代显示器中的更广泛色域如P3。在最新的移动设备或高端显示器上可以明显感受到差异。
-
一致的渐变: 使用OKLCH,颜色之间的渐变显得平滑自然。它大大减少了RGB或HSL中常见的中间颜色暗淡或颜色带状问题。
RGBOKLCH -
增强的无障碍性: 可以在保持一致亮度(L)值的同时调整颜色,这对于亮度对比重要的无障碍设计有利。这使得创建符合WCAG无障碍标准的颜色组合更容易。
使用案例
颜色调色板生成
通过定期调整OKLCH的L、C和H值,可以自动生成直观且一致的颜色调色板。
/* 在保持相同亮度和色度的同时只改变色相 */
--primary: oklch(65% 0.2 240); /* 蓝色 */
--accent1: oklch(65% 0.2 30); /* 红色 */
--accent2: oklch(65% 0.2 120); /* 绿色 */
/* 在保持相同色相和色度的同时创建亮度步骤 */
--primary-100: oklch(90% 0.2 240); /* 非常浅的蓝色 */
--primary-500: oklch(65% 0.2 240); /* 中蓝色 */
--primary-900: oklch(30% 0.2 240); /* 深蓝色 */
Tailwind CSS v4
Tailwind CSS在v4版本中将其整个默认颜色调色板从RGB升级为OKLCH。这特别是为了在支持P3色域的显示器上提供更鲜艳和丰富的颜色。
结论
OKLCH是一种适合人类视觉的颜色空间,克服了现有颜色模型的局限性,实现了更直观和可预测的颜色工作。凭借广泛的色域支持、平滑的渐变和增强的无障碍性等各种优势,它是现代网页设计和UI/UX领域应该采用的新颜色空间。