本人第一次接觸重繪和迴流也是在一次刷題的時候,那麼我就講一下我對重繪和迴流的理解吧
css
1.根據html元素,生成DOM tree
2.根據css樣式表,生成style rules
3.二者結合生成render tree
4.根據位置信息大小等信息,生成layout(迴流)
5.根據顏色等信息,生成pointing(重繪)
6.顯示頁面
那麼咱們瞭解了原理以後,就能看出來幾個簡單的道理,重繪在迴流的後面,那麼發生迴流必定發生重繪,迴流是因爲位置信息產生的,因此位置大小等改變,就會產生迴流,顏色等改變,就會產生重繪
html
因此,迴流必定發生重繪,重繪不必定迴流瀏覽器
瞭解了這些大概就知道爲啥要學習重繪和迴流了吧,減小重繪和迴流的同時能夠優化代碼,減小瀏覽器渲染
優化(減小 迴流/重繪 的次數):
緩存
儘可能一次性修改節點樣式佈局
let el = document.getElementById('test'); // el.style.padding = '5px'; // el.style.borderLeft = '1px'; // el.style.borderRight = '2px'; // 使用 cssText 避免屢次修改 el.style.cssText += 'border-left:1px; border-right:2px; padding:5px'
避免屢次讀取某些屬性學習
將複雜節點元素脫離文檔流 (如:"position:absolute
"),下降回流成本優化
將須要屢次修改的元素設置 "display:none"
,操做完再顯示(上面說起"display:none
"不在render樹內,不觸發迴流重繪)code
批量修改DOM時, 使用DocumentFragment
緩存起來,再一次性插入到指定節點htm
CSS
放在頭部,緣由是渲染(render)須要 DOM(HTML) 和CSSOM(CSS)
,放在頭部有助於縮短首次渲染時間JS
放在尾部,緣由是JS
會阻塞瀏覽器解析,當發現一個外鏈腳本須要下載完後在繼續解析後續的 HTML