<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何只使用CSS提升頁面渲染速度

          共 4286字,需瀏覽 9分鐘

           ·

          2021-04-20 22:42

          點擊上方關(guān)注 前端技術(shù)江湖我們一起學習,天天進步


          作者 | Rumesh Eranga Hapuarachchi
          譯者 | 張健欣
          策劃 | 田曉旭
          來源 | 前端之巔

          用戶喜歡快速的 Web 應用。他們期望頁面加載速度快,運行流暢。如果滾動時出現(xiàn)動畫中斷或延遲,用戶很可能就會離開你的網(wǎng)站。作為一名開發(fā)者,你可以做很多事情來提升用戶體驗。本文主要介紹你可以用來提升頁面渲染速度的 4 個 CSS 技巧。

          1. Content-visibility

          一般來說,大部分 Web 應用都有復雜的 UI 元素,并且它的擴展超出了用戶在瀏覽器視圖中所能看到的范圍。在這種情況下,我們可以使用content-visibility來跳過渲染屏幕之外的內(nèi)容。如果你有大量屏幕之外的內(nèi)容的話,這會大大減少頁面渲染時間。

          這個功能是最新添加的功能之一,而且它是提升渲染性能最有影響力的功能之一。content-visibility接受幾個值,我們可以在一個元素上使用content-visibility: auto;來立即獲得性能提升。

          我們可以看下面這個頁面,包含很多顯示不同信息的卡片。雖然屏幕能顯示大約 12 個卡片,但列表中有差不多 375 個卡片。如你所見,瀏覽器花費 1037ms 來渲染這個頁面。

          一般 HTML 頁面

          下一步,你可以向所有的卡片中加入content-visibility

          在這個例子中,向頁面中加入content-visibility后,渲染時間下降到 150ms。性能提升了 6 倍以上。

          使用 content-visibility

          如你所見,content-visibility 的功能很強大,對于改善頁面渲染時間非常有用。根據(jù)我們目前為止討論的內(nèi)容,你一定在想它是針對頁面渲染的靈丹妙藥。

          content-visibility 的限制

          然而,也有一些領(lǐng)域 content-visibility 不適合。我想強調(diào) 2 點供你考慮。

          這個功能還是實驗性的。目前,F(xiàn)irefox(PC 和 Android 版本)、Internet Explorer (我不認為他們計劃向 IE 中添加這個功能) 以及 Safari (Mac 和 iOS) 不支持 content-visibility。

          與滾動條行為相關(guān)的問題。由于元素最初渲染的高度是 0px,當你向下滾動時,這些元素會進入屏幕。實際的內(nèi)容會被渲染,這個元素的高度會被相應地更新。這會使?jié)L動條出現(xiàn)預料之外的行為。

          使用 content-visibility 的滾動行為

          為了修復這個滾動條問題,你可以使用另一個 CSS 屬性,contain-intrinsic-size。它指定了一個元素的自然大小。因此,這個元素會用指定的高度渲染,而不是 0px。
          .element{
              content-visibility: auto;
              contain-intrinsic-size: 200px;
          }

          然而,在實驗時,我發(fā)現(xiàn)即使使用containt-intrinsic-size,如果我們有很多元素都使用content-visibility且設(shè)置為auto,你仍然會有微小的滾動條問題。因此,我的建議是規(guī)劃你的布局,將它分解為幾個部分,然后在那幾個部分上使用 content-visibility 來獲取更好的滾動條行為。

          2.Will-change屬性

          瀏覽器上的動畫并不是一個新鮮事物。通常,這些動畫與其它元素一起正常渲染。然而,瀏覽器現(xiàn)在能夠使用 GPU 來優(yōu)化這些動畫的某些操作。

          使用 will-change CSS 屬性,我們可以表明該元素將要修改特定的屬性,讓瀏覽器提前執(zhí)行必要的優(yōu)化。

          底層發(fā)生的是,瀏覽器會為這個元素創(chuàng)建一個單獨的層。然后,瀏覽器將這個元素的渲染委托給 GPU,以及其它一些優(yōu)化。由于 GPU 加速接管了動畫渲染,最終這個動畫會更流暢。

          考慮如下 CSS 類:
          // In stylesheet
          .animating-element {
            will-change: opacity;
          }
          // In HTML
          <div class="animating-elememt">
            Animating Child elements
          </div>

          當在瀏覽器中渲染上面的代碼時,它會識別出will-change屬性,并優(yōu)化未來與不透明度 opacity 相關(guān)的變更。

          根據(jù) Maximillian Laumeister 所做的性能基準測試,你可以看到他只改變了一行代碼就獲得了超過 120FPS 的渲染速度,而最初的渲染速度大約是 50FPS。

          不使用 will-change;圖片來源:Maximilian

          使用 will-change;圖片來源:Maximilian

          什么時候不要用 will-change

          盡管will-change是用來提升性能的,但如果你誤用它,也會降低 Web 應用的性能。

          使用will-change表明這個元素將來會改變

          因此,如果你試圖將will-change與同步動畫一起使用,它不會給你優(yōu)化。因此,建議在父元素上使用 will-change,在子元素上使用動畫。
          .my-class{
            will-change: opacity;
          }
          .child-class{
            transition: opacity 1s ease-in-out;
          }

          不要使用未設(shè)置動畫的元素。當你在一個元素上使用will-change,瀏覽器會嘗試通過將它放到一個新層中并將轉(zhuǎn)換移交給 GPU 來優(yōu)化它。如果你沒有要轉(zhuǎn)換的東西,這會導致資源浪費。

          最后要記住的是,建議在完成所有動畫之后將 will-change 從元素上刪除。

          3. 減少渲染阻塞時間

          今天,許多 Web 應用必須滿足許多形式因素,包括 PC、平板電腦和移動手機等。為了實現(xiàn)這種響應式特性,我們必須根據(jù)媒介大小編寫新的樣式。在頁面渲染時,直到 CSS 對象模型(CSS Object Model,CSSOM)準備就緒,它才開始渲染階段。根據(jù)你的 Web 應用,你可能有一個很大的樣式表來滿足所有的設(shè)備形式因素。

          然而,假設(shè)我們根據(jù)形式因素將它拆分成多個樣式表。在這種情況下,我們可以只讓主 CSS 文件阻塞關(guān)鍵路徑,并將其優(yōu)先下載,讓其它樣式表以低優(yōu)先級的方式下載。
          <link rel="stylesheet" href="styles.css">

          單個樣式表

          在將它分解成多個樣式表后:
          <!-- style.css contains only the minimal styles needed for the page rendering -->
          <link rel="stylesheet" href="styles.css" media="all" />
          <!-- Following stylesheets have only the styles necessary for the form factor -->
          <link rel="stylesheet" href="sm.css" media="(min-width: 20em)" /><link rel="stylesheet" href="md.css" media="(min-width: 64em)" /><link rel="stylesheet" href="lg.css" media="(min-width: 90em)" /><link rel="stylesheet" href="ex.css" media="(min-width: 120em)" /><link rel="stylesheet" href="print.css" media="print" />


          如你所見,根據(jù)形式因素拆分樣式表能夠減少渲染阻塞時間。

          4. 避免使用 @import 來包含多個樣式表

          使用@import,我們可以在一個樣式表中包含另一個樣式表。當我們在處理一個大型項目時,使用@import會讓代碼更簡潔。

          關(guān)于 @import 的一個關(guān)鍵事實是,它是一個阻塞調(diào)用,因為它必須發(fā)起一個網(wǎng)絡(luò)請求來獲取這個文件,解析它,然后將它包含在樣式表中。如果我們在樣式表中有嵌套的 @import,它會妨礙渲染性能。

          # style.css
          @import url("windows.css");
          # windows.css
          @import url("componenets.css");

          使用 imports 的瀑布圖

          與其使用@import,我們可以使用多個鏈接 link 實現(xiàn)相同的功能且具有更好的性能,因為它允許并行下載樣式表。

          使用鏈接的瀑布圖

              結(jié)論    

          除了本文我們討論的 4 個方面,還有一些其它的方法我們可以使用 CSS 來提高 Web 頁面的性能。CSS 最新的特性之一,content-visibility,在未來幾年看起來很有前景,因為它可以在頁面渲染方面帶來數(shù)倍的性能提升。

          最重要的是,我們不用編寫一句 JavaScript 代碼就可以獲得所有這些性能提升。

          我相信,你可以結(jié)合以上特性,為最終用戶構(gòu)建性能更好的 Web 應用。我希望這篇文章是有用的。謝謝!

          The End

          歡迎自薦投稿到《前端技術(shù)江湖》,如果你覺得這篇內(nèi)容對你挺有啟發(fā),記得點個 「在看」


          點個『在看』支持下 

          瀏覽 83
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  熟女视频大香蕉视频大香蕉视频大香蕉 | 久久黄色精品视频 | 天天综合7799精品视频 | 人人看人人爱人人搞 | 国产乱伦视频小说 |