什么是回流(重排 reflow)?
回流(重排 reflow):對DOM樹進行渲染,只要修改DOM或修改元素的形狀大小,就會觸發reflow,reflow的時候,瀏覽器會使已渲染好受到影響的部分失效,並重新構造這部分,完成reflow后,瀏覽器會重新繪制受影響的部分到屏幕中
(繼昨日每日一題:display:none和visibility:hidden 當display顯示及隱藏元素時,顯示時占據空間,隱藏時不占空間,隱藏前后DOM結構發生變化,所以需要重新渲染 當visibility顯示及隱藏元素時,不論是顯示還是隱藏,都占據空間,因此隱藏前后DOM結構未發生變化,所以不需要重新渲染。)
什么是重繪(repaint)?
重繪(repaint):當我們對DOM的修改導致的樣式變化,但未影響幾何屬性時,瀏覽器不需要重新計算元素的幾何屬性,直接可以為該元素繪制新的樣式,跳過了回流環節,這個過程就叫重繪。
結論:回流必定會發生重繪,重繪不一定發生回流
在頁面交互中存在頻繁的回流與重繪,這個過程,會很大程度的影響性能,因為回流所需成本比重繪高的多,so,能用重繪就不要用回流了。
如何減少回流、重繪?
減少回流、重繪就是減少對DOM的操作
1.直接改變className,如果動態改變樣式,則使用cssText(減少設置多項內聯樣式)
2.讓要操作的元素進行“離線處理”,處理完后一起更新
當使用DocumentFragment進行緩存操作,引發一次回流和重繪
使用display:none 技術,只引發兩次回流和重繪
使用cloneNode(true or false)和replaceChild技術,引發一次回流和重繪
3.不要經常訪問會引起瀏覽器flush隊列的屬性,如果你確實要訪問,利用緩存
4.讓元素脫離動畫流,減少render 樹的規模
5.犧牲平滑度換取速度
6.避免使用table布局
7.IE中避免使用javascript表達式