oklch渐变语法不被浏览器支持,linear-gradient(in oklch,...)会被静默忽略并回退到srgb插值;真正生效的是oklch单色定义、color-mix(in oklch,...)及oklch动画中的空间插值。

OKLCH渐变在CSS中根本不会被当作渐变执行
你看到的“平滑”大概率是错觉——linear-gradient(in oklch, ...) 在所有主流浏览器(Chrome 124+、Firefox 125、Safari 17.5)中都会被静默忽略,回退到 sRGB 插值。DevTools 里看到的 computed color 全是 rgb(),中间照样发灰。这不是你写错了,是语法根本不被支持。
真正起作用的是 OKLCH 色值本身,不是它的渐变语法
OKLCH 的平滑感只在单色定义或 color-mix() 中生效,因为这些地方浏览器真正在 OKLCH 空间做计算:
-
color-mix(in oklch, oklch(55% 0.22 258) 70%, oklch(85% 0.05 258) 30%)→ L 值线性过渡,C 缓慢衰减,视觉明暗均匀 -
background-color: oklch(60% 0.28 258.5)→ 比hsl(258, 100%, 60%)更准地匹配人眼感知亮度 - 动画中用
@keyframes切换多个 OKLCH 单色时,浏览器会在 OKLCH 空间插值(Chrome/Safari 支持,Firefox 尚未实现)
想让渐变真正平滑,必须绕过浏览器默认插值
靠 linear-gradient() 写 OKLCH 是徒劳的。可行路径只有三条:
- 用 JS 或构建工具(如
postcss-oklab)预生成 5–7 个 OKLAB 路径上的rgb()停靠点,拼成多段渐变:linear-gradient(to right, #3a5fa8, #5b6cbf, #7c7ed5, ...) - 用
color-mix()手动算出关键过渡色,再塞进渐变停靠点,比如:linear-gradient(to right, oklch(55% 0.22 258), color-mix(in oklch, ...), oklch(85% 0.05 258)) - 对色相差 >180° 的场景(如 350°→10°),必须手动拆段:
oklch(0.7 0.25 350), oklch(0.7 0.25 0), oklch(0.7 0.25 10),否则中间 H 经过 0° 时 C 被强制压缩,出灰紫带
最容易被忽略的致命细节:单位和降级结构
哪怕你决定只用 OKLCH 单色做动画,写错一个单位就全失效:
-
oklch(60 0.28 258.5)❌ —— L 缺%,Chrome/Safari 直接跳过整行 -
oklch(60% 28% 258.5)❌ —— C 必须是无单位小数(0.28),不是百分比 -
@supports (color: oklch(0 0 0))❌ —— 检测值必须带单位,否则安卓 WebView 可能返回 false - 降级色必须写在
@supports块**外部且上方**,顺序颠倒会导致 OKLCH 彻底不加载
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











