渲染的流程基本上是這樣(以下圖黃色的四個步驟):1.計算CSS樣式 2.構建Render Tree 3.Layout – 定位座標和大小 4.正式開畫瀏覽器
這裏重要要說兩個概念,一個是Reflow,另外一個是Repaintbash
迴流一定會發生重繪,重繪不必定會引起迴流。重繪和迴流會在咱們設置節點樣式時頻繁出現,同時也會很大程度上影響性能。迴流所需的成本比重繪高的多,改變父節點裏的子節點極可能會致使父節點的一系列迴流。ide
任何會改變元素幾何信息(元素的位置和尺寸大小)的操做,都會觸發迴流,佈局
添加或者刪除可見的DOM元素; 元素尺寸改變——邊距、填充、邊框、寬度和高度 內容變化,好比用戶在input框中輸入文字 瀏覽器窗口尺寸改變——resize事件發生時 計算 offsetWidth 和 offsetHeight 屬性 設置 style 屬性的值性能
for(let i = 0; i < 1000; i++) {
// 獲取 offsetTop 會致使迴流,由於須要去獲取正確的值
console.log(document.querySelector('.test').style.offsetTop)
}
複製代碼
不要使用 table 佈局,可能很小的一個小改動會形成整個 table 的從新佈局動畫
動畫實現的速度的選擇,動畫速度越快,迴流次數越多,也能夠選擇使用 requestAnimationFrameui
CSS 選擇符從右往左匹配查找,避免節點層級過多spa
將頻繁重繪或者回流的節點設置爲圖層,圖層可以阻止該節點的渲染行爲影響別的節點。好比對於 video 標籤來講,瀏覽器會自動將該節點變爲圖層。code