box-shadow

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

box-shadow CSS 属性用于在元素的框架周围添加阴影效果。你可以设置多重效果,每层效果之间用逗号分隔。一个盒阴影由相对于元素的 X 和 Y 偏移量、模糊和扩散半径,以及颜色来描述。

试一试

box-shadow: 10px 5px 5px red;
box-shadow: 60px -16px teal;
box-shadow: 12px 12px 2px 1px rgb(0 0 255 / 0.2);
box-shadow: inset 5em 1em gold;
box-shadow:
  3px 3px red,
  -1em 0 0.4em olive;
<section id="default-example">
  <div class="transition-all" id="example-element">
    <p>This is a box with a box-shadow around it.</p>
  </div>
</section>
#example-element {
  margin: 20px auto;
  padding: 0;
  border: 2px solid #333333;
  width: 80%;
  text-align: center;
}

box-shadow 属性允许你为几乎任何元素的框架投射下沉阴影。如果在元素上指定了 border-radius,阴影同样会拥有圆角。多个盒阴影的 z-ordering 与多个文本阴影相同(第一个指定的阴影在最上层)。

盒阴影生成器是一个交互式工具,可以让你生成 box-shadow

语法

css
/* Keyword values */
box-shadow: none;

/* A color and two length values */
/* <color> | <length> | <length> */
box-shadow: red 60px -16px;

/* Three length values and a color */
/* <length> | <length> | <length> | <color> */
box-shadow: 10px 5px 5px black;

/* Four length values and a color */
/* <length> | <length> | <length> | <length> | <color> */
box-shadow: 2px 2px 2px 1px rgb(0 0 0 / 20%);

/* inset, length values, and a color */
/* <inset> | <length> | <length> | <color> */
box-shadow: inset 5em 1em gold;

/* Any number of shadows, separated by commas */
box-shadow:
  3px 3px red inset,
  -1em 0 0.4em olive;

/* Global values */
box-shadow: inherit;
box-shadow: initial;
box-shadow: revert;
box-shadow: revert-layer;
box-shadow: unset;

使用以下方式指定单个盒阴影:

  • 两个、三个或四个 <length> 值。

    • 如果只给出两个值,它们将被解析为 <offset-x><offset-y>
    • 如果给出第三个值,它将被解析为 <blur-radius>(模糊半径)。
    • 如果给出第四个值,它将被解析为 <spread-radius>(扩散半径)。
  • 可选的 inset 关键字。

  • 可选的 <color> 值。

要指定多个阴影,请提供一个用逗号分隔的阴影列表。

<color> 可选

指定阴影的颜色。关于可用的关键字和记法,请参阅 <color>。如果未指定,则使用父元素中定义的 color 属性值。

<length>

指定阴影的偏移长度。此参数接受两个、三个或四个值。第三个和第四个值是可选的。它们的解析方式如下:

  • 如果指定了两个值,它们将被解析为 <offset-x>(水平偏移)和 <offset-y>(垂直偏移)。负的 <offset-x> 值会将阴影置于元素的左侧。负的 <offset-y> 值会将阴影置于元素的上方。
    如果未指定,缺失的长度值将使用 0。如果 <offset-x><offset-y> 都设为 0,阴影将位于元素的正后方(如果设置了 <blur-radius> 和/或 <spread-radius>,可能会产生模糊效果)。

  • 如果指定了三个值,第三个值将被解析为 <blur-radius>(模糊半径)。该值越大,模糊程度越大,阴影也因此变得更大更浅。不允许使用负值。如果未指定,它将被设为 0(意味着阴影的边缘将是锐利的)。规范没有包含关于如何计算模糊半径的确切算法,但它做了如下阐述:

    ……对于一条长而直的阴影边缘,这应该创建一个颜色过渡,其长度等于模糊距离,垂直于并以阴影边缘为中心,范围从阴影内部半径端点的完整阴影颜色到外部端点的完全透明。

  • 如果指定了四个值,第四个值将被解析为 <spread-radius>(扩散半径)。正值会使阴影扩展和变大,负值会使阴影收缩。如果未指定,它将被设为 0(即阴影将与元素大小相同)。

inset 可选

将阴影从外侧盒阴影更改为内侧盒阴影(就好像内容被压入盒子中一样)。内侧阴影绘制在盒子的边框内部(即使边框是透明的),并且它们出现在背景之上、内容之下。默认情况下,阴影表现为下沉阴影,给人一种盒子被抬高到其内容之上的感觉。这是在未指定 inset 时的默认行为。

插值

在为阴影添加动画时,例如当盒子上的多个阴影值在悬停时过渡到新值时,这些值会被插值。插值决定了属性在阴影过渡过程中的中间值,例如模糊半径、扩散半径和颜色。对于阴影列表中的每个阴影,颜色、x、y、模糊和扩散都会进行过渡;颜色作为 <color>,其他值作为 <length>

在两个逗号分隔的多重盒阴影列表之间进行插值时,阴影会按顺序配对,并在配对的阴影之间进行插值。如果阴影列表的长度不同,则较短的列表将在末尾填充阴影,这些阴影的颜色为 transparent,X、Y 和模糊值为 0inset 状态与较长的列表匹配。如果在任何一对阴影中,一个设置了 inset 而另一个没有,则整个阴影列表将无法插值;阴影将直接变为新值,而没有动画效果。

正式定义

初始值none
应用于所有元素。也适用于 ::first-letter
继承性
计算值任何长度都转换为绝对值;任何指定的颜色都计算为其实际值;否则按指定值。
动画类型一个阴影列表

正式语法

box-shadow = 
<spread-shadow>#

<spread-shadow> =
<'box-shadow-color'>? &&
[ <'box-shadow-offset'> [ <'box-shadow-blur'> <'box-shadow-spread'>? ]? ] &&
<'box-shadow-position'>?

<box-shadow-color> =
<color>#

<box-shadow-offset> =
[ none | <length>{2} ]#

<box-shadow-blur> =
<length [0,∞]>#

<box-shadow-spread> =
<length>#

<box-shadow-position> =
[ outset | inset ]#

示例

设置三个阴影

在此示例中,我们包含了三个阴影:一个内阴影、一个常规的下沉阴影,以及一个 tạo出边框效果的 2px 阴影(对于第三个阴影,我们本可以使用 outline)。

HTML

html
<blockquote>
  <q>
    You may shoot me with your words,<br />
    You may cut me with your eyes,<br />
    You may kill me with your hatefulness,<br />
    But still, like air, I'll rise.
  </q>
  <p>&mdash; Maya Angelou</p>
</blockquote>

CSS

css
blockquote {
  padding: 20px;
  box-shadow:
    inset 0 -3em 3em rgb(0 200 0 / 30%),
    0 0 0 2px white,
    0.3em 0.3em 1em rgb(200 0 0 / 60%);
}

结果

将偏移和模糊设置为零

x-offsety-offsetblur 都为零时,盒阴影将是一个四边大小相等的纯色轮廓。阴影从后向前绘制,因此第一个阴影位于后续阴影的上方。当 border-radius 设置为 0(默认值)时,阴影的角就是直角。如果我们设置了任何其他值的 border-radius,角将会是圆角的。

我们添加了一个与最宽的盒阴影大小相同的 margin,以确保阴影不会与相邻元素重叠或超出包含框的边界。盒阴影不影响盒模型的尺寸。

HTML

html
<div><p>Hello World</p></div>

CSS

css
p {
  box-shadow:
    0 0 0 2em #f4aab9,
    0 0 0 4em #66ccff;
  margin: 4em;
  padding: 1em;
}

结果

规范

规范
CSS Backgrounds and Borders Module Level 3
# box-shadow

浏览器兼容性

另见