搜尋

容器陰影 box-shadow

CSS 有三種設定陰影的方法,一種是使用影像濾鏡函式,一種是文字陰影,而這篇教學會介紹最基本的「容器陰影 box-shadow」,簡單又快速的替元素加上陰影,甚至做出多重陰影的效果。

快速導覽:

CSS 教學 - 容器陰影 box-shadow

使用 box-shadow

box-shadow 可以設定元素的「容器陰影」,沒有繼承特性,box-shadow 的屬性值為多種屬性值的組合,各個屬性值之間使用空白分隔,下方列出支援的屬性值:

屬性值 預設值 說明
inset - 關鍵字屬性值,出現該屬性值後,陰影變成內陰影。
offset-x 必填數值 第一個數值為陰影的 x 位移 ( 使用 px ),正往左,負往右。
offset-y 必填數值 第二個數值為陰影的 y 位移 ( 使用 px ),正往下,負往上。
blur-radius 0 第三個數值為陰影的模糊半徑 ( 使用 px ),最小為 0,數值越大越模糊。
spread-radius 0 第四個數值為陰影的縮放半徑 ( 使用 px ),正變大,負變小。
color 元素文字顏色 陰影顏色,支援 CSS 所有色彩單位寫法。

下方列出一些符合規範寫法的 box-shadow 範例:

線上展示:https://codepen.io/oxxo/pen/KKjMoPw

<!-- HTML 程式碼 -->
<div class="a">box-shadow: 10px 10px;</div>
<div class="b">box-shadow: 10px 10px 10px;</div>
<div class="c">box-shadow:  10px 10px -6px;</div>
<div class="d">box-shadow: 10px 10px 10px -6px;</div>
<div class="e">box-shadow: 10px 10px 10px -6px red;</div>
<div class="f">box-shadow: 10px 10px 10px 5px #0005;</div>
<div class="g">box-shadow: inset 10px 10px 5px #0005;</div>

<!-- CSS 程式碼 -->
<style>
  div {
    width: 300px;
    height: 30px;
    border: 1px solid #000;
    margin: 20px;
    padding: 5px;
    font-size:14px;
  }
  .a {box-shadow: 10px 10px;}           /* 沒有模糊的黑色陰影 */
  .b {box-shadow: 10px 10px 10px;}      /* 模糊的黑色陰影 */
  .c {box-shadow: 10px 10px 10px -6px;} /* 模糊的縮小黑色陰影 */
  .d {
    color: red;
    box-shadow: 10px 10px 10px -6px;    /* 使用元素文字顏色的模糊又縮小的紅色陰影 */
  }
  .e {box-shadow: 10px 10px 10px -6px red;}    /* 模糊的縮小紅色陰影 */
  .f {box-shadow: 10px 10px 10px 5px #0005;}   /* 模糊的放大黑色半透明陰影 */
  .g {box-shadow: inset 10px 10px 5px #0005;}  /* 模糊的黑色半透明內陰影 */
</style>

CSS 教學 - 容器陰影 box-shadow - 使用 box-shadow

box-shadow 的顯示行為

因為 box-shadow 是「容器」外部的陰影,所以有下列的顯示行為:

  • 陰影位於容器 border 外緣。
  • 陰影只會呈現「矩形、圓角矩形」的形狀。
  • 元素內容區域裡不會顯示陰影 ( 就算元素設定為透明背景或沒有背景圖 )。
  • 陰影不會影響 paddingmarginborder 等容器邊界範圍。
  • 陰影的圖層和元素相同,在上層的元素陰影會覆蓋下層元素。

下方列出使用三個 div 作為範例,表現圓角陰影、透明背景元素的陰影以及陰影圖層的關係:

線上展示:https://codepen.io/oxxo/pen/zYVBWOZ

<!-- HTML 程式碼 -->
<div class="a">背景透明,元素裡沒有陰影,<br/>圓角陰影</div>
<div class="b">不會被前面元素的陰影覆蓋,<br/>但會被後面元素的陰影覆蓋</div>
<div class="c">元素位於最上層,陰影也就在最上層</div>


<!-- CSS 程式碼 -->
<style>
  main {
    background: orange;
    padding: 20px;
  }
  div {
    width: 200px;
    height: 50px;
    border: 1px solid #000;
    margin: 10px;
    padding: 5px;
    font-size:13px;
    box-shadow: 20px 20px 5px #000a;
    background: #fff;
  }
  .a {
    background: none;     /* 設定元素沒有背景,可以看到下方是 main 的背景色而沒有陰影 */
    border-radius: 20px;  /* 陰影變成圓角 */
  }
  .b {border-radius: 50px;}  /* 陰影變成圓角 */
  .c {box-shadow: 50px -20px 10px #f00a;}  /* 讓陰影往上移動,遮住上面的元素 */
</style>

CSS 教學 - 容器陰影 box-shadow - box-shadow 的顯示行為

多重陰影

box-shadow 可以使用「逗號 ,」分隔不同的陰影,創造出陰影「疊加」的「多重陰影」的效果,越左側的陰影所在圖層越高,會遮蔽右邊的陰影,使用時需要注意,只要某一項陰影格式寫錯,就會發生樣式錯誤而無法顯示陰影。

下方的範例實作多重陰影的效果。

線上展示:https://codepen.io/oxxo/pen/VwJjXZx

<!-- HTML 程式碼 -->
<div class="a">Apple</div>
<div class="b">Banana</div>
<div class="c">OXXO</div>

<!-- CSS 程式碼 -->
<style>
  div {
    width: 200px;
    height: 50px;
    border: 1px solid #000;
    margin: 30px;
    padding: 5px;
    text-align: center;
  }
  .a {
    box-shadow:
      2px 2px red,
      4px 4px orange,
      6px 6px yellow,
      8px 8px green,
      10px 10px blue,
      12px 12px purple;
  }
  .b {
    box-shadow:
      2px 2px 2px red,
      4px 4px 4px orange,
      6px 6px 6px yellow,
      8px 8px 8px  green,
      10px 10px 10px blue,
      12px 12px 12px purple;
  }
  .c {
    box-shadow:
      0 5px 0 -2px #555,
      0 10px 0 -4px #555,
      0 15px 0 -6px  #444,
      0 20px 0 -8px #333,
      0 25px 0 -10px #222,
      0 30px 0 -12px #222,
      0 35px 0 -14px #222,
      0 40px 0 -16px #111,
      0 45px 0 -18px #111,
      0 50px 0 -20px #111,
      0 55px 20px -15px #000b;
  }
</style>

CSS 教學 - 容器陰影 box-shadow - box-shadow 多重陰影

不可置換行內容器的陰影

雖然不可置換行內容器無法調整寬高 ( 文字樣式的顯示類型大多都是 inline ),但卻可以透過 paddingborder 增加元素容器的範圍,又因為陰影是從 border 外緣開始擴展,如果有設定不可置換行內容器的 paddingborder,就會發生陰影覆蓋到其他內容,或元素內容換行後陰影斷開等奇妙效果

不可置換行內容器表示不會透過 src 等屬性改變元素內容。

下方的範例設定了 strong 和 em 這兩個行內容器元素的 padding 數值,最後就會呈現奇妙的陰影效果。

線上展示:https://codepen.io/oxxo/pen/wvLWmwb

<!-- HTML 程式碼 -->
<div>
  <span><strong>STEAM 教育學習網</strong>透過免費且高品質的<em>教學與範例</em>讓所有人都能輕鬆跨入 STEAM 的學習領域。</span>
</div>

<!-- CSS 程式碼 -->
<style>
  div {
    width: 200px;
    height: 50px;
    border: 1px solid #000;
    margin: 50px;
    padding: 5px;
  }
  strong {
    padding: 30px 10px;
    box-shadow: 2px 2px 5px 5px red;
  }
  em {
    padding: 30px 10px;
    box-shadow: 2px 2px 5px 5px blue;
  }
</style>

CSS 教學 - 容器陰影 box-shadow - 不可置換行內容器的陰影

可置換行內容器的陰影

網頁中的圖片元素 img 或 svg 都屬於「可置換」行內容器 ( 顯示類型大多都是 inline-block ),這些元素都是矩形的容器,套用陰影後的效果大致上和其他元素套用陰影的效果相同,但內陰影會被圖片本身遮住需要注意透明背景的圖片,套用陰影後仍然會使用「矩形」方式呈現陰影,如果要完美呈現陰影,可以參考「drop-shadow()」。

下方的範例會替圖片加入陰影,可以觀察透明背景圖片使用陰影和內陰影產生的有趣效果。

線上展示:https://codepen.io/oxxo/pen/MWMeVWy

<!-- HTML 程式碼 -->
<img src="https://steam.oxxostudio.tw/download/css/function-filter-demo.png">
<img src="https://steam.oxxostudio.tw/image/index-css.jpg">
<img class="a" src="https://steam.oxxostudio.tw/download/css/function-filter-demo.png">


<!-- CSS 程式碼 -->
<style>
  body {
    background: yellow;
  }
  img {
    margin: 10px;
    width: 200px;
    box-shadow: 5px 5px 10px;
  }
  .a {
    box-shadow: inset 5px 5px 40px 10px;
  }
</style>

CSS 教學 - 容器陰影 box-shadow - 可置換行內容器的陰影

將陰影當作邊框使用

在網頁排版時,因為「邊框寬度」會影響容器範圍,進而造成排版的連鎖反應 ( 一個推擠一個 ),如果要避開邊框寬度的影響,也能使用「不具有模糊的陰影」,就能讓陰影偽裝成邊框,這種做法甚至可以使用多重陰影的效果,做出混合多種顏色的邊框。

下方範例會使用陰影代替邊框,做出三種不同的「偽」邊框。

線上展示:https://codepen.io/oxxo/pen/eYwzMmd

<!-- HTML 程式碼 -->
<div class="a">Apple</div>
<div class="b">Banana</div>
<div class="c">OXXO</div>

<!-- CSS 程式碼 -->
<style>
  div {
    width: 100px;
    height: 50px;
    padding: 5px;
    margin: 30px;
  }
  .a {box-shadow: 0 0 0 2px;}
  .b {box-shadow: 0 0 0 8px pink;}
  .c {
    box-shadow: 
      0 0 0 2px red,
      0 0 0 4px orange,
      0 0 0 6px yellow,
      0 0 0 8px green,
      0 0 0 10px blue,
      0 0 0 12px purple;
  }
</style>

CSS 教學 - 容器陰影 box-shadow - 將陰影當作邊框使用

下方範例中的第一組選單使用邊框 ( 黃色背景 ) ,可以發現滑鼠移動上去時,會產生不順暢的推擠現象,而第二組選單使用陰影代替邊框 ( 橘色背景 ),就不會有這種狀況。

線上展示:https://codepen.io/oxxo/pen/YzoWaPv

<!-- HTML 程式碼 -->
<div class="a">
  <a href="">apple</a>
  <a href="">banana</a>
  <a href="">oxxo</a>  
</div>
<div class="b">
  <a href="">apple</a>
  <a href="">banana</a>
  <a href="">oxxo</a>  
</div>

<!-- CSS 程式碼 -->
<style>
  div {
    margin: 30px;
  }
  .a a {
    background: yellow;
    padding: 10px;
    border: 1px solid #000;
    transition: .3s;
  }
  .a a:hover {
    border: 5px solid #000;
  }
  .b a {
    background: orange;
    padding: 10px;
    box-shadow: 0 0 0 1px #000;
    transition: .3s;
  }
  .b a:hover {
    box-shadow: 0 0 0 5px #000;
  }
</style>

CSS 教學 - 容器陰影 box-shadow - 避開邊框寬度的影響排版

小結

使用 box-shadow 可以很快速的替元素添加陰影效果,是許多網站常用的樣式屬性,不論是滑鼠懸停或凸顯特殊元素,都常常會看見 box-shadow 的身影。

意見回饋

如果有任何建議或問題,可傳送「意見表單」給我,謝謝~

CSS 教學

基本介紹

認識 CSS 開始使用 CSS CSS 語法規則 CSS 命名原則

CSS 選擇器

認識 CSS 選擇器 優先順序 ( 權重 ) 樣式繼承與聯集 元素選擇器 ID 和 Class 選擇器 屬性選擇器 文件結構選擇器 虛擬類別選擇器 ( 結構 ) 虛擬類別選擇器 ( 類型 ) 虛擬類別選擇器 ( 輸入 ) 虛擬類別選擇器 ( 行為 ) 虛擬類別選擇器 ( 超連結 ) 虛擬類別選擇器 ( 邏輯 ) 虛擬類別選擇器 ( 其他 ) 虛擬元素選擇器 群組與組合選擇器

數值與單位

關鍵字與文字數值 長度與角度單位 顏色單位 位置名稱與時間單位

變數與內容函式

變數 數學計算 文字與清單計數 生成內容與引號

顏色與濾鏡

色彩模型 漸層色 影像濾鏡

文字樣式

使用通用字型 使用外部字型 @font-face 定義字型 文字尺寸 常用文字樣式 文字換行 文字空白與 Tab 大小 文字行高與縮排 文字水平與垂直對齊 文字書寫方向 特殊文字樣式

元素容器

容器顯示類型 ( display ) 元素 display 對照表 盒子模型 ( Box Model ) 寬度與高度 內邊距 ( padding ) 外邊界 ( margin ) 邊框 ( border ) 邊框圓角 影像邊框 輪廓 ( outline ) 可見性與透明度 內容溢出與裁切

背景與陰影

背景顏色 背景圖 ( 定位、尺寸 ) 背景圖 ( 固定、重複 ) 背景圖 ( 多重背景、混合 ) 背景縮寫 ( background ) 容器陰影 ( box-shadow )

清單與表格

清單樣式 清單計數器 定義計數規則 表格基本樣式 表格邊框樣式 表格內容寬度與對齊

基本排版與定位

元素排版方式 浮動 ( float ) 浮動形狀 定位 ( position )

Flexbox 彈性排版

Flexbox 彈性盒子 Flexbox 對齊方式 Flexbox 彈性伸縮

Grid 網格排版

Grid 網格容器與格線 Grid 網格空間與命名 Grid 網格流向與間距 Grid 排列網格項目 Grid 項目對齊與順序

轉場與動畫

轉場 ( transition ) 轉場觸發事件 動畫 ( animation ) 動畫觸發事件 多重動畫的權重與順序

變形、裁切與遮罩

裁切路徑 ( clip-path ) 影像遮罩 ( mask )