oklab渐变通过lab空间插值避开灰区,实现干净色相过渡,但浏览器尚不支持原生oklab渐变,需js预计算转rgb/hsl并注入css变量实现。

OKLab 渐变天然避免 RGB 插值的灰区穿越
RGB 线性插值从 #0000ff 到 #ffff00,必须经过 R/G/B 三通道同步拉伸的数学路径,结果是中间段大量低饱和、中明度的蓝紫→灰绿→黄绿过渡色——这些区域在 LAB 空间里离中性灰极近,人眼一扫就觉“脏”。OKLab 插值不是算 R/G/B 值,而是沿亮度(L)、a/b 色度轴等距移动,路径始终避开感知敏感灰带,视觉上就是干净的蓝→青→黄过渡。
OKLab 的 L 和 Chroma 可独立控制,渐变节奏可控
RGB 插值无法分离明暗与色相变化:调亮的同时必然拖拽色相。OKLab 中 L 控制明暗、a/b 控制色相与彩度,你可以让亮度平稳上升,同时保持彩度恒定、色相匀速旋转——这正是人眼期待的“渐亮不发灰”“变色不褪色”。实际写法如 oklab(0.3 0.2 0.1) → oklab(0.7 0.2 0.1),只动 L,颜色纯度丝毫不丢。
浏览器对 OKLab 渐变的支持仍有限,别直接写 linear-gradient(oklab(), oklab())
截至 Chrome 128 / Firefox 125 / Safari 17.5,linear-gradient() 函数里的 in oklab 关键字仍被忽略,所有主流浏览器 fallback 回 sRGB 插值。你看到的“OKLab 渐变效果”,几乎全是靠 JS 预计算 + CSS 变量注入实现的。真正起作用的是:
- 用 colorjs.io 或 oklab-converter 库把 OKLab 起止色采样成 5–9 个中间点
- 全部转成 rgb() 或 hsl() 后写入 CSS 自定义属性
- 再用 transition: background-color 逐帧切换这些离散色阶
直接在 CSS 里写 OKLab 渐变,目前只是徒增维护成本,不改变渲染结果。
OKLab 不是万能解药,色相跨 0°/360° 边界时照样出灰紫带
OKLab 对色相插值不做短弧优化。比如 oklab(0.6 0.25 355) → oklab(0.6 0.25 5),浏览器会按 355→356→357→358→359→0→1→2→3→4→5 计算,数值上绕了一整圈,导致中间段 a/b 坐标被强制压缩,彩度骤降,视觉上就是一段灰紫色断层。解决方法只有两个:
- 手动把终点色相加 360°(即写成 oklab(0.6 0.25 365)),让插值走 +10° 短弧
- 或干脆拆成两段动画:先到 oklab(0.6 0.25 360),再跳到 oklab(0.6 0.25 0)
后者更可靠,但得用 JS 控制时机。
OKLab 的自然感来自空间设计本身,但它的“可落地性”高度依赖 JS 层介入——纯 CSS 写法目前只是幻觉,真要丝滑,就得接受这个前提。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











