linear-gradient(in lch, ...)是唯一真正走lch插值的方案,因chrome 112+等主流浏览器仅在此语法下解耦l/c/h计算,避免rgb灰带;其他方式如transition或color-mix()均不触发lch插值,且需严格单位、禁混色空间、高c值(≥50)才显优势。

LCH渐变在CSS中能真正平滑,但只有一种写法有效:必须用linear-gradient(in lch, ...),其他方式(包括transition、color-mix()直接驱动背景色)都不走LCH插值路径。
为什么linear-gradient(in lch, ...)是唯一可靠方案
Chrome 112+、Firefox 120+、Safari 17.4+ 已完整支持该语法,且插值过程真正在LCH空间完成——亮度L、色度C、色相H三者解耦计算,避免RGB线性插值导致的“灰色死亡带”。实测同一组起止色,in lch渐变的中间色阶连续性比in srgb高约40%。
常见错误现象:
- 写了
background: linear-gradient(lch(60% 80 240), lch(30% 80 240))但没加in lch前缀 → 浏览器默认回退到sRGB插值 - 混用色空间:
linear-gradient(in lch, lch(60% 80 240), hsl(240, 100%, 50%))→ 浏览器无法跨空间插值,直接跳变 - 单位写错:
lch(60 80 240)(L缺%)或lch(60% 80deg 240)(C/H加了单位) → 整条声明静默失效
如何安全降级并检测兼容性
@supports只能判断浏览器是否能解析lch()函数,不能保证in lch渐变可用。稳妥做法是把降级色写在@supports块外,再用@supports包裹增强声明:
background-color: #000;
@supports (background: linear-gradient(in lch, lch(0% 0 0), lch(100% 0 0))) {
background-image: linear-gradient(in lch, lch(0% 0 0), lch(80% 120 90));
}
注意要点:
- 降级色必须是
background-color,不是background——否则旧浏览器可能忽略整条规则 - 测试语句里用了
lch(0% 0 0)和lch(100% 0 0)这种极简组合,避免因C/H值异常导致检测失败 - Android WebView对
in lch支持仍不稳定,生产环境建议加prefers-reduced-motion: no-preference二次兜底
LCH渐变“自然”的前提是两端色度足够高
如果起止色都是低彩度(比如lch(60% 10 200)→lch(60% 15 220)),LCH和sRGB过渡肉眼几乎无差别——此时用hsl()调S和L反而更可控、更轻量。
真正需要LCH的场景很明确:
- 深蓝→亮黄这类大跨度色相跃迁(H差>120°)
- 黑→饱和色(如
lch(0% 0 0)→lch(80% 120 240))需保持中间段不发灰 - 设计系统中要求多端视觉一致性,且已确认目标用户设备覆盖Chrome/Firefox/Safari主流版本
容易被忽略的是:LCH的“感知均匀”依赖于起止色的C值≥50。低于这个阈值,插值优势迅速衰减,不如回归HSL手动微调。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











