紀錄工作經驗、相關知識,解決技術相關問題。

CSS, HTML

CSS drop-shadow 與 box-shadow 差別:去背透明圖片(PNG / SVG)陰影語法

CSS drop-shadow 與 box-shadow 差別:去背透明圖片(PNG / SVG)陰影語法 特色圖片

在前端網頁切版中,當我們想替一張已經去背的透明 PNG 圖片、不規則形狀的 Logo 或 SVG 圖示加上立體陰影時,若習慣性地寫下 box-shadow,會發現圖片外圍竟然長出一個難看的矩形方框陰影,完全無視透明背景!

要讓陰影完美貼合去背圖片的不規則輪廓,必須改用 CSS 濾鏡中的 filter: drop-shadow()。本文直接透過視覺圖解比較 drop-shadow 與 box-shadow 的核心差別,並整理實用的切版場景範例。

快速複製與章節跳轉:


1. filter: drop-shadow() 標準語法與視覺對比

drop-shadow() 是隸屬於 filter 屬性底下的濾鏡函式,專門用來讀取元素內容的 Alpha 透明通道,只針對「非透明像素的真實邊緣」投射陰影:

/* 錯誤做法:對去背 PNG/SVG 使用 box-shadow,外圍會出現矩形方框 */
.transparent-logo-wrong {
  box-shadow: 8px 10px 16px rgba(0, 0, 0, 0.45);
}

/* 建議做法:使用 filter: drop-shadow(水平位移 垂直位移 模糊程度 陰影顏色) */
/* 第 3 個長度是高斯模糊的標準差(standard deviation),數值越大陰影越大越模糊 */
.transparent-logo-correct {
  filter: drop-shadow(8px 10px 10px rgba(0, 0, 0, 0.48));
}

去背透明圖示陰影效果對照圖(box-shadow vs drop-shadow)

去背透明圖片套用 CSS box-shadow 與 filter drop-shadow 效果差異對照圖

圖:左側對透明背景圖示使用 box-shadow 會在四周產生矩形方框;右側使用 filter: drop-shadow() 則能穿透透明格線,完美貼合星形輪廓。


2. filter: drop-shadow() 與 box-shadow 差異比較表

雖然兩者的參數看起來幾乎一樣,但它們支援的參數數量與底層渲染機制有以下 4 個關鍵差異:

比較項目box-shadow(盒模型陰影)filter: drop-shadow()(濾鏡輪廓陰影)
陰影偵測範圍永遠針對元素的矩形外框(Box Model)投射陰影穿透透明區域,針對非透明像素的真實形狀輪廓投射陰影
參數格式支援 5 個參數:X位移 Y位移 模糊 擴散半徑(spread) 顏色僅支援 4 個參數:X位移 Y位移 模糊 顏色(不支援第 4 個數值 spread 擴散半徑,若誤填 4 個數字會直接失效!)
內陰影(inset)支援 box-shadow: inset ... 製作凹陷內陰影不支援 inset 內陰影
多重陰影疊加方式用逗號分隔:box-shadow: 0 2px 4px #000, 0 8px 16px #000;用空白串接多個函式:filter: drop-shadow(...) drop-shadow(...);

踩坑注意:許多工程師把 box-shadow: 0px 4px 10px 2px rgba(0,0,0,0.3); 直接複製貼進 drop-shadow(0px 4px 10px 2px rgba(0,0,0,0.3)),結果發現陰影完全消失!原因是 drop-shadow 不接受第 4 個 2px(擴散半徑 spread-radius)參數,移除第 4 個長度數值即可正常顯示。


3. 實務場景:氣泡對話框(含三角形尖角)連貫陰影

在切版 Tooltip 提示框或聊天的「氣泡對話框」時,我們常會在矩形 div 上搭配 ::after 偽元素畫出一個小三角形尖角(關於偽元素用法,可參考 CSS ::before 與 ::after 偽元素用法:content 屬性、圖片大小與無效原因)。

這時如果對父容器使用 box-shadow,陰影只會出現在矩形方框上,底下的三角形尖角完全沒有陰影,看起來像直接貼在矩形陰影上;但只要改用 filter: drop-shadow(),瀏覽器就會把「矩形主體 + 偽元素三角形」視為同一個不透明輪廓,繪製出完美連貫的整體陰影!

.speech-bubble {
  position: relative;
  background: #ffffff;
  padding: 18px 22px;
  border-radius: 12px;
  /* 關鍵:使用 drop-shadow 讓主框與 ::after 三角形尖角共用連貫陰影 */
  filter: drop-shadow(8px 12px 6px rgba(15, 23, 42, 0.45));
}

.speech-bubble::after {
  content: "";
  position: absolute;
  bottom: -16px;
  left: 55px;
  border-width: 16px 16px 0;
  border-style: solid;
  border-color: #ffffff transparent transparent;
}

氣泡對話框與三角形尖角陰影效果對照圖

氣泡對話框三角形尖角套用 box-shadow 與 filter drop-shadow 陰影效果對照圖

圖:左側 box-shadow 的陰影只畫在矩形主框,不包含 ::after 三角形尖角;右側 filter: drop-shadow() 將主框與尖角視為一體投射連貫陰影。


參考資料與延伸閱讀

發佈留言