做優秀css3動畫?這裡解釋box-shadow 動畫

2020-12-13 都AI技術

例子

某日移動端有一需求:要求一 App Logo 有一層外陰影閃動效果,實現起來倒也不複雜。簡單粗暴直接在keyframes中定義box-shadow動畫即可交差,最終代碼如下:

.box {

margin:100pxauto; width:200px;

height:200px;

border-radius:4px;

animation: boxAnimation 1s infinite linear alternate-reverse;

}

@keyframes boxAnimation {

form {

box-shadow:000px rgba(0,0,0,.4);

}

to {

box-shadow:0050px rgba(0,0,0,.4);

}

}

動畫在 PC 端運行時我這寫輪眼是看不出任何卡頓的,一旦在模擬器或者移動端上運行情況就不那麼樂觀了,出現了明顯可感知的掉幀。

Why?

首先我們會歸咎於移動端設備的性能落於 PC。是啊,紅米 Note 4 的機能與 MacBook Pro 2016 頂配之間的性能差距非常巨大。但在同一行動裝置下其他的動畫卻很流暢的,比如transform,那為什麼偏偏box-shadow就會導致性能問題呢?而且box-shadow也是個慣犯了,之前就爆出box-shadow在頁面滾動時會導致性能問題,既然有前科這就好辦了。經過查閱資料得知:

不同樣式在消耗性能方面是不同的,有些效果(如經常被人提起的box-shadow)從渲染角度來講十分耗性能,原因就是與其他樣式相比,它們的繪製代碼執行時間過長。也就是說,如果一個耗性能嚴重的樣式經常需要重繪,那麼你就會遇到性能問題。

而keyframes中定義的動畫是循環改變box-shadow,導致瀏覽器會一直重繪耗性能嚴重的樣式,進而產生性能問題。

解決問題嘛,可不可以先解決提出問題的 CSS 屬性 ——box-shadow呢?我覺得刪除是不可能刪除的,這輩子都不可能刪除的,box-shadow

長得又好看,用起來還簡單,我超喜歡用的!那麼優化思路就剩下如何阻止瀏覽器一直繪製box-shadow。

How

至於怎麼做 CSS-TRICKS 直接給出了解決方案:為偽元素設置box-shadow並對其不透明度設置動畫:

根據其建議,我們將代碼修改如下,果然模擬器或移動端設備上動畫不卡了!打開 Chrome DevTools 中幀率觀察器,幀率也一直是以 60fps 的一條直線,而不是之前的略有波動。

.box {

margin:100pxauto;

width:200px;

height:200px;

border-radius:4px;

}

.box::after {

content:'';// 防止遮蔽父層

position: absolute;

z-index:-1;

display: block;

width: inherit;

height: inherit;

border-radius: inherit;

box-shadow:0050px rgba(0,0,0,.4);

will-change: opacity;

opacity:0;

animation: fadeIn 1s infinite linear alternate-reverse;

}

@keyframes fadeIn {

form {

opacity:0;

} to {

opacity:1;

}

}

opacity一邊樂呵大唱「我們不一樣」!那問題來了,為何opacity不會引發瀏覽器的重繪?

有一個 CSS 屬性,你可能認為它會引起重繪,但有時候並不會。就是:opacity。當GPU在合成元素的紋理結構的時候,會以一個較低的 alpha 值去處理opacity的改變。它的條件是,元素必須是圖層中唯一的一個元素。如果它和其它的元素組合在一起,那麼對opacity的改變也會讓 GPU(錯誤地)淡化其它的元素。

原來opacity真的不一樣啊!因為在 Blink 和 WebKit 內核的瀏覽器中,對於在 CSStransition或者animation中有opacity改變的元素,瀏覽器改將會為其創建一個圖層,然後交給其小秘 GPU 去分擔處理。同樣能享受這些待遇的動畫屬性如下:

現代瀏覽器在完成以下四種屬性的動畫時,消耗成本較低:position(位置)<sup id=「fnref1」>1</sup>, scale(比例縮放), rotation(旋轉) 和 opacity(透明度)。

上文可知scale也是不錯的備選方案,但我為什麼沒有選?如果對偽元素做scale動畫會導致動畫效果跟box-shadow有差異。既然創建一個交由 GPU 渲染的圖層這麼厲害,那麼我們可不可以強制創建一個?那就是 前端交互動畫優化 中提到的認為產生硬體加速了。

相關焦點

  • 前端工程師必備的css3動畫技巧
    我們將學到box-shadow的高級應用製作自適應的橢圓純css3實現餅圖進度動畫用border來實現一個對話框樣式css3 filter的簡單應用css3偽元素實現自定義複選框在線製作css3動畫的利器正文1.box-shadow的高級應用
  • 前端工程師必備的css3動畫技巧(附源碼)
    我們將學到正文1.box-shadow的高級應用利用css3的新特性可以幫助我們實現各種意想不到的特效,接下來的幾個案例我們來使用css3的box-shdow來實現,馬上開始吧!實現水波動畫想想我們如果不用css3,是怎麼實現水波擴散的動畫呢?
  • 用css3實現背景即背景動畫(高級附源碼)
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫我們傳統的前端更多的是用javascript實現各種複雜動畫,自從有了Css3 transition和animation以來,前端開發在動畫這一塊有了更高的自由度和格局,對動畫的開發也越來越容易。
  • 前端—— CSS3動畫
    雖說IE9以及更早版本的IE瀏覽器都不支持css3動畫,但是IE6-8瀏覽器已是江河日下,使用谷歌瀏覽器、火狐瀏覽器、IE10+瀏覽器以及移動端瀏覽器等這些支持css3動畫的瀏覽器的人數越來越多,所以如果很簡單的就能讓一部分人獲得更好的用戶體驗,那何樂而不為呢。
  • CSS3滑鼠經過動畫特效
    在網際網路項目開發過程中,經常需要用到特效,以增強視覺特殊效果,給用戶更好的體驗效果;今天給大家分享的是一款css3滑鼠經過動畫特效,在該特效中,當滑鼠經過圖片時,圖片略微放大,底部遮罩層出現,同時圖片的描述文字和連結會以動畫的方式出現在遮罩層之上,非常炫酷。
  • SVG動畫、CSS3動畫常用知識點全解析
    解釋:以上代碼使20*20的正方形,停留2秒後,再用時5秒變成一個200*20的長方形,並且在動畫結束時停留在長方形的狀態。>#box{transition-property:width, height; transition-duration:1s, 3s; transition-timing-function:ease-in, cubic-bezier(1,0,0,1); transition-delay
  • 因為CSS3,動畫將一切皆有可能
    熱火朝天的css3無疑吸引了很多前端開發者的眼球,然而在css3中的動畫屬性則是新功能中的主打招牌,說到css3的動畫屬性不得不讓人想起這三個屬性:Transform﹑Transition﹑Animation。
  • 5分鐘實現漂亮的CSS加載動畫,純CSS實現加載動畫
    2.3 CSS3 box-shadow 屬性box-shadow屬性可以設置一個或多個下拉陰影的框。默認值:none繼承:no版本:CSS3JavaScript 語法:object.style.boxShadow="10px 10px 5px #888888"語法box-shadow: h-shadow v-shadow blur spread color inset;注意:boxShadow 屬性把一個或多個下拉陰影添加到框上。
  • CSS3動態進度條及jQ百分比數字顯示
    有了設計理念和作品,那我們怎麼用最精彩的方法運用到我們的網頁製作當中呢﹖今天就為大家分享一個利用css3製作動態進度條以及附加jQuery百分比數字顯示。其效果對比flash來說卻毫不遜色,有一個精緻的動畫進度條,上面還有當前進度的百分比數字顯示,而且還會跟著進度條而移動。相信追求新穎的朋友來說一定會非常的喜歡。
  • 8個純CSS3製作的動畫應用及源碼
    對於一個複雜的圖形或者動畫來說,之前我們的處理方式是圖片疊加或者利用CSS+JavaScript的方法,然而隨著CSS3標準的不斷成熟,我們甚至完全可以利用CSS3來繪製一些圖片和製作豐富的動畫特效。本文主要是分享了8個純CSS3製作的動畫應用,提供原始碼下載。
  • 如何用純css打造類materialUI的按鈕點擊動畫並封裝成react組件
    但隨著對用戶體驗的越來越重視,對交互體驗要求的提高以及css3等新標準的出現,使得web更加大放異彩, 各種動效的實現都變得非常容易.筆者在研究materialUI框架時對於它的交互及其讚嘆.所以為了自己能實現一個類似materialUI的按鈕點擊動畫,並封裝到自己的UI庫中,筆者特地總結了一些思路,希望可以和廣大的前端工程師們一起探討.
  • 《前端5分鐘》之使用純css實現網站換膚和焦點圖切換動畫
    你將收穫網站換膚設計方案介紹:target偽類介紹和用法以及如何使用css實現網站換膚transition動畫以及如何用純css實現焦點圖動畫效果展示1.網站換膚2.焦點圖動畫實現思路1.網站換膚通常我們實現網站換膚都基於如下方式實現:方案一: 使用OOCSS模式,通過js動態切換公共類名來達到換膚效果方案二
  • 過渡動畫和關鍵幀動畫
    一、CSS3 過渡transitioncss3的transition允許css的屬性值在一定的時間區間內平滑地過渡。可通過設置多個節點來精確控制一個或一組動畫,常用來實現複雜的動畫效果。檢索或設置對象所應用的動畫特效。
  • CSS3文本陰影 text-shadow
    在最早做網頁的時候,陰影效果是沒辦法實現的,只能用圖片代替,現在有了CSS3的陰影屬性box-shadow以及text-shadow來實現陰影。這樣我們可以不需要圖片也可以實現陰影效果了,一方面能減少代碼以及圖片的大小和數量,另一方面我們也能減少對圖片的請求。還有一點,在於陰影能夠很好的處理我們當前移動端上的一些問題。
  • 幫助你生成純CSS3動畫開關效果的在線工具-On/Off FlipSwitch
    幫助你生成純CSS3動畫開關效果的在線工具-On/Off FlipSwitch 在線演示以前我們介紹過在線生成純CSS3的氣泡提示的在線工具,今天我們這裡介紹一個幫助你在線生成純
  • H5:常用css3屬性box-sizing,display:box
    為元素指定的任何內邊距和邊框都將在已設定的寬度和高度內進行繪製。通過從已設定的寬度和高度分別減去邊框和內邊距才能得到內容的寬度和高度。inherit:規定應從父元素繼承 box-sizing 屬性的值。兼容性:Internet Explorer、Opera 以及 Chrome 支持 box-sizing 屬性。
  • 網頁使用jQuery的動畫組合圖庫
    今天,我們將用jQuery創建一個動畫文件夾庫。該畫廊將包含一個用於縮略圖的滾動條和一個內容區域,在這裡我們將顯示有關該組合項的詳細信息。通過點擊它可以放大圖像,使其顯示為疊加。這個想法是每當單擊一個縮略圖時,就會激活內容元素。我們將動畫的標題從頂部,淡出之前的圖像和幻燈片的描述從側面。
  • ...linear;}自動添加css3前綴後div {  display: -webkit-box...
    使用webstorm自動編譯scss文件,並對生成的css文件自動添加瀏覽器支持前綴css書寫div {  display: flex;  animation: all 1s linear;}自動添加css3前綴後div {  display: -webkit-box;  display: -
  • css3動畫怎麼實現旋轉效果
    這也就是為什麼谷歌會不遺餘力地推廣他所主導的開源項目WebRTC (Web Real-Time Communication),把實時通訊的功能都做進瀏覽器,像視頻通話這樣的高級應用直接在JavaScript裡調用幾個瀏覽器API即可實現!這在以前想都不敢想。
  • css3動畫的實例講解
    動畫是使元素從一種樣式逐漸變化為另一種樣式的效果。可通過設置多個節點來精確控制一個或一組動畫,常用來實現複雜的動畫效果。0% 是動畫的開始,100% 是動畫的完成。1、定義動畫軌跡@keyframes 動畫名稱{from{動畫初始狀態}to{動畫結束狀態