瀏覽器主要組成
瀏覽器是多進程的,一個頁面從請求到渲染,是多個進程在同時進行,這些進程主要由如下的組件產生。css
瀏覽器主要組成:html
- 用戶界面(The user interface)
- 瀏覽器引擎(The browser engine)
- 渲染引擎(The rendering engine)
- 網絡(Networking)
- UI 後端繪製(UI backend)
- js 解析器(JavaScript interpreter)
- 數據存儲(Data storage)
渲染引擎
渲染引擎主要渲染 html 、css 、圖片 等內容。不一樣瀏覽器的渲染機制有差別。html5
渲染步驟
瀏覽器渲染網頁的過程,主要有如下幾個步驟web
- 解析HTML,生成 DOM 樹
- 構建 DOM 樹:此時只有形狀和顏色等屬性
- 渲染樹結構:給每一個節點都加上座標,構成顯示佈局
- 繪製樹:給節點加上 UI 樣式,進行繪製顯示
下圖是 webkit 內核(chrome) 的渲染流程:chrome
重繪和重排
- 重繪:當元素外觀的改變時觸發。如改變vidibility、outline、背景色等屬性。
- 重排/迴流:當元素的位置和幾何信息改變時觸發。如改變窗口大小、元素的width、height、position 等。
重排處於layout階段、重繪處於paint階段,越往前損耗越高,因此重排會比重繪要消耗性能。segmentfault
注意:重排必定會觸發重繪,而重繪不必定會重排。
後端
重繪(repaint)
1. 致使 repaint 的操做:
- 全部改變元素外觀的操做:color、background、box-shadow 等。
2. 常見的引發 repaint 的元素
常見 repaint 元素 |
|
|
|
color |
border-style |
visibility |
background |
text-decoration |
background-image |
background-position |
background-repeat |
outline-color |
outline |
outline-style |
border-radius |
outline-width |
box-shadow |
background-size |
|
重排/迴流(reflow)
一、致使 reflow 的操做:
- 改變窗口大小
- 改變文字大小
- 添加/刪除樣式表
- 內容的改變,(用戶在輸入框中寫入內容也會)
- 激活僞類,如:hover
- 操做class屬性
- 腳本操做DOM
- 計算offsetWidth和offsetHeight
- 設置style屬性
- ...
二、常見的引發的 reflow 元素
常見 reflow 元素 |
|
|
|
width |
height |
padding |
margin |
display |
border-width |
border |
top |
position |
font-size |
float |
text-align |
font-family |
line-height |
vertical-align |
right |
clear |
white-space |
bottom |
min-height |
三、如何減小重排?
- 不要一條一條地修改 DOM 的樣式,預先定義好 class,而後修改 DOM 的 className
- 把 DOM 離線後修改,好比:先把 DOM 給 display:none (有一次 Reflow),而後你修改100次,而後再把它顯示出來
- 不要把 DOM 結點的屬性值放在一個循環裏當成循環裏的變量
- 儘量不要修改影響範圍比較大的 DOM
- 爲動畫的元素使用絕對定位 absolute / fixed
- 不要使用 table 佈局,可能很小的一個小改動會形成整個 table 的從新佈局
參考文章:瀏覽器