box-shadow和drop-shadow實現(xiàn)不規(guī)則投影實例代碼
當我們想給一個矩形或其他能用 border-radius 生成的形狀(在“自適應的橢圓”一節(jié)中可以看到一些示例)加投影時,box-shadow 的表現(xiàn)都堪稱完美。但是,當元素添加了一些偽元素或半透明的裝飾之后,它就有些力不從心了,因為 border-radius 會無恥地忽視透明部分。這類情況包括:
- 半透明圖像、背景圖像、或者 border-image(比如老式的金質像框);
- 元素設置了點狀、虛線或半透明的邊框,但沒有背景(或者當background-clip 不是 border-box 時);
- 對話氣泡,它的小尾巴通常是用偽元素生成的;
如果我們打算對這類元素直接應用 box-shadow,那只能得到不完全投影的結果。難道我們只能完全放棄投影效果嗎?有沒有辦法可以解決這個難題?

濾鏡效果規(guī)范(http://w3.org/TR/filter-effects)為這個問題提供了一個解決方案。它引入了一個叫作 filter 的新屬性,這個屬性也是從 SVG 那里借鑒過來的。盡管 CSS 濾鏡基本上就是 SVG 濾鏡,但我們并不需要掌握任何SVG 知識。相反,只需要一些函數(shù)就可以很方便地指定濾鏡效果了,比如blur()、grayscale() 以及我們需要的 drop-shadow() !如果你喜歡,甚至可以把多個濾鏡串連起來,只要用空格把它們分隔開就可以了,比如:
filter: blur() grayscale() drop-shadow();
drop-shadow() 濾鏡可接受的參數(shù)基本上跟 box-shadow 屬性是一樣的,但不包括擴張半徑,不包括 inset 關鍵字,也不支持逗號分割的多層投影語法。舉個例子,上面的投影:
box-shadow: 2px 2px 10px rgba(0,0,0,.5);
可以這樣來寫:
filter: drop-shadow(2px 2px 10px rgba(0,0,0,.5));

CSS 濾鏡最大的好處在于,它們可以平穩(wěn)退化:當瀏覽器不支持時,不會出現(xiàn)問題,只不過沒有任何效果而已。如果你確實需要這個效果在盡可能多的瀏覽器中顯示出來,可以同時附上一個 SVG 濾鏡,這樣可以得到稍微好一些的瀏覽器支持度。你可以在濾鏡效果規(guī)范(http://www.w3.org/TR/filter-effects/)中為每個濾鏡函數(shù)找到對應的 SVG 濾鏡版本。你可以把 SVG濾鏡和簡化的 CSS 濾鏡放在一起使用,讓層疊機制來決定哪一行最終生效:
filter: url(drop-shadow.svg#drop-shadow); filter: drop-shadow(2px 2px 10px rgba(0,0,0,.5));
不幸的是,如果 SVG 濾鏡是存放在一個獨立文件里的,那它就無法像一個簡潔易用的函數(shù)那樣在 CSS 代碼中進行隨意配置;如果它是內(nèi)聯(lián)的,則又會攪亂你的代碼。參數(shù)需要寫死在文件內(nèi)部,因此每當我們新加一種哪怕是大同小異的投影效果時,都需要多準備一個文件,這顯然是難以接受的。當然,我們還可以使用 data URI(它也會省掉額外的 HTTP 請求),但這個方法仍然會帶來文件體積的增長。總的來說,這個方法只是一種回退方案,因此只要我們把SVG 濾鏡控制在一定數(shù)量以內(nèi),哪怕它們的效果大同小異,也是說得過去的。
另外一件需要牢記的事情就是,任何非透明的部分都會被一視同仁地打上投影,包括文本(如果背景是透明的),正如我們剛剛看到的那樣。你可能會想,是不是可以通過 text-shadow: none; 來取消掉文本上的投影呢?其實 text-shadow 跟它是完全不相干的兩碼事,因此這樣做并不能取消文本上的 drop-shadow() 效果。此外,如果你已經(jīng)用 textshadow在文本上加了投影效果,文本投影還會被 drop-shadow() 濾鏡再加上投影,這本質上是給投影打了投影!看看下面這段示例代碼(請原諒它慘不忍睹的效果,這樣只是為了凸顯這個怪異的問題):
color: deeppink; border: 2px solid; text-shadow: .1em .2em yellow; filter: drop-shadow(.05em .05em .1em gray);
你可以看到它的渲染效果,圖中的文字被同時打上了 textshadow和 drop-shadow()。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章

CSS3打造的現(xiàn)代交互式登錄界面詳細實現(xiàn)過程
本文介紹CSS3和jQuery在登錄界面設計中的應用,涵蓋動畫、選擇器、自定義字體及盒模型技術,提升界面美觀與交互性,同時優(yōu)化性能和可訪問性,感興趣的朋友跟隨小編一起看看吧2025-06-20CSS普通流、浮動與定位網(wǎng)頁布局三大機制及最佳實踐
本文給大家講解CSS 的三種核心布局機制——普通流(Normal Flow)、浮動(Float)和定位(Positioning)對于創(chuàng)建靈活、響應式的網(wǎng)頁至關重要,本文將深入探討這三種機制的工作原2025-06-19
css實現(xiàn)角標效果并帶有文章或圖標效果(完整代碼)
文章介紹如何用CSS實現(xiàn)角標效果,通過.active類結合::after和::before偽元素,利用定位、邊框和旋轉創(chuàng)建紅色邊框與白色三角形的提示標志,適用于按鈕或卡片元素的視覺增強設計2025-06-19CSS Anchor Positioning重新定義錨點定位的時代來臨(最新推薦)
CSS Anchor Positioning是一項仍在草案中的新特性,由 Chrome 125 開始提供原生支持需啟用實驗 flag,它允許你在 CSS 中通過錨點(anchor)來相對于任意 DOM 元素定位,本文2025-06-17CSS中的Static、Relative、Absolute、Fixed、Sticky的應用與詳細對比
CSS 中的 position 屬性用于控制元素的定位方式,不同的定位方式會影響元素在頁面中的布局和層疊關系,以下是 static、relative、absolute、fixed、sticky 的詳細對比和應用2025-06-17CSS place-items: center解析與用法詳解
place-items: center; 是一個強大的 CSS 簡寫屬性,用于同時控制 網(wǎng)格(Grid) 和 彈性盒(Flexbox) 布局中的對齊方式,本文給大家介紹CSS place-items: center; 詳解與用法2025-06-17
在日常開發(fā)中,我們經(jīng)常需要讓某個元素占據(jù)容器的剩余空間,本文將介紹5種不同的方法來實現(xiàn)這個需求,并分析各種方法的優(yōu)缺點,感興趣的朋友一起看看吧2025-06-17CSS中前端單位 px、vw、vh 等的區(qū)別與使用建議
CSS單位區(qū)別與使用場景總結:px絕對、vw/vh響應式,%繼承父尺寸,em/rem文字縮放,vmin/vmax適應寬高變化,固定布局用px或%,響應式布局用vw/vh/rem,文字用em或rem,本文給大家2025-06-16- 這篇文章主要介紹了CSS 樣式表的四種應用方式及css注釋的應用小結,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2025-05-21
- 在CSS布局中,padding屬性是控制元素內(nèi)容與其邊框之間距離的關鍵工具,本文介紹CSS基礎中padding,通過本文的介紹,我們深入了解了padding的基本概念、簡寫方法以及它對元2025-05-16




