oklab() 是当前唯一被主流浏览器原生支持的感知均匀色彩函数,而 lab() 尚未被任何浏览器实现;oklab() 参数为无量纲小数(如 oklab(0.5 -0.12 0.08)),非百分比或整数,且不等价于 CIELAB。

oklab() 在 CSS 中根本不是“比 CIELAB 更适合屏幕显示”,而是 CIELAB 的 lab() 函数在所有主流浏览器中完全不可用——你写 lab(50 20 10),浏览器直接忽略,不报错、不降级、不渲染。
真正被支持的是 oklab(),它和 lab() 是两个独立函数,底层数学不同,也不存在“兼容替代”关系。
oklab() 能用,lab() 不能用
- 所有主流浏览器(Chrome 112+、Safari 17.5、Firefox 115+)都已原生支持
oklab(),无需 flag -
lab()虽然写在 CSS Color Level 4 标准里,但截至 2026 年 9 月,没有一个主流浏览器实现它 -
@supports (color: lab(0 0 0))在任何浏览器中都返回 false
你看到的“OKLab 比 Lab 更准”,是指它在蓝紫/黄绿区插值更稳、色度塌陷更少——但这只在 JS 端用 colorjs.io 或 palette 库做计算时生效;纯 CSS 里写 oklab() 只是存个值,不触发任何插值逻辑。
oklab() 参数不是“Lab 的翻版”,别套用旧习惯
oklab() 接收三个无量纲数值:L a b,单位全是小数(如 0.5 -0.12 0.08),没有角度、没有百分比、没有 deg:
立即学习“前端免费学习笔记(深入)”;
-
L是感知亮度(0 = 黑,1 = 白),不是 sRGB 的 0–100% -
a和b是正交色度轴,不是“饱和度 + 色相” - 写成
oklab(50% 20 10)或oklab(50 20 10)都会静默失效 - 正确写法只有:
oklab(0.5 -0.12 0.08)(Chrome/Safari/Firefox 全支持),或oklab(50% -0.12 0.08)(仅部分新版支持,不推荐)
渐变和 color-mix 里真正出问题的不是空间本身,是你没约束输入
oklab() 自身不处理色相连续性——那是 oklch() 的事。但很多人误把 oklab() 当作“带色相的 Lab”,然后在渐变里写:
linear-gradient(oklab(0.6 0.25 -0.1), oklab(0.6 0.25 0.1))
这看起来是左右对称,但实际 a/b 值跨零点时,中间段可能经过极低色度区,视觉发灰。这不是 OKLab 的缺陷,是你没意识到:a/b 接近零时,方向信息丢失,H 计算会抖动。
更常见踩坑的是用 color-mix(in oklab, ...) 混两个高 L 低 C 的灰调色——结果因 a/b 数值噪声,输出意外偏青或偏粉。
关键不在“哪个空间更好”,而在:lab() 是纸面标准,oklab() 是实装函数;
你能写的、能测的、能 fallback 的,只有 oklab() ——其他都是空谈。
单位写错、参数越界、混用空间,UI 就静默崩掉,连 DevTools 都不提醒。


















