hsl(from)比rgba(0,0,0,0.x)更适合作为阴影色阶,因其能继承主色的色相与饱和度,仅独立调控亮度,确保阴影与元素同源、不偏色、可随主题自动适配;配合css变量与calc()可实现多层明暗梯度及暗色模式安全映射。

直接用 hsl(from) 从主色派生阴影,比硬编码 rgba 更可控、更可维护。 它不是“一键生成”的魔法按钮,而是把颜色逻辑写进 CSS 变量里,让每层阴影自动跟随主题色变化。
为什么 hsl(from) 比 rgba(0,0,0,0.x) 更适合做阴影色阶
纯黑 rgba 阴影在非白背景上会发灰、偏色、失去层次;而 hsl(from) 能继承主色的色相(h)和饱和度(s),只调亮度(l),确保阴影和元素“同源”。比如蓝色按钮配蓝灰阴影,不会突兀跳色。
- 主色是
--primary: hsl(210, 70%, 55%),深色阴影只需hsl(from var(--primary) h s calc(l - 25)) - 浅色背景上的浅灰阴影,可用
hsl(from var(--primary) h calc(s * 0.3) calc(l + 15))提亮+降饱和 - 不依赖外部工具或 JS,纯 CSS 运行时计算,兼容 Chrome 111+、Safari 16.4+、Firefox 110+
box-shadow 多层叠加时如何用 hsl(from) 分层控制明暗
多层阴影不是靠“加黑”,而是模拟本影→半影→环境光反射的亮度梯度。每层用不同 calc(l ± N) 得到自然过渡:
- 近层(本影):
hsl(from var(--primary) h s calc(l - 30))→ 对比强、略偏冷 - 中层(半影):
hsl(from var(--primary) h calc(s * 0.6) calc(l - 10))→ 降饱和、提亮度,柔化边缘 - 远层(弥散):
hsl(from var(--primary) h calc(s * 0.1) calc(l + 5))→ 几乎无饱和、接近背景灰,透明度压到0.04
别把所有层都写成 calc(l - 20) —— 缺少明暗节奏,阴影就“平”。
暗色模式下 hsl(from) 阴影怎么不翻车
直接复用同一套 hsl(from --primary) 在深色背景上会变“亮影”,视觉上像凸起。必须配合 @media (prefers-color-scheme: dark) 重定义基准亮度:
- 默认(亮色模式):
--primary-l: 55%→ 深阴影用calc(l - 30) - 暗色模式下:
--primary-l: 35%→ 同样calc(l - 30)就变成5%,太黑;应改用calc(l + 15)得到浅灰 - 更稳妥做法:定义独立变量
--shadow-dark-l-offset: 15和--shadow-light-l-offset: -25,在媒体查询里切换
容易被忽略的兼容性与性能点
hsl(from) 不支持 IE 和旧版 Safari(box-shadow,后一个覆盖前一个即可:
button {
--primary: hsl(210, 70%, 55%);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
box-shadow: 0 2px 4px hsl(from var(--primary) h s calc(l - 25));
}
注意:blur-radius > 32px 时渲染开销明显上升,尤其在移动设备上;如果用了 hsl(from) 还配上 blur: 48px,得确认是否真需要——多数场景 blur: 16px + 三层 hsl(from) 已足够有纵深感。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











