linear-gradient默认走srgb插值是因为浏览器规范强制要求,即使使用oklch()等新颜色函数,未显式声明插值空间时仍会转为srgb线性混合,导致中间出现灰紫/灰绿等非感知均匀过渡;目前唯一支持oklab插值的纯css方案是color-mix(),且需起止色同属oklab()/oklch()格式并确保浏览器支持(chrome 112+/safari 17.5+)。

linear-gradient为什么默认走sRGB插值
浏览器对linear-gradient不做显式声明时,底层强制使用srgb空间插值——这不是配置遗漏,而是规范行为。即使你写oklch(0.6 0.25 240)和oklch(0.8 0.25 0),解析器仍会先转成 RGB 再线性混合,中间必然经过人眼敏感的灰紫/灰绿区。
常见错误现象包括:深蓝→亮红渐变中段浮现脏紫色、浅灰→白过渡出现肉眼可见的“台阶”、iOS Safari 上连#f8f8f8 → #ffffff都显带状。
- 所有现代浏览器(Chrome 112+、Safari 16.4+、Firefox 120+)目前均不支持在
linear-gradient()中用in oklch或in oklab语法 -
in lch和in hsl虽被部分支持,但仅限 SVG<lineargradient></lineargradient>,CSS 原生渐变不认 - 所谓“加
in srgb-linear能改善”,实测无效:该值仅影响滤镜和混合模式,对渐变插值无作用
OKLAB 真正起效的唯一场景:color-mix()
color-mix()是当前唯一能在纯 CSS 中稳定启用 OKLAB 插值的函数——它不依赖运行时渐变引擎,而是静态计算两个颜色在指定空间中的加权混合结果,完全绕过浏览器的渐变插值路径。
使用前提是:起止色必须同为oklab()或oklch()格式,且浏览器支持(Chrome 112+、Safari 17.5+;Firefox 尚未实现)。
- 正确写法:
color-mix(in oklab, oklab(0.4 0.1 -0.05) 70%, oklab(0.85 0.02 0.12) 30%) - 错误写法:
color-mix(in oklab, #4a6fa5 70%, oklab(0.85 0.02 0.12) 30%)(混用格式导致整条失效) - 若需生成多阶色,必须手动调用多次
color-mix(),无法用循环;PostCSS 插件如@csstools/postcss-color-mix可辅助生成
如何让渐变看起来不灰:停靠点 + 噪点双保险
当无法用color-mix()预生成中间色时,最可靠方案是控制插值路径本身:显式设置停靠点压缩跨度,并叠加视觉干扰层打破色带规律。
- 避免两端直写:
linear-gradient(to right, #003366, #ff6b6b)→ 必然断层 - 改为三段:
linear-gradient(to right, #003366 0%, #5a5a99 45%, #ff6b6b 100%),中间色选感知中位而非数值中位 - 加噪点:用 SVG data URL 叠一层透明度
0.02的随机像素,background-image: linear-gradient(...), url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2' height='2'%3E%3Crect width='1' height='1' fill='%23000'/%3E%3Crect x='1' width='1' height='1' fill='%23fff'/%3E%3C/svg%3E") - 禁用
rgba()做透明渐变:如rgba(255,0,0,1) → rgba(255,0,0,0)会在白色背景上显灰,应改用background-blend-mode: multiply配合固定底色
fallback 不是补丁,是层叠顺序问题
OKLAB/OKLCH 颜色在旧浏览器中不会“变灰”,而是整条声明被丢弃,最终取父级继承值(常为黑色)或 UA 默认值(background-color为透明)。所谓“显示灰色”,其实是你在深色背景下看到文字不可读的错觉。
- 正确 fallback 必须是同一属性内、按从上到下顺序:
background-color: #4a6fa5; background-color: oklch(60% 0.18 250); - 顺序反了(oklch 在前)则全失效;拆成两个 class 或用
@supports包裹都无效 - 十六进制 fallback 要人工校验:自动转换工具常把高饱和蓝紫映射成发灰的 RGB,建议用 Chrome DevTools 的 Color Picker 实时比对
- PostCSS 插件生成 fallback 时,务必设
preserve: true,否则原始 oklch() 会被删掉
color-mix()预计算、以及噪点这种物理层干扰——所有这些,都得亲手控制,没有自动魔法。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











