oklch是唯一能“只改亮度、颜色不漂”的css颜色函数,因其l基于oklab感知亮度坐标,调l时色相稳定;而oklab()函数目前未被任何主流浏览器支持,不能用于ui控制。

oklch() 调 L 不偏色,oklab() 本身不用于直接调色
OKLCH 是唯一能「只改亮度、颜色不漂」的 CSS 颜色函数;OKLAB 是底层空间,没有 H(色相)维度,不能直接写成 oklab() 用于 UI 控制——浏览器目前根本不支持 oklab() 函数(所有主流版本返回 @supports (color: oklab(0 0 0)) 均为 false)。你看到的“oklab 色偏修正”其实是 OKLCH 的 L 参数在 OKLAB 空间里计算的结果,不是靠手动用 oklab() 实现的。
oklch() 中 L 值变动时色相稳定性实测表现
同一组参数仅变 L,视觉对比非常明确:
-
oklch(62% 0.28 258.5)→oklch(42% 0.28 258.5):蓝调始终稳定,只是变暗,不会发紫或发青 -
hsl(240, 100%, 62%)→hsl(240, 100%, 42%):深蓝区域明显向紫灰偏移,尤其在 OLED 屏上更易察觉 -
oklch(50% 0.28 0)(红)和oklch(50% 0.28 120)(绿):人眼感知明暗几乎一致;而hsl(0, 100%, 50%)和hsl(120, 100%, 50%)实际 CIE Y 亮度差超 3 倍
混用色彩空间才是色偏的真正来源
OKLCH 本身不会偏色,但一旦和其它空间混用,浏览器立刻 fallback 到 sRGB 插值,导致中间态发灰、跳色:
- 动画中
--primary: oklch(62% 0.28 258.5)→--hover: hsl(240, 70%, 70%):悬停时先灰一下再蓝,不是 OKLCH 问题,是插值空间断裂 - 渐变写成
linear-gradient(oklch(62% 0.28 258.5), rgb(100, 100, 255)):中间段饱和度塌陷,出现不可控的灰紫色带 - 自定义属性里
--bg: oklch(95% 0.02 258.5),但background-color: var(--bg); color: hsl(240, 100%, 20%):文字色仍按 HSL 解析,对比度计算脱离 OKLCH 感知逻辑
oklch() 写法错误会导致“静默消失”,不是偏色而是无色
这不是色偏,是整条声明被浏览器忽略——用户看到的是 fallback 色或透明背景,误以为“偏了”,其实是根本没生效:
-
oklch(62 0.28 258.5)❌ —— L 缺 %,Chrome 112+/Safari 17.4+ 全部跳过 -
oklch(62% 28% 258.5)❌ —— C 写成百分比,解析失败,静默失效 -
oklch(62% 0.28 258.5deg)❌ —— Safari 16.x 及部分安卓 WebView 不认deg后缀 - 正确写法只有两种:
oklch(62% 0.28 258.5)(兼容性最高),或oklch(0.62 0.28 258.5)(仅最新 Safari/Chrome/Firefox,且 H 小数位必须 ≤1)
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











