記錄--CSS 如何實現羽化效果?

来源:https://www.cnblogs.com/smileZAZ/archive/2023/04/01/17278867.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 最近碰到這樣一個問題,在一張封面上直接顯示書名,可能會存在書名看不太清楚的情況(容易受到背景干擾),如下 為瞭解決這個問題,設計師提了一個“究極”方案,將書名背後的圖片模糊一下,這個在 CSS 中很好實現,僅需backdrop-filte ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

最近碰到這樣一個問題,在一張封面上直接顯示書名,可能會存在書名看不太清楚的情況(容易受到背景干擾),如下

為瞭解決這個問題,設計師提了一個“究極”方案,將書名背後的圖片模糊一下,這個在 CSS 中很好實現,僅需backdrop-filter即可

.name{
  backdrop-filter: blur(10px);
}

當然,現在模糊是模糊了,但是邊緣過於“斷層”,導致書名和封面有些“格格不入”,效果如下

如果能夠將邊緣羽化一下,虛化邊緣效果,就可以很好地將書名融入到背景當中

羽化是photoshop術語,羽化原理是令選區內外銜接部分虛化,起到漸變的作用從而達到自然銜接的效果,是ps及其其它版本中的處理圖片的重要工具

這是設計最終羽化後的效果,既能保證文字清晰可見,又能避免太過突兀,如下

設計師實現這個很簡單,用橡皮擦擦一下就可以了,那麼 CSS 呢?下麵來探討一下 CSS 如何實現羽化的效果。

一、羽化的原理

羽化其實就是將邊緣變得模糊,在 CSS 中其實就是創建一個邊緣模糊的遮罩(mask),也就是需要一種半透明的漸變。

關於遮罩,這裡簡單介紹一下,基本語法很簡單,和background的語法基本一致

.content{
  -webkit-mask: '遮罩圖片' ;
}
/*完整語法*/
.content{
  -webkit-mask: '遮罩圖片' [position] / [size] ;
}

這裡的遮罩圖片和背景的使用方式基本一致,可以是PNG圖片、SVG圖片、也可以是漸變繪製的圖片,同時也支持多圖片疊加。

遮罩的原理很簡單,最終效果只顯示不透明的部分,透明部分將不可見,半透明類推

先舉個圓形的例子,這個比較簡單,因為可以直接通過徑向漸變創建

比如,下麵有一個頭像,現在直接放在背景上非常突兀

我們可以將這個頭像通過徑向漸變繪製出了一個從不透明到透明的遮罩,達到和背景融合的效果

.head{
  -webkit-mask: radial-gradient(closest-side circle,#000 60%, transparent 100%);
}

原理是這樣的

最後效果如下

當然這是圓形的,如果是矩形的呢?

二、矩形的羽化原理

根據上面的分析,如果希望羽化矩形邊緣,需要創建這一個遮罩

那麼問題來了,如何創建這一個邊緣模糊的矩形呢?貌似沒辦法直接通過漸變來實現,而且還需要是尺寸自適應的(自動跟隨容器尺寸)

如果單純看這樣一個矩形,還是很容易實現的,通過box-shadow即可實現

.shadow{
  width: 200px;
  height: 200px;
 	background:black;
  border-radius:10px;
  box-shadow:0 0 5px black, 0 0 10px black, 0 0 15px black
}

根據需求,可以多疊加幾層box-shadow,這裡疊加了3層,效果如下

但是問題又來了,這樣一個 dom 無法直接用作mask-image,那如何處理呢?

三、通過 SVG foreignObject 轉換成圖片

上面提到,通過 CSS 陰影可以很輕鬆的實現我們說需要的效果,但可惜現在還是 dom 階段,所以需要將這個 dom 轉換成圖像。

在這裡,需要藉助 SVG 中的foreignObject元素,通過這個元素,可以將 HTML嵌入到SVG中,輕鬆實現 dom 轉圖片的效果

有興趣的可以參考之前這幾篇文章

  • CSS、SVG、Canvas對特殊字體的繪製與導出
  • CSS & SVG foreignObject 實現文字鏤空波浪動畫

原理如下

回到這裡,我們僅需要將上面的結果放到foreignObject元素中,由於需要自適應尺寸,這裡的body寬高都是100%,如下

<svg xmlns="http://www.w3.org/2000/svg">
  <foreignObject width="100%" height="100%">
    <body class="wrap" xmlns="http://www.w3.org/1999/xhtml">
      <style>
        .wrap{
          box-sizing: border-box;
          margin: 0;
          height: 100%;
          padding: 10px;
        }
        .shadow{
          height: 100%;
          background:black;
          border-radius:10px;
          box-shadow:0 0 5px black, 0 0 10px black, 0 0 15px black
        }
      </style>
      <div class="shadow"></div>
    </body>
  </foreignObject>
</svg>

這樣就得到了一個寬高自適應的SVG圖像,無論寬高怎麼變化,都是撐滿的

別看這麼多標簽,這其實已經是一張圖片,可以直接使用,接下來看看如何運用

四、矩形的羽化

其實上面得到的 SVG可以直接當成一個圖片資源,正常使用了,就像這樣

.name{
  -webkit-mask: url('./fearher.svg')
}

不過,也可以將這個SVG圖片轉換成內聯形式,減少資源依賴,轉換後仍然保持自適應特性

這裡推薦張鑫旭老師的SVG線上壓縮合併工具

轉換後就是這個樣子

.name{
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3CforeignObject width='100%25' height='100%25'%3E%3Cbody class='wrap' xmlns='http://www.w3.org/1999/xhtml'%3E%3Cstyle%3E.wrap%7Bbox-sizing:border-box;margin:0;height:100%25;padding:10px%7D.shadow%7Bheight:100%25;background:%23000;border-radius:10px;box-shadow:0 0 5px %23000,0 0 10px %23000,0 0 15px %23000%7D%3C/style%3E%3Cdiv class='shadow'/%3E%3C/body%3E%3C/foreignObject%3E%3C/svg%3E")
}

效果如下

Kapture 2022-12-10 at 18.23.20

而且由於尺寸是動態的,換個書名也能完美適應

image-20221210221842455

最後再來對比一下,下麵哪個一眼看上去效果最好

image-20221210183113086

完整代碼可以查看以下任意鏈接

本文轉載於:

https://juejin.cn/post/7176094306124431421

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


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

-Advertisement-
Play Games
更多相關文章
  • 一、為什麼要線程同步 在Linux 多線程編程中,線程同步是一個非常重要的問題。如果線程之間沒有正確地同步,就會導致程式出現一些意外的問題,例如: 競態條件(Race Condition):多個線程同時修改同一個共用變數,可能會導致不可預測的結果,因為線程的執行順序是不確定的。 死鎖(Deadloc ...
  • 這篇主要介紹對於SOP8,SOP10,SOP16封裝的PY32F002A/PY32F003, 沒有BOOT0的情況如何修改Option Bytes, 以及如何在物理管腳上使用不同的PIN ...
  • 訪問命令行(command line interface,CLI) Linux控制台 1)Linux系統啟動時,會自動創建多個虛擬控制台。虛擬控制台是運行在Linux系統記憶體中的終端會話。多數Linux發行版會啟動5~6個 2)通常必須按下Ctrl+Alt組合鍵,然後再按一個功能鍵(F1~F7)來進 ...
  • 資料庫安全與保護 第一節 資料庫完整性 資料庫完整性是指資料庫中數據的正確性和相容性。 數據完整性約束是為了防止資料庫中存在不符合語義的數據,為了維護數據的完整性,DBMS 必須提供一種機制來檢查資料庫中的數據,以判斷其是否滿足語義規定的條件。 這些加在資料庫數據之上的語義約束條件就是數據完整性約束 ...
  • 包含五個內容:①Navicat連接伺服器MySQL;②如何查看MySQL用戶名和密碼;③修改MySQL登錄密碼;④error 1045 (28000): access denied for user 'root'@'localhost' (using password:yes)錯誤解決方法;⑤安裝M... ...
  • 一:在hadoop3.3中安裝配置sqoop1.4.7 前言: sqoop功能已經非常完善了,沒有什麼可以更新的了,官方停止更新維護了。因此官方集成的hadoop包停留在了2.6.0版本,在hadoop3.3.0版本會提示類版本過低錯誤,但純凈版sqoop有缺少必須的第三方庫,所以將這兩個包下載下來 ...
  • 1. 集合論是SQL語言的根基 1.1. UNION 1.1.1. SQL-86標準 1.2. NTERSECT和EXCEPT 1.2.1. SQL-92標準 1.3. 除法運算(DIVIDE BY) 1.3.1. 沒有被標準化 2. 註意事項 2.1. SQL能操作具有重覆行的集合,可以通過可選項 ...
  • 說明 有讀者反饋: 學習uniapp ios 插件開發不知道從哪些文章看起,沒有一個清晰的學習路線 本文就做一個解答。 首先本系列的文章是作者精心排過序的,如果想要完整的學習uniapp ios原生插件開發技術的話,建議是按文章順序瀏覽。 當然您如果有相關的開發經驗,且只對某一技術實現感興趣的話,也 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...