頁面的顯示過程分爲如下幾個階段:node
reflow:當render樹的一部分或者所有由於大小邊距等問題發生改變而須要重建的過程,叫作迴流
repaint:當諸如顏色背景等不會引發頁面佈局變化,而只須要從新渲染的過程叫作重繪瀏覽器
經過上述定義,能夠很明顯看出,重繪的代價要比迴流小。重繪只涉及樣式的改變,不涉及到佈局。重繪就好像給人染了一個頭發,而回流至關於給人作了一次整形手術緩存
最複雜的一種:獲取某些屬性,引起迴流 不少瀏覽器會對迴流作優化,他會等到足夠數量的變化發生,在作一次批處理迴流。
可是除了render樹的直接變化。
當獲取一些屬性時,瀏覽器爲了得到正確的值也會觸發迴流。這樣就使得瀏覽器的優化失效了 這些屬性包括app
offsetTop, offsetLeft, offsetWidth, offsetHeight scrollTop/Left/Width/Height, clientTop/Left/Width/Height, width,height 調用了getComputedStyle(), 或者 IE的 currentStyle
這段兒代碼是抄的,哈哈,大概解釋一下樣式改變引發的重繪和迴流佈局
var s = document.body.style; s.padding = "2px"; // 迴流+重繪 s.border = "1px solid red"; // 再一次 迴流+重繪 s.color = "blue"; // 再一次重繪 s.backgroundColor = "#ccc"; // 再一次 重繪 s.fontSize = "14px"; // 再一次 迴流+重繪, 沒想到吧,改變字體大小也會迴流 document.body.appendChild(document.createTextNode('abc!')); // 添加node,再一次 迴流+重繪
能夠看出,迴流必定伴隨着重繪,而重繪卻能夠單獨出現性能
迴流對性能產生了必定的影響,儘管瀏覽器機智地幫咱們進行了批處理,可是仍然存在着上述諸多闊怕的屬性,一獲取就回流。怎麼解決?字體
display:none和visibility:hidden會產生迴流與重繪優化
display:none指的是元素徹底不陳列出來,不佔據空間,涉及到了DOM結構,故產生reflow與repaint visibility:hidden指的是元素不可見但存在,保留空間,不影響結構,故只產生repaint