瀏覽器如何渲染頁面?

来源:https://www.cnblogs.com/jnshu/archive/2018/12/13/10114993.html
-Advertisement-
Play Games

這裡是修真院前端小課堂,每篇分享文從 【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】 八個方面深度解析前端知識/技能,本篇分享的是: 【瀏覽器如何渲染頁面?】 一、背景介紹瀏覽器是前端工程師或頁面重構師工作中必不可少的,WEB頁面運行在各種各樣的瀏覽 ...


這裡是修真院前端小課堂,每篇分享文從

【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】

八個方面深度解析前端知識/技能,本篇分享的是:

【瀏覽器如何渲染頁面?】

 
一、背景介紹
瀏覽器是前端工程師或頁面重構師工作中必不可少的,WEB頁面運行在各種各樣的瀏覽器當中,瀏覽器載入、渲染頁面的速度直接影響著用戶體驗,特別是瀏覽器渲染頁面的原理,頁面渲染就是瀏覽器將HTML代碼根據CSS定義的規則顯示在瀏覽器視窗中的這個過程,理解了原理就更會容易理解前端優化的一些準則。

二、知識剖析
2.1 reflow(迴流)

說到頁面為什麼會慢?那是因為瀏覽器要花時間、花精力去渲染,尤其是當它發現某個部分發生了點變化影響了佈局,需要倒回去重新渲染, 該過程稱為reflow(迴流)。

reflow幾乎是無法避免的。現在界面上流行的一些效果,比如樹狀目錄的摺疊、展開(實質上是元素的顯 示與隱藏)等,都將引起瀏覽器的reflow。滑鼠滑過、點擊……只要這些行為引起了頁面上某些元素的占位面積、定位方式、邊距等屬性的變化,都會引起它內部、周圍甚至整個頁面的重新渲 染。通常我們都無法預估瀏覽器到底會reflow哪一部分的代碼,它們都彼此相互影響著。

2.2 repaint(重繪)

如果只是改變某個元素的背景色、文 字顏色、邊框顏色等等不影響它周圍或內部佈局的屬性,將只會引起瀏覽器repaint(重繪)。repaint的速度明顯快於reflow(在IE下需要換一下說法,reflow要比repaint更緩慢)。

下麵是一個打開Wikipedia時的Layout/reflow的視頻(註:HTML在初始化的時候也會做一次reflow,叫intial reflow),你可以感受一下:視頻

三、常見問題
瀏覽器如何渲染頁面?

四、解決方案
4.1瀏覽器工作大流程

先看圖

 

 

1)瀏覽器會解析三個東西:

一個是HTML/SVG/XHTML,事實上,Webkit有三個C++的類對應這三類文檔。解析這三種文件會產生一個DOM Tree。

CSS,解析CSS會產生CSS規則樹。

Javascript,腳本,主要是通過DOM API(Application Programming Interface)和CSSOM(CSS對象模型) API來操作DOM Tree和CSS Rule Tree.

2)解析完成後,瀏覽器引擎會通過DOM Tree和CSS Rule Tree來構造Rendering Tree。註意:

Rendering Tree渲染樹並不等同於DOM樹,因為一些像Header或display:none的東西就沒必要放在渲染樹中了。CSS的Rule Tree主要是為了完成匹配並把CSS Rule附加上Rendering Tree上的每個Element。也就是DOM結點。也就是所謂的Frame。然後,計算每個Frame(也就是每個Element)的位置,這又叫layout和reflow過程。

3)最後通過調用操作系統Native GUI的API繪製。

4.2 DOM解析

 

 

上面這段HTML會解析成這樣:

 

 

下麵是另一個有SVG標簽的情況:

 

 

4.3 CSS解析

CSS的解析大概是下麵這個樣子(下麵主要說的是Firefox的玩法),假設我們有下麵的HTML文檔:

 

 

於是DOM Tree是這個樣子

 

然後我們的CSS文檔是這樣的:

/* rule 1 */ doc { display: block; text-indent: 1em; }

/* rule 2 */ title { display: block; font-size: 3em; }

/* rule 3 */ para { display: block; }

/* rule 4 */ [class="emph"] { font-style: italic; }

於是我們的CSS Rule Tree會是這個樣子:

 

 

註意:CSS匹配HTML元素是一個相當複雜和有性能問題的事情。所以,你就會在N多地方看到很多人都告訴你,DOM樹要小,CSS儘量用id和class,千萬不要過渡層疊下去,……

通過這兩個樹,我們可以得到一個叫Style Context Tree,也就是下麵這樣(把CSS Rule結點Attach到DOM Tree上):

 

 

所以,Firefox基本上來說是通過CSS解析 生成CSS Rule Tree,然後,通過比對DOM生成Style Context Tree,然後Firefox通過把Style Context Tree和其Render Tree(Frame Tree)關聯上,就完成了。註意:Render Tree會把一些不可見的結點去除掉。而Firefox中所謂的Frame就是一個DOM結點,不要被其名字所迷惑了。

 

 

4.4渲染

渲染的流程基本上如下(黃色的四個步驟):

1)計算CSS樣式;2)構建Render Tree;3)Layout –定位坐標和大小,是否換行,各種position, overflow, z-index屬性……;4)正式開畫;

 

註意:上圖流程中有很多連接線,這表示了Javascript動態修改了DOM屬性或是CSS屬會導致重新Layout,有些改變不會,就是那些指到天上的箭頭,比如,修改後的CSS rule沒有被匹配到,等。

5.編碼實戰
詳見視頻

 

點擊這裡

六、擴展思考
1.影響頁面渲染速度主要因素有哪些?

reflow(迴流)和repaint(重繪)

2.哪些情況下會導致reflow發生?

改變窗囗大小;改變文字大小;添加/刪除樣式表;內容的改變,如用戶在輸入框中敲字;激活偽類,如:hover (IE里是一個兄弟結點的偽類被激活);操作class屬性;腳本操作DOM;計算offsetWidth和offsetHeight;設置style屬性。

3.如何避免reflow(迴流)?

reflow是不可避免的,只能將reflow對性能的影響減到最小。

1.儘可能限制reflow的影響範圍。需要改變元素的樣式,不要通過父級元素影響子元素。最好直接加在子元素上。

2.通過設置style屬性改變結點樣式的話,每設置一次都會導致一次reflow。所以最好通過設置class的方式。

3.減少不必要的DOM層級(DOM depth)。改變DOM樹中的一級會導致所有層級的改變,上至根部,下至被改變節點的子節點。這導致大量時間耗費在執行reflow上面。

4.避免不必要的複雜的CSS選擇器,尤其是後代選擇器(descendant selectors),因為為了匹配選擇器將耗費更多的CPU。

七、參考文獻
參考一:瀏覽器的渲染原理簡介

參考二:為什麼每個前端開發者都要理解網頁渲染?

八、更多討論
1.提高瀏覽器性能的方法還有哪些?

2.瀏覽器的主要功能有哪些?

3.哪款瀏覽器的綜合性能最優?

 

 

“我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,學習的路上不再迷茫。

這裡是技能樹.IT修真院:http://www.jnshu.com,初學者轉行到互聯網行業的聚集地。"

歡迎加IT交流群565734203與大家一起討論交流

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概念 Webpack是一個模塊打包機,它可以將我們項目中的所有js、圖片、css等資源,根據其入口文件的依賴關係,打包成一個能被瀏覽器識別的js文件。能夠幫助前端開發將打包的過程更智能化和自動化。 WebPack和Grunt以及Gulp相比有什麼特性 WebPack和Grunt以及Gulp相比有什麼 ...
  • 一、關於選擇器的命名 W3C CSS2.1的 4.1.3 節中提到:標識符(包括選擇器中的元素名,類和ID)只能包含字元[a- zA-Z0-9]和ISO 10646字元編碼U+00A1及以上,再加連字型大小(-)和下劃線(_);它們不能以 數字,或一個連字型大小後跟數字為開頭。它們還可以包含轉義字元加任何I ...
  • 今天工作中使用了這個,感覺很好用啊! 首先: 這個ReactDom是幹嘛用的? 答: react-dom 包提供了 DOM 特定的方法,可以在你的應用程式的頂層使用,如果你需要的話,也可以作為 React模型 之外的特殊操作DOM的介面。 但大多數組件應該不需要使用這個模塊。 其次: 如何引用? 答 ...
  • 首先我們先來林格斯雙擊翻譯一下: split 劈開, 使分裂; splice 接合; 使結合; slice 切成薄片, 切; 我先是這麼區分的:這三個方法最後一個字母是t的是字元串方法,是e的則是數組方法(當然字元串也有slice方法)。 split 是將字元串用符號分割。返回數組。 參數一:指定字 ...
  • 本文主要介紹了vue-router相關基礎知識及單頁面應用的工作原理,寫的十分的全面細緻,具有一定的參考價值,對此有需要的朋友可以參考學習下。如有不足之處,歡迎批評指正。 單頁面工作原理是通過瀏覽器URL的#後面的hash變化就會引起頁面變化的特性來把頁面分成不同的小模塊,然後通過修改hash來讓頁 ...
  • 移動端的項目經常會引入手勢庫來實現拖拽 不過如果只是一兩個頁面用到拖拽,再引入一個手勢庫就很不划算 最近的項目中就有這麼一個需求: 因為就這一個地方需要拖拽,所以我就沒有引入第三方庫 移動端的拖拽有兩種主流的實現方案: 1. 將元素設置為固定定位,然後在拖拽的時候修改其定位,實現拖拽的效果; 這種 ...
  • Carousel 走馬燈源碼分析整理筆記,這篇寫的不詳細,後面有空補充 main.vue item.vue ...
  • 這裡是修真院前端小課堂,每篇分享文從 【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】 八個方面深度解析前端知識/技能,本篇分享的是: 【什麼是jsp?jsp的內置對象有哪些?】 1、背景介紹 百度百科是這麼介紹jsp的:“jsp是一種動態網頁技術標準 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...