【CSS進階】box-shadow 與 filter:drop-shadow 詳解及奇技淫巧

来源:http://www.cnblogs.com/coco1s/archive/2016/06/16/5592136.html
-Advertisement-
Play Games

box-shadow 在前端的 CSS 編寫工作想必十分常見。但是 box-shadow 除去它的常規用法,其實還存在許多不為人知的奇技淫巧。 喜歡 markdown 版本的可以戳這裡 。 box-shadow 常規用法 說到 box-shadow ,首先想到的必然是它能夠生成陰影,所以稱之為 sh ...


box-shadow 在前端的 CSS 編寫工作想必十分常見。但是 box-shadow 除去它的常規用法,其實還存在許多不為人知的奇技淫巧。

喜歡 markdown 版本的可以戳這裡

 

box-shadow 常規用法

說到 box-shadow ,首先想到的必然是它能夠生成陰影,所以稱之為 shaodow ,簡單看看它的語法:

基礎屬性語法

box-shadow 屬性向框添加一個或多個陰影。

box-shadow: h-shadow v-shadow blur spread color inset;

像這樣 box-shadow: 10px 10px 5px #888888; 除此之外,我們要知道,box-shadow 是分外 shadow 和內 shadow 的,內陰影即是在屬性上添加 inset 。

OK,本文已經假設你對 box-shadow 有了一定的瞭解,在此基礎上,我們再看看 box-shadow 有什麼其它妙用。

 

box-shadow 模擬多邊框

通常而言,我們會給許多元素添加邊框 border,但是當如果需要多重邊框,這個時候,由於 border 單重的限制,box-shadow 就可以閃亮登場了。我們可以輕鬆的使用外陰影或者內陰影來模擬邊框效果。

可以看到,由內至外,這裡利用 box-shadow ,設置了白色、黑色、灰色三層邊框及最外層帶模糊的陰影。

box-shadow 有一個參數是設置 blur 的,即是模糊的距離,在上面的例子中,即是第二重陰影 0 0 0 10px #333, 中的第三個 0 ,當 blur 的值為 0 ,那麼陰影本身是不會模糊的,那麼就很容易模擬出邊框的效果。

而且,元素可以設置多重陰影,並且它們存在層疊關係,離 box-shadow 最近設置的層疊優先順序最高,依次遞減,這個對照代碼很好理解。

當然,值得註意的是:

  • 陰影並不是邊框,它們並不占有實際的空間,也不能歸屬於 box-sizing 的範圍。不過,你可以通過使用內邊距或外邊距(取決於陰影是內部的還是外部的)占據額外的空間來模擬。

  • 上述示例模擬的邊框是位於元素外部的。它不能捕獲類似懸停和點擊的滑鼠事件。如果事件很重要,那麼可以通過添加 inset 關鍵字讓陰影出現在元素的內部。註意,你可能需要添加額外的內邊距來擴充空間。

 

box-shadow 模擬半透明遮罩層

很多時候,我們需要用到類似下圖這樣的遮罩層,通過半透明遮罩層把背景調暗,凸顯某些 UI 組件,提升用戶體驗。

常規的做法通常都會用到一個額外的元素,用作遮罩層,至少也是一個偽元素, before 或者 after

不考慮低版本的相容性的話,其實用 box-shadow 也可以模擬遮罩層這種效果。

這裡還有一個例子,hover 時利用配合 scale 放大元素, box-shadow 產生遮罩,聚焦用戶關註視野。

Demo–戳我看看

當然,值得註意的是:

  • 使用這種方法不可避免的需要考慮相容性,IE9+、Firefox 4、Chrome、Opera 以及 Safari 5.1.1 支持 box-shadow 屬性。

  • 由於每個人的瀏覽器視口大小不一致,為了所有情況下 box-shadow 生成的陰影都能覆蓋整個頁面,可能需要將陰影的尺寸 spread 設置的很大。

  • 如果你真的想嘗試這個方法,box-shadow 從性能角度而言屬於 耗性能樣式,不同樣式在消耗性能方面是不同的,box-shadow 從渲染角度來講十分耗性能,原因就是與其他樣式相比,它們的繪製代碼執行時間過長。雖然有 GPU 的 3D 加速,但是具體使用的時候還是值得斟酌考慮。不過你要知道,沒有不變的事情,在今天性能很差的樣式,可能明天就被優化,並且瀏覽器之間也存在差異。

下麵再講講多重 box-shadow 能幹啥:

 

多重 box-shadow 之簡單圖形

從本質上講,box-shadow 是將自身投影到另一個地方,在很多情況下,我們是可以利用 box-shadow 來複制自身的!

利用這個特性,我們可以用 box-shadow 製作一些簡單的圖形,在我的單標簽圖形 Demo 中,有這樣一個圖形:

其中的雲層,就是利用了 多重box-shaodw 在一個偽元素內生成的。下麵我利用不同的顏色,直觀的表達一下如何利用 box-shadow 繪製這個圖形:

當所有陰影的顏色都是同色的時候,就很自然變成了一朵雲朵:

當然,腦洞夠大的話,更複雜一點的也是可以的,來看看下麵這個圖形,也是由單個標簽完成:

其中比較困難的是其中環繞字母 e 的那個圓以及那個切入的不規則角,看看用陰影怎麼把它做出來,利用了兩重 box-shadow:

嗯,當然,你問我這些圖形有什麼用。我覺得實用性真的不強吧,我個人而言是興趣,從中獲取到了樂趣,同時也學到了很多東西,對屬性本身印象也更加深刻,遇到許多 CSS 方面的問題的時候,思路更加開闊。

更多有趣的圖形,可以 戳這裡 – Demo

 

多重 box-shadow 實現立體感

這種方法運用在 text-shadow 上同樣可以,可以實現文字的立體感。

運用多重 box-shadow ,不斷偏移 1px ,就可以產生十分立體的感覺。

運用在按鈕:

運用在文字:

 

多重 box-shadow 實現任意圖片轉換

嗯,講真~~ 我覺得這個是最有趣的。

多重 box-shadow 還能做什麼呢。由於 box-shadow 的多重性,也就是 無論多少重都可以,那麼理論上任意一張圖片,每一個像素點都可以由一重 1px*1px 的 box-shadow 來表示。

為了完成這個任務, canvas 剛好提供了一個方法 CanvasRenderingContext2D.getImageData 可以獲取到圖片每一個像素點的 rgba 值,那麼圖片轉為一個完全由 box-shadow 表示的圖片是完全可行的。

為此,我倒騰了許久,寫了這麼一個小插件,可以將任意圖片轉化為由 box-shadow 表示的單個 div 標簽。

Demo–戳我體驗一下

如果上面的幾點還有用武之地,那麼這個功能我覺得除了看似厲害之外真的是毫無實用之處,上面也說了,box-shadow 是比較耗性能的,因為即便是一個 100px*100px 的圖形,轉化之後都有 10000 重陰影,無論是對性能還是可讀性而言,都是毀滅性的,但是講真,還是挺有趣的。

box-shadow 就先說這些吧,box-shadow 肯定還要其它的一些妙用,細心之人可以繼續挖掘之。

 

filter:drop-shadow

其實說到 box-shadow,就不得不提到另一個和它極為相似的 CSS3 新屬性 filter:drop-shadow,filter 即是 CSS 濾鏡,可以在元素呈現之前,為元素的渲染提供一些效果,如模糊、顏色轉移之類的。濾鏡常用於調整圖像、背景、邊框的渲染。

當然這裡我們只說 filter:drop-shadow。

filter:drop-shadow 也很好玩,本想繼續長篇大論討論下去,無奈發現 張鑫旭大神兩篇文章已經把我想說的都囊括了,前人栽樹,後人乘涼,我也就不再獻醜了。

兩篇非常值得一讀的文章:

另外 《CSS SECRET》(CSS揭秘)這本大作也對 filter:drop-shadow 有詳細的描述,可以去看看。

 

希望這篇文章對大家有所幫助,尤其是在對問題解決的思維層面上。

到此本文結束,如果還有什麼疑問或者建議,可以多多交流,寫文章不容易,覺得不錯的希望大家點個推薦。

原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我想學ruby以後開髮網站,但ruby是高級語言,隱藏了許多底層的東西,因此先熟悉c語言 首先c程式的文件名是以.c結尾的 c程式的格式: 第一行#include<stdio.h> #是一個預處理標準,用來對文本進行預處理操作,表示該行代碼要最先進行處理,在編譯代碼之前運行 include是一個指令 ...
  • 以下內容轉自博客:http://blog.chinaunix.net/uid-22670933-id-1771613.html。 一、字元編碼是怎麼回事 0. 概念 位元組是電腦的最基本存儲單位,一個位元組包括8個位. 字元是一種文字的基本單位,比如'A' 是一個字元,'漢' 也是一個字元. 1. 計 ...
  • zookeeper 單機安裝配置 1、安裝前準備 linux系統(此文環境為Centos6.5) Zookeeper安裝包,官網https://zookeeper.apache.org/,演示版本zookeeper-3.4.7.tar.gz linux系統(此文環境為Centos6.5) Zooke ...
  • 問題1:Could not calculate build plan: Plugin org.apache... 不能成功創建maven項目 解決方法1: 問題2: 轉Maven project是生成的pom.xml文件錯誤——Unknown packaging:apk以及Failed to col ...
  • Cycle.js 是一個極簡的JavaScript框架(核心部分加上註釋125行),提供了一種函數式,響應式的人機交互介面。在這個交互模型中,人機之間的信息流互為輸出輸出,構成一個迴圈,也即 Cycle這一命名所指,框架的Logo更是以莫比烏斯環貼切的描述了這個迴圈。 ...
  • clientWidth:元素可見區域的寬度 clientWidth=padding+width-滾動條 scrollWidth:元素實際內容的寬度 scrollWidth=padding+width(元素實際的內容) offsetWidth:元素可見區域的高度+邊框 offsetWidth=bord ...
  • 概述 在之前的文章中,我們藉助構造函數實現了“類”,然後結合原型對象實現了“繼承”,並瞭解了JavaScript中原型鏈的概念。 理解這些內容,有助於我們更深入地進行JavaScript面向對象編程。 由於JavaScript是一門基於對象和原型的弱語言,靈活度非常高,這使得JavaScript有各... ...
  • 本系列Jquery所用測試Demo版本是《uncompressed,development jQuery 1.11.3》 最新的jquery包可以從官網下載請參照http://jquery.com/ Jquery在官網上的版本分為兩種: Uncompressed 非壓縮版本 一般用於調試、開發。 C ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...