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

瀏覽器相容性

另見