99久久精品国产片-99久久精品国产免费-99久久精品国产麻豆-99久久精品国产国产毛片-99久久精品国产高清一区二区-99久久精品费精品国产一区二区

你真的了解重排和重繪嗎?

2020-4-11    前端達人

做過前端開發的小伙伴就算不是非常理解重排與重繪,但是肯定都聽過這兩個詞。那為什么這兩個東西這么重要?因為他與我們的頁面性能息息相關,今天,我們就來好好研究一下這兩個東西。



瀏覽器的渲染流程

在講解重排和重繪之前,我們有必要說一下瀏覽器的渲染流程。下面是瀏覽器渲染過程中最關鍵的幾個部分。如果想了解完整的瀏覽器渲染流程,推薦大家去閱讀李兵老師的瀏覽器工作原理實踐,需要付費閱讀。后期我也會整理一下再出一篇博客詳細介紹瀏覽器的渲染過程。


點擊查看原圖


JavaScript:一般來說,我們會使用 JavaScript 來實現一些視覺變化的效果。比如用 jQuery 的 animate 函數做一個動畫、對一個數據集進行排序或者往頁面里添加一些 DOM 元素等。當然,除了 JavaScript,還有其他一些常用方法也可以實現視覺變化效果,比如:CSS Animations、Transitions 和 Web Animation API。
樣式計算:此過程是根據匹配選擇器(例如 .headline 或 .nav > .nav__item)計算出哪些元素應用哪些 CSS 規則的過程。從中知道規則之后,將應用規則并計算每個元素的最終樣式。
布局:在知道對一個元素應用哪些規則之后,瀏覽器即可開始計算它要占據的空間大小及其在屏幕的位置。網頁的布局模式意味著一個元素可能影響其他元素,例如 元素的寬度一般會影響其子元素的寬度以及樹中各處的節點,因此對于瀏覽器來說,布局過程是經常發生的。
繪制:繪制是填充像素的過程。它涉及繪出文本、顏色、圖像、邊框和陰影,基本上包括元素的每個可視部分。繪制一般是在多個表面(通常稱為層)上完成的。
合成:由于頁面的各部分可能被繪制到多層,由此它們需要按正確順序繪制到屏幕上,以便正確渲染頁面。對于與另一元素重疊的元素來說,這點特別重要,因為一個錯誤可能使一個元素錯誤地出現在另一個元素的上層。
其中,重排和重繪影響的就是其中的布局和繪制過程。

什么是重排和重繪制
重排:當DOM的變化引發了元素幾何屬性的變化,比如改變元素的寬高,元素的位置,導致瀏覽器不得不重新計算元素的幾何屬性,并重新構建渲染樹,這個過程稱為“重排”。
重繪:完成重排后,要將重新構建的渲染樹渲染到屏幕上,這個過程就是“重繪”。
簡單來說,涉及元素的幾何更新時,叫重排。而只涉及樣式更新而不涉及幾何更新時,叫重繪。對于兩者來說,重排必定引起重繪,但是重繪并不一定引起重排。所以,當涉及重排時,瀏覽器會將上述的步驟再次執行一遍。當只涉及重繪時,瀏覽器會跳過Layout步驟,即:


點擊查看原圖


而如果既不需要重排,也不需要重繪,那么就是下面這樣:


點擊查看原圖



瀏覽器會直接跳到合成階段。顯然,對于頁面性能來說,不重排也不重繪 > 重繪 > 重排。

什么操作會引起重排和重繪
顯然,觸發重排的一般都是幾何因素,這是比較好理解的:

頁面第一次渲染 在頁面發生首次渲染的時候,所有組件都要進行首次布局,這是開銷最大的一次重排
瀏覽器窗口尺寸改變
元素位置和尺寸發生改變的時候
新增和刪除可見元素
內容發生改變(文字數量或圖片大小等等)
元素字體大小變化
還有其他一些操作也可能引發重排

查詢某些屬性或調用某些方法
offset(Top|Left|Width|Height)
scroll(Top|Left|Width|Height)
client(Top|Left|Width|Height)
getComputedStyle()
我們可能不太理解為什么這些操作也能引起重排,這里我先簡單解釋一下。因為現在的瀏覽器已經非常完善了,會自動幫我們做一些優化。當我們用js操作DOM的時候,瀏覽器并不是立馬執行的,而是將操作存儲在一個隊列中。當達到一定數量或者經過一定時間以后瀏覽器再統一的去執行隊列中的操作。那么回到我們剛才的問題,為什么查詢這些屬性也會導致重排?因為當你查詢這些屬性時,瀏覽器就會強制刷新隊列,因為如果不立馬執行隊列中的操作,有可能得到的結果就是錯誤的。所以相當于你強制打斷了瀏覽器的優化流程,引發了重排。下面我們通過一些小例子來進一步理解這段話:

首先我們來一個顯然會引發重排的操作

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    #test {
      width: 100px;
      height: 100px;
      background-color: red;
      position: relative;
    }
  </style>
</head>
<body>
  <div id="test">

  </div>
  <button onclick="reflow()">click</button>
  <script>
    function reflow() {
      var div = document.querySelector("#test");
      div.style.left = '200px';
    }
  </script>
</body>
</html>



把時間軸往后拉,可以看到這幾個過程,先簡單介紹一些這些名詞代表的含義:

Recalculate Style:這個過程就是生成CSSOM的過程
Layout:這就是布局階段,即重排的過程
Update Layer Tree:這個階段是更新層樹的過程
Paint:該階段是為每一層準備繪制列表的過程
Composite Layers:該階段是利用繪制列表來生成相應圖層的位圖了,還涉及到合成線程和光柵化,performence面板中的Raster就是光柵化線程池 。
這里只做一個簡單的介紹,對其中內容不太明白的同學可以參考李兵老師的文章或者在我的下一篇介紹瀏覽器渲染過程的文章中會詳細解釋。

那通過這個圖我們可以看到,我們改變了div的left之后就觸發了Layout,即重排的過程。下面我們僅改變div的背景顏色,給大家一個對比。


即不重排也不重繪
說完了重排和重繪,不要忘記我們最開始提到的,最的方式就是跳過重排和重繪階段。你可能會想,什么情況下可以做到這一點?其實這就是我們平時說的GPU加速,具體是如何實現呢?在開發過程中,如果我們使用了某些屬性,瀏覽器會幫助我們將使用了該屬性的div提升到一個單獨的合成層,而在后面的渲染中,提升到該層的div將跳過重排和重繪的操作,直接到合成階段。在stack overflow上有問題提到了這塊內容。我們翻譯一下就是:
下面幾個屬性能讓瀏覽器幫助我們將div提升到一個單獨的合成層:

圖層具有3D或透視變換CSS屬性
使用加速視頻解碼的 video 元素
擁有 3D(WebGL) 上下文或者加速 2D 上下文的 canvas 元素
混合插件(Flash)
對自己的 opacity 做 CSS 動畫或使用一個動畫 webkit 變換的元素
圖層使用加速的CSS過濾器
層具有作為合成層的后代
圖層具有較低z索引的同級元素,該同級元素具有合成層(換句話說,該層在合成層的頂部渲染)
css will-change屬性
最后一點是我加上去的,同時根據文中的內容我們可以知道,css3硬件加速是瀏覽器的行為,所以在不同瀏覽器下可能會有不同的表現形式。下面我們用一個例子來理解一下。這是李兵老師在他的專欄中提出的一個例子,我拿過來借用一下,注意box中的will-change屬性:

<html>

  <head>
      <title>觀察will-change</title>
      <style>
          .box {
              will-change: transform, opacity;
              display: block;
              float: left;
              width: 40px;
              height: 40px;
              margin: 15px;
              padding: 10px;
              border: 1px solid rgb(136, 136, 136);
              background: rgb(187, 177, 37);
              border-radius: 30px;
              transition: border-radius 1s ease-out;
          }

          body {
              font-family: Arial;
          }
      </style>
  </head>

  <body>
      <div id="controls">
          <button id="start">start</button>
          <button id="stop">stop</button>
      </div>
      <div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
          <div class="box">旋轉盒子</div>
      </div>
      <script>

          let boxes = document.querySelectorAll('.box');
          let boxes1 = document.querySelectorAll('.box1');
          let start = document.getElementById('start');
          let stop = document.getElementById('stop');
          let stop_flag = false

          start.addEventListener('click', function () {
              stop_flag = false
              requestAnimationFrame(render);
          })

          stop.addEventListener('click', function () {
              stop_flag = true
          })

          let rotate_ = 0
          let opacity_ = 0
          function render() {
              if (stop_flag)
                  return 0
              rotate_ = rotate_ + 6
              if (opacity_ > 1)
                  opacity_ = 0
              opacity_ = opacity_ + 0.01
              let command = 'rotate(' + rotate_ + 'deg)';
              for (let index = 0; index < boxes.length; index++) {
                  boxes[index].style.transform = command
                  boxes[index].style.opacity = opacity_
              }
              requestAnimationFrame(render);
          }
      </script>
  </body>

  </html>



————————————————
版權聲明:本文為CSDN博主「溪寧」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_38164763/article/details/105406580

日歷

鏈接

個人資料

藍藍設計的小編 http://www.lapeinture.cn

存檔

精品国产一区二区三区久| 中文字幕Aⅴ资源网| 国产原创视频在线| 午夜激情视频在线播放| 欧美1区| 高清一级做a爱过程不卡视频| 久久久久久久免费视频| 香蕉视频久久| 国产伦精品一区三区视频| 91麻豆国产福利精品| 中文字幕一区二区三区精彩视频 | 日本免费区| 日韩字幕在线| 国产视频一区二区在线观看| 久久99中文字幕| 欧美18性精品| 亚洲 激情| 99热热久久| 四虎影视久久| 二级特黄绝大片免费视频大片| 久久福利影视| 国产伦久视频免费观看 视频 | 美女被草网站| 色综合久久天天综合绕观看| 日日日夜夜操| 一本伊大人香蕉高清在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 久草免费资源| 高清一级片| 精品久久久久久免费影院| 成人免费网站久久久| 欧美激情一区二区三区视频| 午夜久久网| 日本乱中文字幕系列| 天天色色色| 欧美一区二区三区在线观看| 韩国毛片免费| 可以免费在线看黄的网站| 国产一级生活片| 成人a大片高清在线观看| 久久99青青久久99久久| 四虎影视库国产精品一区| 精品国产一区二区三区国产馆| 国产不卡在线播放| 国产网站免费视频| 黄视频网站免费| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产视频久久久| 在线观看导航| 亚洲精品影院| 欧美激情一区二区三区视频高清| 精品视频免费观看| 午夜久久网| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 色综合久久手机在线| 毛片成人永久免费视频| 中文字幕97| 国产亚洲男人的天堂在线观看| 色综合久久天天综合观看| 国产美女在线观看| 欧美一级视频免费观看| 免费一级片在线观看| 久草免费在线色站| 亚洲第一色在线| 999精品在线| 日韩男人天堂| 亚洲精品中文字幕久久久久久| 国产精品12| 成人高清护士在线播放| 成人a大片在线观看| 一级女人毛片人一女人| 国产精品自拍在线观看| 精品视频在线观看视频免费视频| 日韩中文字幕在线观看视频| 一本高清在线| 四虎论坛| 91麻豆爱豆果冻天美星空| 毛片高清| 国产不卡在线观看| 99久久精品国产麻豆| 国产一区二区精品久久91| 成人免费网站视频ww| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品毛片视频| 精品视频免费观看| 欧美1区| 久久成人性色生活片| 国产a免费观看| 在线观看导航| 九九热精品免费观看| 精品视频一区二区三区| 欧美一区二区三区在线观看| 99久久网站| 亚洲女人国产香蕉久久精品 | 国产一级生活片| 国产视频久久久久| 欧美一级视| 九九久久国产精品| 黄色免费三级| 你懂的福利视频| 成人高清免费| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久99青青久久99久久| 精品视频免费在线| 美女免费黄网站| 四虎久久精品国产| 国产一区二区精品久久91| 国产一区二区精品在线观看| 99久久精品国产片| 国产视频一区二区在线观看| 日韩专区在线播放| 精品美女| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美日本二区| 日日日夜夜操| 久久精品店| 欧美一级视| 天天做日日爱夜夜爽| 日本伦理网站| 精品国产香蕉在线播出| 欧美激情影院| 国产国语在线播放视频| 午夜在线亚洲| 日本在线www| a级黄色毛片免费播放视频 | 国产原创视频在线| 成人免费一级毛片在线播放视频| 你懂的福利视频| 精品视频在线观看一区二区三区| 欧美激情一区二区三区视频| 日韩在线观看视频黄| 天天色色网| 国产高清在线精品一区二区| 99久久精品国产片| 国产一区二区精品久久91| 欧美a级片视频| 天天做日日爱| 亚洲精品中文字幕久久久久久| 国产一区精品| 日韩免费在线观看视频| 日韩在线观看免费完整版视频| 日本特黄特黄aaaaa大片| 精品国产亚洲一区二区三区| 尤物视频网站在线观看| 你懂的日韩| 精品久久久久久中文字幕一区 | 欧美激情中文字幕一区二区| 成人a大片在线观看| a级毛片免费全部播放| 午夜家庭影院| 亚欧成人毛片一区二区三区四区| 夜夜操网| 亚洲精品影院| 欧美另类videosbestsex高清| 精品国产香蕉伊思人在线又爽又黄| 国产福利免费视频| 午夜激情视频在线播放| 色综合久久天天综合绕观看| 日韩免费在线观看视频| 欧美a级成人淫片免费看| 久久国产精品自由自在| 午夜精品国产自在现线拍| 色综合久久天天综合观看| 香蕉视频久久| 九九免费高清在线观看视频| 四虎久久精品国产| 久久精品大片| 色综合久久久久综合体桃花网| 韩国妈妈的朋友在线播放| 天天做人人爱夜夜爽2020| 国产伦久视频免费观看 视频 | 精品视频在线看 | 国产一区精品| 欧美激情一区二区三区视频 | 国产a视频| 久久福利影视| 免费一级片网站| 午夜欧美福利| 欧美电影免费| 免费毛片播放| 欧美a级成人淫片免费看| 日韩中文字幕一区二区不卡| 国产韩国精品一区二区三区| 青青久热| a级黄色毛片免费播放视频 | 你懂的在线观看视频| 青青青草影院 | 久久久久久久免费视频| 午夜在线亚洲| 麻豆网站在线看| 亚洲女人国产香蕉久久精品 | 国产成a人片在线观看视频| 国产成人精品综合在线| 高清一级片| 国产高清视频免费| 成人a大片高清在线观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美a免费| 成人免费观看的视频黄页| 精品久久久久久中文字幕一区 |