oklab() 不含色相维度,仅含正交的l(亮度)、a/b(色度)三参数,浏览器尚未支持;oklch() 才含h(色相角),但css插值不自动处理短弧,需手动拆分跨0°过渡。

oklab() 三参数是 L a b,没有色相概念
oklab() 的 oklab(L a b) 是正交坐标系:L 是感知亮度,a/b 是两个正交色度轴,单位全为无量纲小数(如 oklab(0.6 -0.12 0.08))。它压根不包含“色相”这个维度,自然也不存在 H 值、角度、跨 0° 问题。你写 oklab(0.5 0.2 0.1) 和 oklab(0.5 0.2 -0.1),只是在 a-b 平面上左右偏移,和“红变橙”这种直觉无关。
常见错误现象:
- 误以为
oklab()能直接调色相,结果改 a/b 后颜色发灰或跳变 - 把
oklab()当作oklch()的简写,混用在渐变里期望保色相,实际插值路径完全不可控
oklch() 才有 H(色相角),但浏览器不做短弧处理
oklch(L C H) 是 oklab() 的极坐标表达:H = atan2(b, a),所以它才真正对应人眼对“色调”的感知。但关键点在于——CSS 引擎对 H 的插值是纯数值线性计算,不自动识别 350° → 10° 应该走 +20° 而非 −340°。
使用场景差异明显:
- 做色环按钮、H 变化为主的悬停态:
oklch(60% 0.28 240) → oklch(60% 0.28 270)(差 ≤180°)可直接用 - 跨红→黄→绿的长色相过渡:必须手动拆段,例如
linear-gradient(oklch(0.7 0.25 350), oklch(0.7 0.25 0), oklch(0.7 0.25 10)) - 禁用态降饱和:只动 C,L 和 H 固定,避免文字在浅底上对比度断崖下跌
浏览器支持现状决定你根本不能用 oklab() 做颜色声明
截至 2026 年 10 月,oklab() 函数虽被 W3C 标准定义,但在 Chrome、Firefox、Safari 所有主流版本中均未实现。你写 color: oklab(0.5 0.1 0.2);,浏览器会静默忽略整条规则,不会 fallback,也不会报错——UI 可能突然变透明或继承错误背景色。
而 oklch() 已稳定支持:
- Chrome 112+
- Safari 17.4+(iOS 17.4+)
- Firefox 121+
实操建议:
- 所有颜色令牌(
--primary等)一律用oklch(),别碰oklab() - 想用 OKLab 空间做 JS 插值(比如 colorjs.io)?可以,但输出必须转成 RGB 或
oklch()再塞进 CSS -
@supports (color: oklab(0 0 0))检测永远返回 false,别试
选 oklch() 还是 lch()?看设备与深色模式需求
lch() 支持更早(Chrome 111+/Safari 16.4+),但基于 CIELAB 空间,在蓝紫/黄绿区感知非均匀;oklch() 基于 OKLab,校正了这些区域的响应偏差,尤其适合深色模式下精细控亮。
性能与兼容性权衡:
- 面向 iOS 17.4+ / Android 14+ 新设备:优先
oklch(),L 值更稳,深色模式切换时蓝调不发紫 - 需兼容 iOS 16.x 或旧安卓 WebView:降级用
lch(),但注意其 L 在青蓝色系里易显灰 - 两者都不能混用在同一条渐变或 transition 中,否则整条 fallback 到 sRGB 插值
最常被忽略的不是空间选择,而是单位细节——oklch(60 0.28 258.5) 少个 %,整行失效;降级色写在 @supports 块里,老设备直接黑屏。这些地方一错,OKLab 再准也没用。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











