OKLCH渐变比HSL更平滑,因其在感知空间插值,但linear-gradient()仍强制sRGB插值;真正启用OKLCH插值需用color-mix(in oklch),且须全链路统一oklch格式、色相差超180°时手动拆段。

OKLAB 渐变不是“比 RGB 更平滑”,而是插值空间不同
浏览器对 linear-gradient() 的底层插值始终在 sRGB 空间进行,无论你写的是 rgb()、hsl() 还是 oklab()。所以 linear-gradient(oklab(0.5 0.1 240), oklab(0.5 0.3 240)) 并不会触发 OKLAB 插值——它只是把两个 OKLAB 坐标先转成 sRGB,再线性混合。所谓“更自然”,其实是你用 OKLAB 坐标定义的起止色,在 sRGB 插值后碰巧更接近人眼预期,而非空间本身被用了。
真正启用 OKLAB 插值必须绕过 linear-gradient()
要让颜色过渡按 OKLAB 路径走,得用 color-mix(in oklab, ...) 或 JS 手动插值后生成多段 CSS 颜色。例如:
background: linear-gradient( to right, color-mix(in oklab, #ff6b35 0%, #2a2a72 100%), color-mix(in oklab, #ff6b35 10%, #2a2a72 90%), /* …更多中间点 */ );
但注意:color-mix() 仅支持两个颜色混合,无法直接替代渐变;若需连续过渡,必须用 JS 或构建时工具生成足够密的停靠点(建议 ≥16 段),否则仍会出现 banding。
OKLAB 在 gradient 场景下容易踩的坑
-
oklab()的 L 值必须带单位(0.6或60%),混用60(无单位无%)会导致整条声明静默失效 - 色相差大时(如 a/b 值符号相反),OKLAB 不自动走短弧,可能经过低色度区 → 视觉上出现灰带,必须手动拆段或改用
oklch()+ 显式 H 控制 - 和
oklch()混写在同一linear-gradient()中(比如一个用oklab(),一个用oklch()),整条渐变会被浏览器忽略,背景变透明或回退到上一声明 -
@supports (color: oklab(0 0 0))永远返回 false,检测必须用oklch(0% 0 0)
OKLCH 才是当前 CSS 中真正可维护的感知均匀方案
OKLAB 是直角坐标系(L, a, b),没有直观色相概念;OKLCH 是它的极坐标形式(L, C, H),其中 H 是 0–360° 可读色相角,调试时能直接对应色环。日常做日落、深色模式适配、悬停态,用 oklch() 更安全:
立即学习“前端免费学习笔记(深入)”;
- 调亮度只动
L,色相不漂:比如oklch(62% 0.28 258.5)→oklch(38% 0.28 258.5) - 调饱和度只动
C,明暗不变:禁用态可设为oklch(62% 0.08 258.5) - 色相差超 180° 必须手动拆段:
oklch(0.7 0.25 350)→oklch(0.7 0.25 0)→oklch(0.7 0.25 10)
OKLAB 适合工具链内部计算,OKLCH 才是前端手写 CSS 时真正扛得住的感知均匀颜色函数——前提是全链路统一,且别指望 linear-gradient() 自动帮你切换空间。


















