頁面的顯示過程:
1.生成DOM樹(DOM TREE)
2.加載CSS
3.生成渲染樹(RENDER TREE),渲染樹是和樣式相關的
4.瀏覽器基於GPU(顯卡)開始按照RENDER TREE畫頁面
重繪(repaint):
當某一個DOM元素 樣式更改 (位置沒變只是樣式更改,例如:顏色變為紅色…)瀏覽器會重新渲染這個元素
例子:
box.style.color = 'red'
box.style.fontsize = '16px'
上面操作觸發了兩次重繪,性能上有所消耗,為了優化性能,我們最好一次性把需要修改的樣式搞定,例如:
.xxx{
color:'red',
font-size:'16px'
}
box.className = 'xxx'
迴流(reflow)
1.頁面首次渲染
2.當DOM元素的結構或者位置發生改變(刪除、增加、改變位置、改變大小…)
3.獲取某些屬性也會引起迴流
都會引發迴流,所謂迴流,就是瀏覽器拋棄原有計算的結構和樣式,從新進行DOM TREE或者RENDER TREE,非常非常非常…消耗性能
解決方案
1.避免頻繁操作樣式:一次性把需要修改的樣式搞定
2.避免頻繁操作DOM:
基於文檔碎片(虛擬內存中開闢的一個容器)可以解決這個問題:每當創建一個LI,我們首先把它存在文檔碎片中(千萬不要放在頁面中,避免迴流),當我們把需要的元素都創建完成,並且都添加到文檔碎片中,在統一把文檔碎片放到頁面中(只會引發一次迴流操作)
let frg = document.createDocumentFragment();// 創建文檔碎片容器