網頁性能管理是一個很大的話題,最近在複習相關的知識,小結一下。css
網頁生成的過程大體以下:html
HTML
代碼轉化成DOM
CSS
代碼轉化成CSSOM
(CSS Object Model
)DOM
和CSSOM
,生成一棵渲染樹(包含每一個節點的視覺信息)layout
),即將全部渲染樹的全部節點進行平面合成paint
)在屏幕上DOM
樹的解析和渲染由上面的過程咱們能夠看出,在渲染以前,
CSSOM
和DOM
已經生成。web
css
的加載不會阻塞DOM
樹解析,可是會阻塞DOM
樹渲染。要在樣式加載好了以後,纔開始渲染頁面。這是合理的。JS
執行會阻塞DOM
樹的解析和渲染。當引用了JS
的時候,瀏覽器發送1個JS request
就會一直等待該request
的返回。由於瀏覽器須要1個穩定的DOM
樹結構,而JS
中頗有可能有代碼直接改變了DOM
樹結構,好比使用 document.write
或 appendChild
,甚至是直接使用的location.href
進行跳轉,瀏覽器爲了防止出現JS
修改DOM
樹,須要從新構建DOM
樹的狀況,因此,JS
執行會阻塞DOM
樹的解析和渲染。這兩個規則的實質都是提升頁面的性能,避免發生沒必要要的從新渲染。瀏覽器
重排和重繪會不斷觸發,這是不可避免的。可是,它們很是耗費資源,是致使網頁性能低下的根本緣由。緩存
從新渲染,就須要從新生成佈局和從新繪製。前者叫作"重排"(reflow),後者叫作"重繪"(repaint)須要注意的是,"重繪"不必定須要"重排",好比改變某個網頁元素的顏色,就只會觸發"重繪",不會觸發"重排",由於佈局沒有改變。可是,"重排"必然致使"重繪",好比改變一個網頁元素的位置,就會同時觸發"重排"和"重繪",由於佈局改變了性能優化
DOM
的多個讀操做(或多個寫操做),應該放在一塊兒。不要兩個讀操做之間,加入一個寫操做。class
,或者csstext
屬性,一次性地改變樣式。display: none
(須要1次重排和重繪),而後對這個節點進行100次操做,最後再恢復顯示(須要1次重排和重繪)。這樣一來,你就用兩次從新渲染,取代了可能高達100次的從新渲染。position
屬性爲absolute
或fixed
的元素,重排的開銷會比較小,由於不用考慮它對其餘元素的影響。display
屬性爲可見,由於不可見的元素不影響重排和重繪。另外,visibility : hidden
的元素只對重繪有影響,不影響重排.offsetTop
、offsetLeft
、offsetWidth
、offsetHeight
、scrollTop
、scrollLeft
、scrollWidth
、scrollHeight
、clientTop
、clientLeft
、clientWidth
、clientHeight
、getComputedStyle()
(currentStyle in IE)。因此,在屢次使用這些值時應進行緩存。參看文獻app