<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## CSS解析,構建CSSOM ### 生成CSS規則 同理,CSS規則樹的生成也是類似。簡述為: ``` Bytes → characters → tokens → nodes → CSSOM ``` 譬如`style.css`內容如下: ``` body { font-size: 16px } p { font-weight: bold } span { color: red } p span { display: none } img { float: right } ``` 那么最終的CSSOM樹就是: ![img](http://xiaoyulive.oss-cn-beijing.aliyuncs.com/date/2018-03-29/browser_parse_cssom.png) ### 構建渲染樹 當DOM樹和CSSOM都有了后,就要開始構建渲染樹了 一般來說,渲染樹和DOM樹相對應的,但不是嚴格意義上的一一對應 因為有一些不可見的DOM元素不會插入到渲染樹中,如head這種不可見的標簽或者`display: none`等 整體來說可以看圖: ![img](http://xiaoyulive.oss-cn-beijing.aliyuncs.com/date/2018-03-29/browser_parse_rendertree.png) ### 渲染 有了render樹,接下來就是開始渲染,基本流程如下: ![img](http://xiaoyulive.oss-cn-beijing.aliyuncs.com/date/2018-03-29/browser_rendingprocess.jpg) 圖中重要的四個步驟就是: ``` 1. 計算CSS樣式 2. 構建渲染樹 3. 布局,主要定位坐標和大小,是否換行,各種position overflow z-index屬性 4. 繪制,將圖像繪制出來 ``` 然后,圖中的線與箭頭代表通過js動態修改了DOM或CSS,導致了重新布局(Layout)或渲染(Repaint) 這里Layout和Repaint的概念是有區別的: - Layout,也稱為Reflow,即回流。一般意味著元素的內容、結構、位置或尺寸發生了變化,需要重新計算樣式和渲染樹 - Repaint,即重繪。意味著元素發生的改變只是影響了元素的一些外觀之類的時候(例如,背景色,邊框顏色,文字顏色等),此時只需要應用新樣式繪制這個元素就可以了 回流的成本開銷要高于重繪,而且一個節點的回流往往回導致子節點以及同級節點的回流, 所以優化方案中一般都包括,盡量避免回流。 **什么會引起回流?** 1. 頁面渲染初始化 2. DOM結構改變,比如刪除了某個節點 3. render樹變化,比如減少了padding 4. 窗口resize 5. 最復雜的一種:獲取某些屬性,引發回流, 很多瀏覽器會對回流做優化,會等到數量足夠時做一次批處理回流, 但是除了render樹的直接變化,當獲取一些屬性時,瀏覽器為了獲得正確的值也會觸發回流,這樣使得瀏覽器優化無效,包括 (1)offset(Top/Left/Width/Height) (2) scroll(Top/Left/Width/Height) (3) cilent(Top/Left/Width/Height) (4) width, height (5) 調用了getComputedStyle()或者IE的currentStyle **回流一定伴隨著重繪,重繪卻可以單獨出現** 所以一般會有一些優化方案,如: - 減少逐項更改樣式,最好一次性更改style,或者將樣式定義為class并一次性更新 - 避免循環操作dom,創建一個documentFragment或div,在它上面應用所有DOM操作,最后再把它添加到window.document - 避免多次讀取offset等屬性。無法避免則將它們緩存到變量 - 將復雜的元素絕對定位或固定定位,使得它脫離文檔流,否則回流代價會很高 **注意:改變字體大小會引發回流** 再來看一個示例: ```js var s = document.body.style; s.padding = "2px"; // 回流+重繪 s.border = "1px solid red"; // 回流+重繪 s.color = "blue"; // 重繪 s.backgroundColor = "#ccc"; // 重繪 s.fontSize = "14px"; // 回流+重繪 // 添加node 回流+重繪 document.body.appendChild(document.createTextNode('abc!')); ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看