首頁 > web前端 > css教學 > 如何使CSS框陰影動畫並優化性能

如何使CSS框陰影動畫並優化性能

Joseph Gordon-Levitt
發布: 2025-02-11 08:24:10
原創
939 人瀏覽過

如何使CSS框陰影動畫並優化性能

>在本文中,您將學習如何在不降低瀏覽器性能的情況下對CSS框陰影進行動畫。

在CSS中,Box-Shadow屬性用於將陰影添加到Web元素中,這些陰影可以是動畫的。但是,影子動畫會影響瀏覽器的性能,從而在渲染頁面時會滯後。

本指南旨在針對具有HTML的工作知識和CSS動畫的前端開發人員。

鑰匙要點

    >動畫CSS框陰影會影響瀏覽器性能,可能導致頁面渲染期間滯後。因此,至關重要的是優化這些動畫以維持快速的頁面加載時間,這是用戶滿意度和轉換率的關鍵因素。
  • >
  • > css偽造動畫觸發了三個主要過程:繪畫,佈局和合成。繪畫涉及瀏覽器填充顏色的像素,是資源最密集的。佈局更改涉及重新計算頁面的結構,還消耗了大量資源。僅影響頁面部分的組合是要求最少的過程。 為了優化性能,開發人員可以採用多種技術。其中包括僅動畫陰影的不透明度而不是更改其偏移值,從而減少了重新粉刷的需求;使用多個盒子陰影層,動畫時表現出色。並為提供陰影的偽元素進行動畫,從而大大減少重新粉刷和總體CPU工作量的數量。
  • >保持陰影動畫的最小化和僅動畫交互式元素以減少CPU工作量。如果需要陰影動畫,開發人員應權衡深度視覺吸引力與僅更改不透明度的性能優勢之間的權衡。他們還應考慮為提供陰影的偽元素動畫所需的額外代碼。
  • 為什麼這很重要
  • >一個網頁必須有很短的負載時間,理想情況下是五秒鐘。研究表明,快速的頁面加載可以極大地提高轉化率。進一步的研究表明,有70%的用戶表示網站的速度會影響他們從在線商店購買的意願。基本上,快速站點平等快樂的用戶。
  • >
>在進一步之前,這裡有一個演示盒子陰影動畫可以在網頁上運行的演示。您可以滾動瀏覽並與Web元素進行交互。

參見筆

通過sitepoint(@sitepoint)

的帶有陰影動畫的Web元素 在Codepen上。

>三個主要CSS盒子暗示動畫事件

由於幕後發生的事情,CSS彈幕動畫可能會很重。在Box Shadow Animation(或任何形式的動畫)中觸發了三個主要過程或事件。這些事件是繪畫,佈局和合成。

  • 繪畫。在繪畫中,瀏覽器充滿了顏色的像素,而Box-Shadow是觸發此事件的CSS屬性之一。基本上,它在動畫的每個幀中都會創建一個新的陰影。根據Mozilla的說法,理想的CSS動畫應在60fps。

  • 佈局。一些動畫會改變頁面的結構,這可能會導致許多樣式的重新計算。一個很好的例子是側邊欄在擴展時將其他元素推開。引起的CSS屬性包括填充,邊距,邊框。

    >

    簡單地說,如果動畫屬性影響其他元素,它將改變頁面的佈局,導致重新計算 - 使用大量系統資源。

  • >合成。在合成中,只有頁面的一部分更改。 CSS屬性(如不透明度和轉換)僅影響其應用於的元素。這將意味著更少的樣式重新計算,並且動畫更順暢。組合是所有三個中的任務最少的過程。
  • >

  • >使用瀏覽器的檢查器工具,您可以實時觀察此過程。首先,打開檢查器工具(如下圖所示),然後單擊選項卡右上角的三個點。檢查更多工具並選擇渲染。

如何使CSS框陰影動畫並優化性能在此示例中,選擇了油漆閃爍。每次有繪畫事件時,屏幕都會閃爍綠色:

> navbar:

  • 如何使CSS框陰影動畫並優化性能文本卡:

  • 如何使CSS框陰影動畫並優化性能導航鏈接:

  • 如何使CSS框陰影動畫並優化性能
  • >您會發現,當您懸停在綠色時,或者刷新頁面時,每個元素都會閃爍綠色。您也可以對佈局進行相同的實驗:只需取消選中的油漆閃爍並選擇佈局偏移區域。

>

請注意,塗料閃爍可能在Codepen演示中不起作用,因此您需要使用文本編輯器的實時預覽嘗試一下。下面的視頻顯示了您應該看到的內容。

目標是最大程度地減少繪畫和佈局的變化,因為它們使用了更多的系統資源。

檢查性能

作為開發人員,您可能沒有任何問題,因為您有一台快速計算機。但是,您必須考慮使用較慢的PC和不可靠的Internet連接的用戶。僅僅因為它在您的計算機上看起來不錯,並不意味著其他地方都一樣。

> 一個盒子陰影具有四個值和一個顏色。這四個值分別是陰影的水平位置(x偏移),垂直位置(y偏移),擴展和模糊半徑。典型的陰影動畫將涉及其中一個或多個值的更改:>

讓我們創建一個簡單的盒子陰影動畫,從一些html開始:

<span>box-shadow: <x-offset> <y-offset> <spread> <blur> <color>;
</span>
登入後複製
登入後複製
登入後複製
>這是一些首字母和最終陰影的CSS:

這是結果:
<span><span><span><body</span>></span>
</span>  <span><span><span><div</span> class<span>="box"</span>></span><span><span></div</span>></span>
</span><span><span><span></body</span>></span>
</span>
登入後複製
登入後複製
登入後複製

>

參見筆
<span><span>.box</span> {
</span>  <span>box-shadow: 0px 5px 10px 0px <span>rgba(0, 0, 0, 0.5)</span>;
</span>  <span>transition: transform ease 0.5s, box-shadow ease 0.5s;
</span><span>}
</span><span><span>.box:hover</span> {
</span>  <span>transform: translateY(-5px);
</span>  <span>box-shadow: 0px 10px 20px 2px <span>rgba(0, 0, 0, 0.25)</span>;
</span><span>}
</span>
登入後複製
登入後複製
sitepoint(@sitepoint)的動畫盒子陰影

在Codepen上。


對於動畫,我們正在更改Y偏移,模糊和傳播的值。我們也將帶有更透明的最終陰影。

>現在讓我們來看看幕後的情況,我們運行了0.5s的動畫。在瀏覽器上,通過右鍵單擊和選擇“檢查”打開開發人員工具。工具打開後,請轉到“性能”選項卡。您可以記錄影子動畫;只有幾秒鐘就足以看到發生了什麼。

>

下面的屏幕截圖顯示了您從Chrome的Devtools中找到的。

>陰影的動畫週期懸停在上下,在頂部突出顯示,並且發生的過程分解在底部顯示。分解表明,腳本需要7ms,渲染需要55毫秒,繪畫持續30ms。

現在,這些數字看起來還可以,但是當CPU慢四倍時會發生什麼?您可以從“性能”選項卡中防止CPU速度。

>以下圖顯示了使用較慢的CPU運行相同動畫時會發生什麼。 如何使CSS框陰影動畫並優化性能

在這個新過程中,加載需要6ms。腳本最高為52毫秒,渲染已翻了一番,達到117ms,現在繪畫為72毫秒。

>您還可以節流網絡速度,並使CPU甚至更慢。影子動畫使用了大量系統資源,我們將尋求消除一些負載。 >

>重要的是要注意,轉換屬性在CPU執行方式中起著作用。稍後再詳細介紹。

>

如何保持最佳性能

如果您必須在網頁上進行動畫陰影,則值得使它們更具性能。在本節中,您將了解可以調整陰影動畫的各種方式,以便降低性能。

我們將介紹以下內容:

    動畫不透明度
  1. 有多個盒子層
  2. >
  3. 動畫偽元素
  4. 使用變換屬性
動畫不透明度

使用RGBA顏色時,Alpha通道控制不透明度。在CPU上進行動畫陰影時,僅更改Alpha頻道就不會像更改陰影的偏移和傳播值那樣難。

在第一個動畫中,只有陰影的不透明度在變化,而在第二個動畫中,y offset從10px變為20px,差異從20px變為40px。

>在6倍放緩時他們的性能(因此您可以清楚地看到性能圖),從動畫開始,只有不透明度正在改變:
<span>box-shadow: <x-offset> <y-offset> <spread> <blur> <color>;
</span>
登入後複製
登入後複製
登入後複製

>大約需要兩秒鐘才能懸停在盒子上和盒子上。現在將其與第二個影子動畫進行比較。

如何使CSS框陰影動畫並優化性能

再次開出兩秒鐘,所有事件的時間都有明顯的增加。繪畫之前是96毫秒,現在翻了一番,達到187毫秒。渲染是合成的一部分,也從97ms上升到178ms。 因此,僅更改陰影的不透明度會產生更具性能的動畫。

這是這兩個動畫的現場演示。 如何使CSS框陰影動畫並優化性能

參見筆

sitepoint(@sitepoint)

的動畫不透明度與動畫偏移 在Codepen上。

>層狀陰影


如果您觀察到桌子周圍的陰影或將物體提起上面,您會注意到其最黑暗的陰影區域最接近物體,並且隨著它向外擴散時,它變得越來越輕。 一個盒子陰影,複製這種效果並不容易。分層陰影看起來好多了。即使增加了陰影層,它們也會產生更多的性能動畫。

讓我們比較單個盒子陰影和多層陰影的性能:

這個動畫具有148ms的渲染和133ms的繪畫。

現在,讓我們有一個帶有兩個盒子陰影層的陰影動畫:>

<span><span><span><body</span>></span>
</span>  <span><span><span><div</span> class<span>="box"</span>></span><span><span></div</span>></span>
</span><span><span><span></body</span>></span>
</span>
登入後複製
登入後複製
登入後複製

差異很明顯。分層陰影不僅會產生看起來更好的陰影效果,而且在動畫時表現出色。渲染已從148ms降低到74ms,繪畫也從133ms降至74ms。

這是兩者的現場演示。

>

參見筆

單個陰影與層面陰影動畫按SitePoint(@SitePoint)
在Codepen上。

現在,讓我們嘗試一些不同的東西,在動畫過程中添加第二個陰影:

<span>box-shadow: <x-offset> <y-offset> <spread> <blur> <color>;
</span>
登入後複製
登入後複製
登入後複製

如何使CSS框陰影動畫並優化性能>在動畫過程中添加第二個陰影層的性能不如從一開始就擁有兩層,但它的繪畫仍然具有100毫秒的繪畫,而單個盒子射擊動畫則是133毫秒,這是一個改進。

>最終,由您決定您的影子外觀以及將使用哪種方法來創建它。

動畫偽元素

這次,我們將在不更改盒子陰影屬性的情況下複製影子動畫。從以前的演示中,我們可以看到影子動畫期間仍有很多重新粉刷。如果您要更改盒子陰影值,則無法避免此過程。

>您會在本節的末尾看到繪畫將幾乎完全消除。它將涉及更多的代碼行,但是我們將獲得更多性能的影子動畫。

>因此,在盒子的基本樣式之後,創建一個:偽元素之後並給它給它一個盒子陰影,這將是動畫之後陰影的最終狀態

現在,您要做的就是更改偽元素的不透明度:懸停:

>讓我們在常規的影子動畫旁邊看一下。
<span><span><span><body</span>></span>
</span>  <span><span><span><div</span> class<span>="box"</span>></span><span><span></div</span>></span>
</span><span><span><span></body</span>></span>
</span>
登入後複製
登入後複製
登入後複製

<span><span>.box</span> {
</span>  <span>box-shadow: 0px 5px 10px 0px <span>rgba(0, 0, 0, 0.5)</span>;
</span>  <span>transition: transform ease 0.5s, box-shadow ease 0.5s;
</span><span>}
</span><span><span>.box:hover</span> {
</span>  <span>transform: translateY(-5px);
</span>  <span>box-shadow: 0px 10px 20px 2px <span>rgba(0, 0, 0, 0.25)</span>;
</span><span>}
</span>
登入後複製
登入後複製

參見筆

sitepoint(@sitepoint)

在Codepen上。


>在此處視覺上沒有太多要進行的。真正的區別在於他們的表現。常規盒子動畫的結果如下所示。
>

>它具有230ms的渲染時間,繪畫的211毫秒。現在是偽陰影動畫。

如何使CSS框陰影動畫並優化性能

這次,我們有148ms的渲染,只有51毫秒的繪畫。還有更多代碼,但結果值得。

使用變換屬性

>這主要適用於將具有陰影的主要元素,即盒子。使用變換屬性,而不是更改諸如保證金之類的佈局屬性,將減少樣式重計的數量。

此屬性可以與翻譯或比例屬性一起使用,以模擬將元素從頁面上抬起,從而產生深度的幻覺。

一些有用的提示

>已經確定,任何涉及盒子陰影屬性的動畫都會影響性能。因此,如果您必須擁有CSS盒子影畫動畫,這裡有一些有用的技巧可以牢記。

>

首先,保持最小。為此,不要在每個元素上扔陰影。其次,僅動畫交互式元素。無需動畫任何沒有功能的東西。這將減少CPU的工作量並大大提高性能。

結論

陰影可以視覺上增強您的網站,但它們也會影響性能,尤其是在動畫方面。在本文中,我們測試了有關動畫陰影的各種方法,並比較了它們的性能。動畫陰影觸發了三個事件 - 繪畫,佈局更改和合成 - 首先是任務最多的事件。

理想的解決方案是完全不動畫陰影(因為它們看起來不錯!)。如果您真的想為盒子陰影屬性做動畫,而只是更改不透明度而不是更改偏移值將減少重新粉刷。捕獲是,您會失去陰影要提供的深度幻想。另一種方法是使兩個盒子陰影層動畫。該解決方案在視覺上令人愉悅,即使具有額外的陰影。

>最後一個選項是動畫不是盒子陰影,而是一個提供陰影的偽元素。這大大減少了重新粉刷的數量以及CPU在運行動畫方面所做的整體工作。您將編寫更多代碼,但這是確保表現良好的最好的選擇。

>

相關內容:

> css:is,:where and:

>將元素隱藏在CSS

中的10種方法
    book:
  • > css master
  • CSS中的REM:理解和使用REM單位
  • 關於CSS Shadow的常見問題解答 >
  • CSS中的盒子陰影是什麼? >>盒子陰影屬性中的值是什麼意思?

    值代表:水平偏移:陰影的水平距離。
    垂直偏移:陰影的垂直距離。
    模糊半徑:施加到陰影的模糊量: 選修的。
    顏色:陰影的顏色。

    我可以使用盒子遮陽元素應用多個陰影嗎?

    是的,您可以通過逗號分隔每個陰影來應用多個陰影。

    >我可以在任何HTML元素上使用盒子陰影嗎?

    es,您可以將盒子陰影應用於大多數HTML元素,例如Divs,段落,標題等。它是一種用途屬性,用於增強元素的可視化呈現。

    使用盒子陰影時的性能注意事項?

    >過度使用盒子陰影,尤其是具有較大的模糊值,可能會影響性能。建議明智地使用陰影來保持光滑的用戶體驗,尤其是在功能較低的設備上。

以上是如何使CSS框陰影動畫並優化性能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板