CSS頁面渲染優化屬性will-change

来源:http://www.cnblogs.com/xiaohuochai/archive/2017/01/20/6321790.html
-Advertisement-
Play Games

前面的話   當我們通過某些行為(點擊、移動或滾動)觸發頁面進行大面積繪製的時候,瀏覽器往往是沒有準備的,只能被動使用CPU去計算與重繪,由於沒有事先準備,應付渲染夠嗆,於是掉幀卡頓。而CSS屬性will change為web開發者提供了一種告知瀏覽器該元素會有哪些變化的方法,這 ...


前面的話

  當我們通過某些行為(點擊、移動或滾動)觸發頁面進行大面積繪製的時候,瀏覽器往往是沒有準備的,只能被動使用CPU去計算與重繪,由於沒有事先準備,應付渲染夠嗆,於是掉幀卡頓。而CSS屬性will-change為web開發者提供了一種告知瀏覽器該元素會有哪些變化的方法,這樣瀏覽器可以在元素屬性真正發生變化之前提前做好對應的優化準備工作。這種優化可以將一部分複雜的計算工作提前準備好,使頁面的反應更為快速靈敏。本文將介紹CSS屬性will-change

 

準備知識

  GPU是圖形處理器,專門處理和繪製圖形相關的硬體。GPU是專為執行複雜的數學和幾何計算而設計的,使得CPU從圖形處理的任務中解放出來,可以執行其他更多的系統任務

  所謂硬體加速,就是在電腦中把計算量非常大的工作分配給專門的硬體來處理,減輕CPU的工作量

  CSS的動畫、變形、漸變並不會自動觸發GPU加速,而是使用瀏覽器稍慢的軟體渲染引擎。在transitiontransformanimation的世界里,應該卸載進程到GPU以加速速度。只有3D變形會有自己的layer,而2D變形則不會

【Hack】

  使用translateZ()translate3d()方法為元素添加沒有變化的3D變形,騙取瀏覽器觸發硬體加速。但是,代價是這種情況通過向它自己的層疊加元素,占用了RAM和GPU的存儲空間,且無法確定空間釋放時間

 

語法

will-change

  功能: 提前通知瀏覽器元素將要做什麼動畫,讓瀏覽器提前準備合適的優化設置

  值: auto | <animateable-feature>

  初始值: auto

  應用於: 所有元素

  繼承性: 無

  相容性: IE13+、chrome49+、safari9.1+、IOS9.3+、Android52+

  auto表示沒有特別指定哪些屬性會變化,瀏覽器需要自己去猜,然後使用瀏覽器經常使用的一些常規方法優化

  <animateable-feature>可以是以下值:

  scroll-position表示開發者希望在不久後改變滾動條的位置或者使之產生動畫

  contents表示開發者希望在不久後改變元素內容中的某些東西,或者使它們產生動畫

  <custom-ident>表示開發者希望在不久後改變指定的屬性名或者使之產生動畫。如果屬性名是簡寫,則代表所有與之對應的簡寫或者全寫的屬性

 

使用

【使用hover】

  不要像下麵這樣直接寫在預設狀態中,因為will-change會一直掛著:

.will-change {
  will-change: transform;
  transition: transform 0.3s;
}
.will-change:hover {
  transform: scale(1.5);
}

  可以讓父元素hover的時候,聲明will-change,這樣,移出的時候就會自動remove,觸發的範圍基本上是有效元素範圍

.will-change-parent:hover .will-change {
  will-change: transform;
}
.will-change {
  transition: transform 0.3s;
}
.will-change:hover {
  transform: scale(1.5);
}

【使用javascript腳本】

.sidebar {
  will-change: transform;
}    

  以上示例在樣式表中直接添加了will-change屬性,會導致瀏覽器將對應的優化工作一直保存在記憶體中,這其實是不必要的。下麵展示如何使用腳本正確地應用will-change屬性

var el = document.getElementById('element');
// 當滑鼠移動到該元素上時給該元素設置 will-change 屬性
el.addEventListener('mouseenter', hintBrowser);
// 當 CSS 動畫結束後清除 will-change 屬性
el.addEventListener('animationEnd', removeHint);
function hintBrowser() {
  // 填寫在CSS動畫中發生改變的CSS屬性名
  this.style.willChange = 'transform, opacity';
}
function removeHint() {
  this.style.willChange = 'auto';
}

【直接使用】

  但是,如果某個應用在按下鍵盤的時候會翻頁,比如相冊或者幻燈片一類,它的頁面很大很複雜,此時在樣式表中寫上will-change是合適的。這會使瀏覽器提前準備好過渡動畫,當鍵盤按下的時候就能即看到靈活輕快的動畫

.slide {
  will-change: transform;
}

 

註意事項

  1、不要將will-change應用到太多元素上:瀏覽器已經儘力嘗試去優化一切可以優化的東西了。有一些更強力的優化,如果與will-change結合在一起的話,有可能會消耗很多機器資源,如果過度使用的話,可能導致頁面響應緩慢或者消耗非常多的資源

  2、有節制地使用:通常,當元素恢復到初始狀態時,瀏覽器會丟棄掉之前做的優化工作。但是如果直接在樣式表中顯式聲明瞭will-change屬性,則表示目標元素可能會經常變化,瀏覽器會將優化工作保存得比之前更久。所以最佳實踐是當元素變化之前和之後通過腳本來切換will-change的值

  3、不要過早應用will-change優化:如果頁面在性能方面沒什麼問題,則不要添加will-change屬性來榨取一丁點的速度。will-change的設計初衷是作為最後的優化手段,用來嘗試解決現有的性能問題。它不應該被用來預防性能問題。過度使用will-change會導致大量的記憶體占用,並會導致更複雜的渲染過程,因為瀏覽器會試圖準備可能存在的變化過程。這會導致更嚴重的性能問題

  4、給它足夠的工作時間:這個屬性是用來讓頁面開發者告知瀏覽器哪些屬性可能會變化的。然後瀏覽器可以選擇在變化發生前提前去做一些優化工作。所以給瀏覽器一點時間去真正做這些優化工作是非常重要的。使用時需要嘗試去找到一些方法提前一定時間獲知元素可能發生的變化,然後為它加上will-change屬性




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

-Advertisement-
Play Games
更多相關文章
  • 我的前面一張文章實現了用css3製作旋轉的效果,現在呢,我換另外一種方法來實現.就是使用js結合css3的方法來實現的.下麵我就先上圖給大家看看效果吧 下麵呢我先放上我的css代碼,代碼很簡單: 上面的代碼大家都看得懂,我就不介紹了.我重點講的是js的代碼部分. 我在這就把相對的難點講一下: ...
  • 按照官網安裝完protractor。 升級webdriver-manager,獲取selenium-server-standalone庫文件以及各種瀏覽器驅動文件。 升級後運行命令啟動webdriver-manager以便提供瀏覽器模擬服務。 運行後會出現錯誤“Error: Invalid or c ...
  • 不好意思,沒有像其他公眾號一樣趕著發文章,每年到這個時候總有一大波什麼今年前端預測,技術框架預測什麼的。我這次寫這篇文針對的對象,是想在今年踏入前端這行的人們,不管你現在是徘徊在門口,還是已經半隻腳踏入這片未知領域,都可以參考一下先行者的經驗。 先來個大概預覽: 項目工程化 發展方向 職業環境 總結 ...
  • 對圖片設置line-height不會垂直居中,而是有一個規律:圖片底部向上距離行高中垂線6px。多行文字未必中垂線對齊,可能是底線對齊。 ...
  • this是面向對象語言中一個重要的關鍵字,理解並掌握該關鍵字的使用對於我們代碼的健壯性及優美性至關重要。而javascript的this又有區別於Java、C#等純面向對象的語言,這使得this更加撲朔迷離,讓人迷惑。this使用到的情況: 1. 純函數2. 對象方法調用3. 使用new調用構造函數 ...
  • CleverTabs是一款jQuery插件,所需jQuery版本:1.6.1,jQuery UI樣式版本:1.8.13;其功能為創建jQuery UI風格的Tab用於顯示iframe。 本示例中符加了jQuery.contextMenu插件,我修改了其樣式,使用了jQuery UI的皮膚 運行一下 ...
  • protractor內代碼的語法是基於ES6的,比如:裡面用到了展開運算符“...”,node.js 6.0以下是不支持該語法特性。 所以,安裝protractor是不會報錯,但運行webdriver-manager的升級就會報那三個點無法識別。 需要將node.js升級到6.0+就能解決該問題。 ...
  • 以管理員身份運行windows PowerShell並安裝Chocolatey 我的機器是windows10,可以在開始菜單->所有應用->W欄中找到Window PowerShell並運行。 在命令行中運行命令: 等待安裝完成,預設會安裝最新版。 安裝後運行命令確認: 我這裡得到的版本回覆: 確認 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...