Menu

CSS 盒子阴影:语法、扩展、内阴影与示例

box-shadow 在元素的盒子周围绘制阴影。学习五个值(x、y、模糊、扩展、颜色)、内阴影、叠加多层阴影营造真实的立体感、用扩展值做焦点环,以及会让阴影显得浑浊的常见错误。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

box-shadow 的工作原理

box-shadow 在元素的边框盒周围绘制阴影。它会跟随 border-radius,不占用布局空间,并且至少需要两个值:水平方向和垂直方向各移动多远。

语法

box-shadow: [inset] <offset-x> <offset-y> [<blur>] [<spread>] [<color>];
值含义默认值
inset把阴影画在盒子内部,看起来像一块凹陷的区域外部
offset-x正值向右移,负值向左移必需
offset-y正值向下移,负值向上移必需
blur边缘有多柔和;不能为负0(硬边)
spread放大(正值)或缩小(负值)阴影0
color任意颜色;半透明的黑色通常效果最好文字颜色

长度值的个数决定了它们的含义:两个是偏移,三个则加上模糊,四个再加上扩展。试一试:

试试 0 0 0 4px #f59e0b(一个环)、inset 0 0 12px #2563eb 和 -8px -8px 0 #16a34a。

扩展:环形阴影和单侧阴影

扩展值在模糊之前改变阴影的大小。由此可以得到两种常用效果:

  • 环形: 没有偏移,没有模糊,只有扩展。和边框不同,它不会改变元素的尺寸,所以很适合做焦点指示(:focus-visible { box-shadow: 0 0 0 3px #2563eb; })。
  • 带间隙的环: 把一个白色的扩展阴影叠在一个更大的彩色扩展阴影上面。
  • 只有一侧: 把阴影向下移动,再用负的扩展值把它缩小,这样它只会从底部露出来。

多层阴影营造真实的立体感

真实的阴影在靠近物体的地方又深又清晰,离得远的地方则柔和而淡。两三层阴影比一个大面积的模糊更能模仿这种效果:

列表中的第一个阴影画在最上面。阴影颜色要用半透明的黑色或背景色的深色调,而不要用纯灰色,这样它们才能让下面的任何内容都变暗。

内阴影

inset 把阴影画在内边距盒的内部,就像表面被按下去了一样。它适合文本输入框、凹槽区域和按下状态的按钮:

input {
  box-shadow: inset 0 1px 3px rgb(0 0 0 / 20%);
}
button:active {
  box-shadow: inset 0 3px 6px rgb(0 0 0 / 30%);
}

内阴影画在背景之上、内容之下。跟随字母形状而不是盒子形状的阴影,请使用 text-shadow。

常见错误

  • 纯黑且完全不透明的阴影。 看起来就像一条深色轮廓线。请使用 10% 到 30% 的透明度。
  • 用一个巨大的模糊来表现立体感。 把一个小而清晰的阴影和一个大而柔和的阴影叠在一起。
  • 阴影在边缘被截断。 带有 overflow: hidden 的祖先元素会把它裁掉;给祖先元素加上内边距,或者把 overflow 规则移到别处。
  • 负的模糊值。 这是无效的,整条声明都会被忽略。
  • 在很多元素上对 box-shadow 做动画。 它每一帧都会重绘。对于较重的页面,请改为给一个带有更大阴影的伪元素的 opacity 做动画。

常见问题

box-shadow 的语法是什么?

box-shadow: offset-x offset-y blur spread color;,例如 box-shadow: 0 4px 12px 0 rgb(0 0 0 / 15%);。只有两个偏移值是必需的;加上 inset 就会把阴影画在盒子内部。

box-shadow 中的扩展(spread)有什么作用?

它在模糊之前把阴影放大(正值)或缩小(负值)。一个没有偏移、没有模糊、扩展为 3px 的阴影,就是围绕元素的一圈 3px 实心环。

如何只在底部显示阴影?

把阴影向下偏移,再用负的扩展值把它往里收,让两侧的阴影消失:box-shadow: 0 8px 6px -6px rgb(0 0 0 / 40%);。

box-shadow 会影响布局吗?

不会。阴影不占用空间,也不会移动其他元素,所以很适合用来添加焦点环或悬停时的浮起效果,而不会造成布局偏移。不过它可能会被祖先元素的 overflow: hidden 裁掉。

可以设置多个盒子阴影吗?

可以,用逗号隔开。第一个阴影画在最上面。把一个小而清晰的阴影和一个大而柔和的阴影叠在一起,比单独一个大阴影看起来更自然。

Coddy 编程语言插图

和 Coddy 一起学编程

开始