剛入行前端的時候是否是常常看到有文章說盡可能不要用CSS通配符*,CSS選擇器層疊最好不要超過三層,HTML少使用table,結構也要儘可能簡單一些...這一切說的不無道理,過多的使用確實會形成瀏覽器渲染的性能下降,當你認識了reflow和repaint以後,你會發現這些還真不能用太多。前端
不一樣的瀏覽器渲染過程實際上並不相同(由渲染引擎決定),可是依舊存在一致的部分,大體過程以下圖:瀏覽器
其實在上面瀏覽器渲染過程當中的第三步和第四步分別就是迴流(reflow)和重繪(repaint)。當第一次打開一個頁面時,至少會有一次迴流和重繪。以後,若是渲染樹發生了變更,那麼可能會觸發迴流或重繪中的一個或兩者。緩存
迴流:若是渲染樹的節點發生告終構性變化,例如寬高、位置、隱藏上有變化時,那麼就會觸發一次迴流
重繪:若是渲染樹的節點發生了非結構性變化,例如背景色、顏色、字體上有變化時,那麼就會觸發一次重繪佈局
迴流必將引發重繪,而重繪不必定會引發迴流。迴流的成本比重繪的成本要高得多,由於一個節點的迴流頗有可能致使子結點,父節點回流。性能
現代瀏覽器會對迴流作優化,它會等到足夠數量的變化發生,再作一次批處理迴流。可是當獲取某些屬性時,瀏覽器爲了得到正確的值也會提早觸發迴流,這樣就使得瀏覽器的優化失效了,這些屬性包括offsetLeft、offsetTop、offsetWidth、offsetHeight、 scrollTop/Left/Width/Height、clientTop/Left/Width/Height、調用了getComputedStyle()或者IE的currentStyle字體
迴流和重繪是不可避免的,咱們只能說將它們對性能的影響減到最小,既然咱們知道什麼狀況會觸發它們,那就從這些方面入手:優化
讓須要改變的元素進行「離線處理」,處理完後一塊兒更新動畫
總之,在之後的開發中咱們要儘可能避免大量、頻繁的操做DOM元素,由於DOM操做的代價實在是太昂貴了(這也是Virtual DOM應運而生的緣由)。在書寫HTML時要避免沒必要要的層級,書寫CSS時避免嵌套過深、規則過於複雜,尤爲是後代選擇器,匹配選擇器也會耗費更多的CPU。spa