CSS 盒子阴影生成器

下一个

一次生成一条 box-shadow 规则:设置水平和垂直偏移、模糊、扩散、颜色以及可选的 inset,然后复制结果。真实的阴影通常需要两到三层,所以请逐层生成,再用逗号把规则连起来。

如何设计盒子阴影

  1. 1

    设置阴影参数

    水平偏移、垂直偏移、模糊半径、扩散,以及带透明度的颜色。

  2. 2

    切换 inset

    把阴影切换为 inset 即可得到内阴影,适合表现按下的按钮和凹陷效果。

  3. 3

    选择阴影颜色

    低透明度的黑色是经典之选。与元素色调相近、稍深一些的彩色阴影看起来更自然。

  4. 4

    复制 CSS

    复制单条阴影规则并粘贴到你的样式表中。要制作多层阴影,请逐层生成,再用逗号合并规则。

box-shadow 语法

box-shadow: <x-offset> <y-offset> <blur> <spread> <colour> [inset];
  • x-offset:正值 = 向右,负值 = 向左。
  • y-offset:正值 = 向下,负值 = 向上。
  • blur:0 = 硬边缘,数值越大越柔和。可见范围大约向元素外延伸模糊值的 1.5 倍。
  • spread:在元素之外额外扩展的尺寸。正值放大阴影,负值缩小阴影(适合营造细微的光晕)。
  • colour:支持任意 CSS 颜色。rgba(0, 0, 0, 0.15) 是最常用的基础值。
  • inset:将阴影翻转到元素内部的关键字。

多层阴影看起来更真实

这款生成器一次只输出一条阴影规则;要制作多层阴影,请逐层生成,再用逗号合并规则。

单层 0 0 40px 的阴影显得朦胧。两层阴影,靠近元素的小而锐利的一层,以及更远处大而柔和的一层,能够模拟真实光线散射的方式。

box-shadow:
  0 1px 2px rgba(0, 0, 0, 0.08),
  0 4px 12px rgba(0, 0, 0, 0.08);

第一行给出紧贴元素的接触阴影,第二行给出更柔和的环境阴影。仅凭这一种组合,就能覆盖约 80% 的卡片式 UI。

高度(Elevation)层级系统

Material Design 使用 6 个高度(elevation)层级,每个层级对应一套不同的阴影组合。简化如下:

高度层级 阴影
1(静止) 0 1px 3px rgba(0,0,0,.12), 0 1px 2px rgba(0,0,0,.24)
2 0 3px 6px rgba(0,0,0,.16), 0 3px 6px rgba(0,0,0,.23)
3 0 10px 20px rgba(0,0,0,.19), 0 6px 6px rgba(0,0,0,.23)
4(抬升) 0 14px 28px rgba(0,0,0,.25), 0 10px 10px rgba(0,0,0,.22)
5(悬浮) 0 19px 38px rgba(0,0,0,.30), 0 15px 12px rgba(0,0,0,.22)

为每种高度角色选定一套,并保持一致使用。

彩色阴影看起来更自然

纯黑阴影显得生硬,因为真实阴影会被下方表面染上色调。不妨试试:

box-shadow: 0 12px 24px rgba(40, 80, 120, 0.18);

用偏冷的蓝灰色代替纯黑。在暖色背景上,则改用更暖的色调。

性能

盒子阴影会在每次重绘时被绘制。在大量元素上使用又大又重的阴影,可能会拖慢滚动。缓解办法:

  • 在元素上使用 transform: translateZ(0),强制生成合成层。
  • 仅当需要阴影跟随 clip-path 时,才用 filter: drop-shadow() 替换复杂阴影(通常它更慢)。
  • 限制频繁重新渲染的元素上的阴影。

用于按下状态的 inset

.button:active {
  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.12);
}

inset 阴影能模拟凹陷的外观,按钮看起来像被压进了表面。配合一个小幅向下的 transform: translateY(1px),可以带来真实的触感点击反馈。

常见问题

通常是因为模糊太小或扩散太大。没有模糊、边缘锐利的阴影看起来就像一个重复的元素。请加大模糊(20–30px 是常见的起点),并把扩散保持在 0 或很小的负值。

box-shadow 会跟随元素的 border-box(包括 border-radius),所以圆角卡片会自动得到漂亮的圆角阴影。对于用 clip-path 裁剪出的形状,box-shadow 不会跟随裁剪;这时请改用 filter: drop-shadow()

在选定方向上大幅偏移阴影,并用负扩散来隐藏对侧。或者使用两层阴影,一层在目标侧可见,另一层用负扩散来“吃掉“多余溢出的部分。

没有硬性上限,但每多一层阴影就多一次绘制。三到四层是实际可行的上限;再多就应该考虑改用背景图或 SVG。

相关工具