CSS 陰影動畫優化技巧一則

来源:https://www.cnblogs.com/coco1s/archive/2019/10/31/11769695.html
-Advertisement-
Play Games

本技巧來自這篇文章 -- How to animate box-shadow with silky smooth performance 本文不是直譯,因為覺得這個技巧很有意思很有用,遂起一文。 box-shadow 在我們的工作中使用以及越來越多,伴隨陰影的動畫或多或少都有一點。假設,我們有下麵這 ...


本技巧來自這篇文章 -- How to animate box-shadow with silky smooth performance

本文不是直譯,因為覺得這個技巧很有意思很有用,遂起一文。

box-shadow 在我們的工作中使用以及越來越多,伴隨陰影的動畫或多或少都有一點。假設,我們有下麵這樣一個盒子:

div {
    width: 100px;
    height: 100px;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}

希望 hover 的時候,盒陰影從 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3) 過渡到 box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3)

  • box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3) --> box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3)

OK,最簡單的方法當然是:

div:hover {
    width: 100px;
    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
}

因為過渡動畫是在兩個不同的盒陰影狀態在發生,所以在過渡動畫的時間內,瀏覽器會不斷的重繪盒陰影。而又由於陰影屬於耗性能樣式,所以這種動畫給人的感覺多少有些卡頓。

這裡有一個小技巧可以優化這種情況下的陰影動畫。

 

使用偽元素及透明度進行優化

使用偽元素及透明度進行優化,我們給上述元素添加一個 before 偽元素,大小與父 div 一致,並且提前給這個元素添加好所需要的最終的盒陰影狀態,但是元素的透明度為 0。

div {
    position: relative;
    width: 100px;
    height: 100px;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}

div::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
    opacity: 0;
}

然後,在 hover 的時候,我們只需要將偽元素的透明度從 0 設置為 1 即可。

div:hover::before {
    opacity: 1;
}

這樣做的好處是,實際在進行的陰影變化,其實只是透明度的變化,而沒有對陰影進行不斷的重繪,有效的提升了陰影動畫的流暢程度,讓它看起來更加絲滑。

bshadow

為什麼對透明度 opacity 進行動畫要比對 box-shadow 進行動畫性能更好呢?可以看看這裡這張表格,列舉了不同屬性變換對頁面重排、重繪的影響:

image

very few CSS properties

最後,Demo 可以看看:

 

CodePen Demo -- 優化box-shadow動畫

 

存在的問題,另外一種方案

原文中上述這個方案其實並不算太完美,因為最終的效果是兩個陰影的疊加效果,可能會在整體的感覺上陰影顏色更深了一點。

所以需要對最終狀態的陰影進行微調一下,削弱一點效果,儘量讓兩個陰影的疊加效果與單一一個陰影效果相近。

當然,我們可以再對上述方案進行優化,我們再使用一個 ::after 偽元素,::after 偽元素設置為初始狀態且透明度為1,::before 偽元素設置為末尾狀態且透明度為0:

div {
    position: relative;
    width: 100px;
    height: 100px;
}

div::before {
    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
    opacity: 0;
}

div::after {
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}

實際 hover 的時候,對兩個偽元素進行一顯一隱,這樣最終的效果只有一個陰影效果,沒有陰影的疊加,與直接對陰影進行過渡變化效果一致:

div:hover::before {
    opacity: 1;
}

div:hover::after {
    opacity: 0;
}

bshadow2

CodePen Demo -- 優化box-shadow動畫

最後

好了,本文到此結束,希望對你有幫助 :)

更多精彩 CSS 技術文章彙總在我的 Github -- iCSS ,持續更新,歡迎點個 star 訂閱收藏。


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

-Advertisement-
Play Games
更多相關文章
  • Webpack 是一個前端資源載入/打包工具。它將根據模塊的依賴關係進行靜態分析,然後將這些模塊按照指定的規則生成對應的靜態資源。 基於 Webpack3.0 測試通過。 從圖中我們可以看出,Webpack 可以將多種靜態資源 js、css、less 轉換成一個靜態文件,減少了頁面的請求。 接下來我 ...
  • //非同步1<template> <div class="addequipment org"> <div class="top"> <div class="topfirst">菜單管理</div> <div class="addequi" @click='addNew'>添加</div> </div>... ...
  • [toc] Vue 單元測試 "官網:https://vue test utils.vuejs.org/zh" 定義: 單元測試是用來對一個模塊、一個函數或者一個類來進行正確性檢驗的測試工作。 指令: package.json文件 "test:unit": "vue cli service test ...
  • 1.從微信小程式的官網扣下來的demo,實際測試中,發現6s ios10 系統不相容,裡面的內容出不來 2.實際效果如下: 底部的tabbar沒出來 3.把 cover-view 改成 view 把 cover-image 改成 image 標簽 4. 記得把你的css 樣式也改一下啊 預設的 cl ...
  • 先理解兩個概念:基本類型和引用類型的值 1、基本類型和引用類型的值 (1)定義: 基本類型:指簡單的數據段,比如按值訪問的js五種基本數據類型undefined、null、boolean、number、srtring 引用類型的值:指保存在記憶體中的對象,註意一點,js不允許直接操作對象的空間 (2) ...
  • 組件允許你將 UI 拆分為獨立可復用的代碼片段,並對每個片段進行獨立構思。所以當在動手寫代碼之前,要分析UI,如何劃分組件是一個需要在動手之前想清楚的問題,最重要的就是獨立以及可復用。獨立代表不會影響到其他組件,可復用代表省去了很多重覆工作量,所以這兩部分在劃分組件的時候要重點思考。 組件,從概念上 ...
  • 今天我們來畫折線圖 效果圖 以下為模擬數據 首先創建filterData方法 用於過濾數據 text文本 line線段 area圓 tag暫時用不到 今天說的是折線所以創建zrLine 方法 我們在新增一個文件夾創建utli.js這個文件夾的作用為我們把創建線創建圓的公共方法寫在這個js文件里 ut ...
  • 放到我自己的伺服器上了。 網 scale.html 櫻花 sakura.html ...
一周排行
    -Advertisement-
    Play Games
  • JWT(JSON Web Token)是一種用於在網路應用之間傳遞信息的開放標準(RFC 7519)。它使用 JSON 對象在安全可靠的方式下傳遞信息,通常用於身份驗證和信息交換。 在Web API中,JWT通常用於對用戶進行身份驗證和授權。當用戶登錄成功後,伺服器會生成一個Token並返回給客戶端 ...
  • 老周在幾個世紀前曾寫過樹莓派相關的 iOT 水文,之所以沒寫 Nano Framework 相關的內容,是因為那時候這貨還不成熟,可玩性不高。不過,這貨現在已經相對完善,老周都把它用在項目上了——第一個是自製的智能插座,這個某寶上50多塊可以買到,搜“esp32 插座”就能找到。一種是 86 型盒子 ...
  • 引言 上一篇我們創建了一個Sample.Api項目和Sample.Repository,並且帶大家熟悉了一下Moq的概念,這一章我們來實戰一下在xUnit項目使用依賴註入。 Xunit.DependencyInjection Xunit.DependencyInjection 是一個用於 xUnit ...
  • 在 Avalonia 中,樣式是定義控制項外觀的一種方式,而控制項主題則是一組樣式和資源,用於定義應用程式的整體外觀和感覺。本文將深入探討這些概念,並提供示例代碼以幫助您更好地理解它們。 樣式是什麼? 樣式是一組屬性,用於定義控制項的外觀。它們可以包括背景色、邊框、字體樣式等。在 Avalonia 中,樣 ...
  • 在處理大型Excel工作簿時,有時候我們需要在工作表中凍結窗格,這樣可以在滾動查看數據的同時保持某些行或列固定不動。凍結窗格可以幫助我們更容易地導航和理解複雜的數據集。相反,當你不需要凍結窗格時,你可能需要解凍它們以獲得完整的視野。 下麵將介紹如何使用免費.NET庫通過C#實現凍結Excel視窗以鎖 ...
  • .NET 部署 IIS 的簡單步驟一: 下載 dotnet-hosting-x.y.z-win.exe ,下載地址:.NET Downloads (Linux, macOS, and Windows) (microsoft.com) .NET 部署 IIS 的簡單步驟二: 選擇對應的版本,點擊進入詳 ...
  • 拓展閱讀 資料庫設計工具-08-概覽 資料庫設計工具-08-powerdesigner 資料庫設計工具-09-mysql workbench 資料庫設計工具-10-dbdesign 資料庫設計工具-11-dbeaver 資料庫設計工具-12-pgmodeler 資料庫設計工具-13-erdplus ...
  • 初識STL STL,(Standard Template Library),即"標準模板庫",由惠普實驗室開發,STL中提供了非常多對信息學奧賽很有用的東西。 vector vetor是STL中的一個容器,可以看作一個不定長的數組,其基本形式為: vector<數據類型> 名字; 如: vector ...
  • 前言 最近自己做了個 Falsk 小項目,在部署上伺服器的時候,發現雖然不乏相關教程,但大多都是將自己項目代碼複製出來,不講核心邏輯,不太簡潔,於是將自己部署的經驗寫成內容分享出來。 uWSGI 簡介 uWSGI: 一種實現了多種協議(包括 uwsgi、http)並能提供伺服器搭建功能的 Pytho ...
  • 1 文本Embedding 將整個文本轉化為實數向量的技術。 Embedding優點是可將離散的詞語或句子轉化為連續的向量,就可用數學方法來處理詞語或句子,捕捉到文本的語義信息,文本和文本的關係信息。 ◉ 優質的Embedding通常會讓語義相似的文本在空間中彼此接近 ◉ 優質的Embedding相 ...