lch() 不能模拟物理光影,仅是cie lch色彩空间的css表示,缺乏光照模型、材质反射和几何信息;其“自然”源于lch三属性解耦更符合人眼感知,但需规避低l高c渲染缺陷及浏览器兼容问题。

lch() 本身不能模拟物理光影,它只是 CIE LCH 色彩空间的 CSS 表示,没有光照模型、材质反射或场景几何信息。真实光影需要渲染引擎(如 WebGL)或物理着色器,CSS 不参与光路计算。
为什么 lch() 看起来“更自然”?
它把亮度(L)、色度(C)、色调(H)解耦,比 rgb() 更贴合人眼感知——比如调亮一个橙色时,lch(80% 70 40) 不会像 rgb(255, 165, 0) 那样轻易溢出为惨白或发灰;调整 C 值也能更可控地增减饱和度,避免在暗部强行拉高饱和导致失真。
常见误用现象:lch(30% 120 210) 在深蓝区域出现明显 banding 或渲染不一致,因为多数浏览器对低 L 高 C 的组合支持不完整(尤其 Safari 16.4 之前)。
- 使用场景:UI 中需保持视觉重量一致的渐变、状态色(如 success/warning/error)、深色模式下的色彩过渡
-
L推荐范围:15%–95%,避开两端(L 易丢失细节,<code>L > 98%接近显示器白点,色相偏移不可控) -
C并非越大越好:同一H下,C=80在L=50%可能正常,但在L=20%会触发浏览器降级到 sRGB 插值,颜色“发粉”或“发灰”
怎么让 lch() 行为更接近光照直觉?
靠手动映射——把光源方向、强度、表面法线等抽象为 L 和 C 的联动规则,而非自动计算。例如模拟“顶光照射哑光红球”:
/* 暗部 → 降低 L,适度压 C;亮部 → 提升 L,C 微增;中间调 → C 最高 */
.ball-dark { color: lch(35% 55 15); }
.ball-mid { color: lch(60% 75 15); }
.ball-light { color: lch(88% 65 15); }
- 不要用
H模拟色温变化:lch(70% 40 20)(暖黄)→lch(70% 40 250)(冷紫)不是“光照变冷”,只是换了色调;真实色温影响的是整个光谱响应,需改用color-mix(in lch, ...)混合白光基准 - 深色模式适配时,别只调
L:同步缩放C(如乘以 0.7),否则暗背景下高色度色块会“跳出来”,破坏光影层次感 - Chrome 117+ 支持
lch()无损插值,但 Firefox 120 仍对lch()渐变做 sRGB 中间采样,导致过渡生硬
哪些地方必须放弃 lch()?
涉及真实光学行为的场景,lch() 无法替代物理模型:
- 镜面高光:需要
specular exponent和视角向量,CSS 无对应参数 - 环境光遮蔽(AO):依赖几何深度,
lch()没有空间维度 - 透射/折射(如玻璃、水):需波长相关衰减,
lch()是设备无关抽象,不包含光谱数据 - 错误信息:
Invalid lch() function通常因C超出当前L/H组合的色域(如lch(10% 100 120)在 Display P3 下非法)
真正要模拟物理光影,得用 color-mix() + 自定义色域(color(display-p3 ...)),或导出到 Canvas/WebGL 处理;lch() 只是让你在 CSS 层更少“违背感知常识”。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











