當 Icon 遇上陰影:從 box-shadow 到 drop-shadow 的意外發現

2025 年 04 月 11 日

探討在 Ant Design Blazor 中為 Icon 元件添加符合形狀的陰影效果。從嘗試 box-shadow 產生方形陰影的挫折,到發現 filter: drop-shadow() 這個完美解決方案的過程。文章詳細比較兩種陰影技術的差異,並提供實用的程式碼範例,為不規則形狀元素添加自然陰影效果。

Web Develop

起因:一個看似簡單的需求

最近在使用 Ant Design Blazor 的過程中,遇到了一個有趣的問題。一位用戶詢問我是否可以為 Icon 元件加上陰影效果,讓圖示更加立體、更容易被注意到。當時我想:「這不是很簡單嗎?加個 box-shadow 就搞定了吧!」

結果事情並不如我想像的那麼順利。

第一次嘗試:box-shadow 的尷尬

信心滿滿地,我為 Icon 元件加上了 box-shadow 屬性:

.ant-icon {
    box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.3);
}

結果一看,我差點噴出咖啡 — 陰影是一個完美的方形,而不是跟隨 Icon 的形狀!這看起來非常怪異,就像是有人在 Icon 後面放了一個黑色的小方塊。

「這不對啊,」我心想,「陰影應該要跟隨 Icon 的形狀才對。」

第二次嘗試:border 的失敗

既然 box-shadow 不行,那麼 border 呢?我試著用 border 來模擬陰影效果:

.ant-icon {
    border: 1px solid rgba(0, 0, 0, 0.3);
}

結果還是不理想,border 只是在 Icon 的方形邊界上加了一個框,完全無法達到陰影的效果[^7]。

絕處逢生:意外發現 drop-shadow

就在我快要放棄,打算告訴用戶「抱歉,這可能無法實現」的時候,我決定再 Google 一下。這一查不得了,我發現了 CSS 中的 filter: drop-shadow() 屬性!

.ant-icon {
    filter: drop-shadow(2px 2px 3px rgba(0, 0, 0, 0.3));
}

當我將這段程式碼應用到 Icon 上時,奇蹟發生了!陰影完美地跟隨了 Icon 的形狀,就像是在 Photoshop 中添加的陰影效果一樣。

box-shadow 與 drop-shadow 的差異

這次的經歷讓我對 CSS 中的陰影有了更深入的了解。原來 box-shadow 和 drop-shadow 有著本質的區別:

  1. box-shadow:應用於元素的整個盒模型,包括 padding 和 border。陰影遵循元素的矩形形狀,不管內容實際形狀如何。
  2. drop-shadow:專為圖像、SVG 和其他非矩形形狀設計。它能夠跟隨內容的輪廓,使其成為非方形視覺元素的理想選擇。

實際應用場景

了解了這兩種陰影的差異後,我發現它們各自有適合的應用場景:

  • box-shadow:適用於按鈕、卡片、容器等矩形元素。
  • drop-shadow:適用於 Icon、SVG、PNG 等具有透明背景或不規則形狀的元素。

drop-shadow 的實際語法

為了讓大家更好地理解如何使用 drop-shadow,這裡分享一下它的基本語法:

filter: drop-shadow(offset-x offset-y blur-radius color);

例如:

.icon {
    filter: drop-shadow(4px 4px 8px rgba(0, 0, 0, 0.3));
}

這會在 Icon 的右下方添加一個模糊半徑為 8px、顏色為 30% 透明度黑色的陰影。

結論:意外的收穫

這次的經歷讓我意識到,即使是看似簡單的需求,也可能隱藏著學習新知識的機會。從一開始的困惑到最後找到解決方案,這個過程不僅解決了用戶的問題,也讓我學到了 CSS 中一個非常實用的技巧。

有時候,當我們面臨挑戰時,多堅持一下、多搜索一下,可能就會發現意想不到的解決方案。正如這次的 drop-shadow,它不僅解決了我的問題,還為我的 CSS 工具箱增添了一個強大的工具。

下次當你需要為不規則形狀的元素添加陰影時,記得試試 drop-shadow 吧!它可能會給你帶來驚喜。

對了,如果你正在使用 Ant Design 的 Icon 元件,不妨試試這個技巧,讓你的圖示更加生動立體!