瀏覽器的渲染流程:從 HTML 到屏幕顯示

在我們日常使用瀏覽器瀏覽網頁時,往往忽略了瀏覽器背后復雜的渲染過程。從輸入 URL 到頁面最終顯示在屏幕上,瀏覽器需要經過一系列精心設計的步驟。

瀏覽器渲染的整體流程

image-20220908104403123

瀏覽器的渲染流程可以大致分為兩個主要部分:網絡渲染。當用戶在地址欄輸入 URL 并按下回車鍵時,瀏覽器的網絡線程會發送 HTTP 請求與服務器通信,獲取 HTML 文檔。獲取到 HTML 文檔后,瀏覽器會將其封裝成一個渲染任務,并將其傳遞給渲染主線程的消息隊列。在事件循環機制的作用下,渲染主線程取出消息隊列中的渲染任務,開啟渲染流程。

image-20220908104726589

渲染流程主要分為以下幾個階段:

  1. 解析 HTML:生成 DOM 樹。
  2. 樣式計算:計算每個 DOM 節點的最終樣式。
  3. 布局:計算每個節點的幾何信息。
  4. 分層:將頁面劃分為多個圖層。
  5. 生成繪制指令:為每個圖層生成繪制指令集。
  6. 分塊:將每個圖層劃分為更小的塊。
  7. 光柵化:將每個塊轉換為位圖。
  8. 繪制:將位圖繪制到屏幕上。

1. 解析 HTML

image-20211120171451336

解析 HTML 是渲染流程的第一步,其目標是將 HTML 字符串解析為 DOM 樹。瀏覽器接收到 HTML 文件后,會將其從字節數據轉換為字符串,然后通過詞法分析將其轉換為標記(token)。標記化后的數據將被用來構建 DOM 樹。

在解析 HTML 的過程中,瀏覽器可能會遇到 <style><link><script> 標簽。為了提高解析效率,瀏覽器會啟動一個預解析線程,優先下載外部 CSS 文件和外部 JS 文件。如果主線程解析到 <link> 標簽時,外部 CSS 文件尚未下載解析完成,主線程不會等待,而是繼續解析后續的 HTML。這是因為 CSS 的下載和解析工作是在預解析線程中進行的,這也是 CSS 不會阻塞 HTML 解析的根本原因。

然而,如果主線程解析到 <script> 標簽時,會停止解析 HTML,等待 JS 文件下載完成,并執行全局代碼后,才會繼續解析 HTML。這是因為 JS 代碼的執行可能會修改當前的 DOM 樹,所以 DOM 樹的生成必須暫停。這就是 JS 會阻塞 HTML 解析的根本原因。

2. 樣式計算

擁有了 DOM 樹后,瀏覽器還需要為每個節點計算最終的樣式。這一過程稱為樣式計算。主線程會遍歷 DOM 樹,為每個節點計算出其最終的樣式,生成樣式規則樹。在這一過程中,預設值會變成絕對值,相對單位會變成絕對單位。

3. 布局

樣式計算完成后,瀏覽器需要計算每個節點的幾何信息,這一過程稱為布局。主線程會遍歷 DOM 樹,根據計算樣式計算出每個節點的幾何信息,生成布局樹。布局樹上每個節點會有其在頁面上的 x、y 坐標以及盒子大小的具體信息。

需要注意的是,布局樹與 DOM 樹并非一一對應。例如,display: none 的節點不會生成到布局樹中,而偽元素選擇器雖然在 DOM 樹中不存在,但會生成到布局樹中。

4. 分層

布局完成后,瀏覽器會進行分層。分層的目的是為了提高渲染效率。主線程會遍歷布局樹,根據特定的規則(如滾動條、堆疊上下文、transformopacity 等)將頁面劃分為多個圖層。

5. 生成繪制指令

分層完成后,主線程會為每個圖層生成繪制指令集。這些指令集描述了如何繪制每個圖層的內容。生成繪制指令后,主線程的工作暫時告一段落,接下來將繪制信息提交給合成線程。

6. 分塊

合成線程接收到繪制信息后,會將每個圖層劃分為更小的塊。這一過程稱為分塊。分塊的目的是為了進一步提高渲染效率。

7. 光柵化

分塊完成后,合成線程會將塊信息交給 GPU 進程進行光柵化。光柵化的目的是將每個塊轉換為位圖,確定每個像素點的 RGB 信息。

8. 繪制

最后一步是繪制。合成線程會將每個圖層的位圖繪制到屏幕上。這一過程稱為繪制。

常見面試題

1. 什么是 reflow?

reflow 的本質是重新計算布局樹。當進行了會影響布局樹的操作后,需要重新計算布局樹,會引發 reflow。為了避免連續的多次操作導致布局樹反復計算,瀏覽器會合并這些操作,當 JS 代碼全部完成后再進行統一計算。所以,改動屬性造成的 reflow 是異步完成的。然而,當 JS 獲取布局屬性時,可能會造成無法獲取到最新的布局信息。為了避免這一問題,瀏覽器決定獲取屬性時立即 reflow。

2. 什么是 repaint?

repaint 的本質是重新根據分層信息計算繪制指令。當改動了可見樣式后,需要重新計算,會引發 repaint。由于元素的布局信息也屬于可見樣式,所以 reflow 一定會引起 repaint。

3. 為什么 transform 的效率高?

transform 的效率高是因為它既不會影響布局也不會影響繪制指令,它影響的只是渲染流程的最后一個「draw」階段。由于 draw 階段在合成線程中,所以 transform 的變化幾乎不會影響渲染主線程。反之,渲染主線程無論如何忙碌,也不會影響 transform 的變化。

總結

瀏覽器的渲染流程是一個復雜而精細的過程,涉及多個階段和多個線程的協同工作。從解析 HTML 到最終繪制頁面,每個階段都有其特定的任務和目標。了解瀏覽器的渲染流程不僅有助于我們更好地理解網頁是如何呈現的,還能幫助我們在開發中優化性能,減少不必要的重排和重繪。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94067.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94067.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94067.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FastMCP 客戶端服務器通信示例:從入門到實戰(STDIO 傳輸)

引言 在現代分布式系統和AI應用中&#xff0c;模型上下文協議&#xff08;MCP&#xff09;扮演著重要角色&#xff0c;它負責協調客戶端與服務器之間的通信&#xff0c;尤其是在需要頻繁交互的場景中。本文將介紹如何使用FastMCP庫快速實現客戶端與服務器之間的通信&#xff0c…

寶可夢肉鴿 PC/手機雙端 多種存檔 全閃光 無限金幣 全寶可夢解鎖 免安裝中文版

網盤鏈接&#xff1a; 寶可夢肉鴿 免安裝中文版 名稱&#xff1a;寶可夢肉鴿 PC/手機雙端 多種存檔 全閃光 無限金幣 全寶可夢解鎖 免安裝中文版 描述&#xff1a;寶可夢肉鴿修改版是一款非常受歡迎的口袋妖怪系列&#xff0c;游戲擁有許多獨特的妖怪和玩法。在游戲中&#…

Linux 下的網絡編程

1、目的實現不同主機上進程間的通信。2、問題主機與主機之間在物理層面必須互聯互通。進程與進程在軟件層面必須互聯互通。IP地址&#xff1a;計算機的軟件地址&#xff0c;用來標識計算機設備。MAC地址&#xff1a;計算機的硬件地址&#xff08;固定&#xff09;。網絡的端口號…

Go語言在邊緣計算中的網絡編程實踐:從入門到精通

一、引言 在數字化浪潮席卷全球的今天&#xff0c;邊緣計算如同一股清流&#xff0c;正在重新定義我們對網絡架構的理解。想象一下&#xff0c;當你在自動駕駛汽車中需要毫秒級響應&#xff0c;或者在偏遠工廠中需要實時處理傳感器數據時&#xff0c;傳統的云計算模式就像是&qu…

ASPICE過程能力確定——度量框架

&#x1f697;【汽車人必看】ASPICE能力評估核心&#xff1a;度量框架全解析&#xff5c;90%工程師都搞不懂的評分規則&#xff01;&#x1f50d; 為什么你的ASPICE評估總卡在L2&#xff1f;——揭秘6大能力等級背后的評分邏輯&#xff0c;附提升秘籍&#xff01;&#x1f525;…

機器學習在量化中的應用

一、核心應用場景在因子研究中&#xff0c;scikit-learn 主要解決以下幾類問題&#xff1a;因子預處理與標準化&#xff1a;StandardScaler, RobustScaler因子有效性分析&#xff1a;LinearRegression (IC分析)降維與因子合成&#xff1a;PCA, FactorAnalysis機器學習預測模型&…

RabbitMQ:消息轉化器

目錄一、基本概述二、如何處理一、基本概述 在RabbitMQ中&#xff0c;一般情況下傳遞字符串會被正常解析&#xff0c;如果傳遞的是一個Object類型或者是一個對象類型的時候&#xff0c;RabbitMQ會將其自動轉化為字節碼發送&#xff0c;這不利于我們的讀取個解析。 二、如何處…

【Protues仿真】基于AT89C52單片機的LCD液晶顯示屏顯示控制

目錄 1 LM016L液晶顯示模塊 1.1 基本參數 1.2 引腳定義 1.3硬件連接示例&#xff08;AT89C52&#xff09; 1.4 常用指令集&#xff08;HD44780 子集&#xff09; 1.5 常見問題與注意事項 1.8 結論 2 LM016L液晶顯示模塊控制電路原理圖 3 LM016L液晶顯示模塊控制程序 …

孤獨傷感視頻素材哪里找?分享熱門傷感短視頻素材資源網站

你是不是也經常在抖音上刷到很火的傷感視頻&#xff0c;那么傷感視頻素材都在哪里可以下載呢&#xff1f;作為一名從業多年的視頻剪輯師&#xff0c;今天就跟大家聊聊那些可以下載傷感素材高清無水印的網站&#xff0c;如果你也在苦苦找尋傷感素材&#xff0c;快來看看吧&#…

筆記本怎么才能更快散熱?

一、“物理降溫法”??? 墊高高&#xff01;別讓底部 “窒息”?筆記本底部全是進風口&#xff0c;放床上 / 沙發上會被堵住&#xff01;墊點東西拉開底部空間&#xff0c;高度 1-2cm。??? 給風扇 “松綁”?按「CtrlShiftEsc」打開任務管理器&#xff0c;點 “進程”&…

電機驅動實現插補算法之脈沖和方向接收(以stm32主控為例)

一、方案 A&#xff08;推薦&#xff09;&#xff1a;編碼器模式吃脈沖&#xff08;TI1 STEP&#xff0c;TI2 DIR&#xff09; 核心思路 把定時器設為 Encoder TI1 模式&#xff1a;每個 STEP 上升沿計一次&#xff0c;在那個沿的瞬間用 TI2&#xff08;DIR&#xff09;的電…

[特殊字符] 潛入深淵:探索 Linux 內核源碼的奇幻之旅與生存指南

文章目錄 朋友們&#xff0c;敲黑板&#xff01;&#xff01;&#xff01;&#xff08;超級重要&#xff09;我們今天聊點硬核的——不是普通的代碼&#xff0c;而是驅動了整個數字世界心跳的Linux內核源代碼&#xff01;它藏在哪&#xff1f;就在那個傳奇倉庫&#xff1a;torv…

如何監控和管理微服務之間的調用關系

監控和管理微服務之間的調用關系需要結合分布式追蹤、服務依賴分析、實時監控和可視化工具&#xff0c;以實現對調用鏈路的可見性、問題定位和性能優化。以下是具體的實現方案和工具鏈&#xff1a;一、核心監控目標調用鏈路可視化&#xff1a;展示服務間的調用關系、方向和頻率…

3.4 縮略詞抽取

概述 縮略詞指的是一個詞或者短語的縮略形式&#xff0c;其通常由原詞中的一些組成部分構成&#xff0c;同時保持原詞的含義。縮略詞的檢測與抽取在方法上與同義詞的檢測與抽取類似&#xff0c;但是相比同義詞&#xff0c;縮略詞在文本中出現的規則往往更簡單。 不同語言縮略詞…

Lua腳本如何執行主程序的C函數

Lua Call C function Lua腳本可以和C函數靈活的結合&#xff0c;Lua腳本作為控制語言&#xff0c;使用C函數來做性能計算部分。 Lua腳本的執行器有Lua 和 Luajit。 使用Lua執行器&#xff0c;可以通過C語言注冊C函數到Lua State, 然后Lua腳本可以調用該C函數。 使用Luajit&…

農業-學習記錄

1-git上傳&#xff08;簡易版&#xff09;首先&#xff0c;記得vscode打開的項目路徑是/home/Agribrain。不然會提示上傳很多項目無關的文件。① 暫存所有更改②使用vscode終端注意&#xff1a;終端打開路徑&#xff1a;/home/Agribrain/agribrain【git項目的所在目錄】&#x…

什么是數據集成?數據集成對數據治理有什么影響

在大數據與人工智能驅動的時代&#xff0c;數據已經成為企業的“新型生產力”。然而&#xff0c;企業內部數據往往分散在不同系統、不同格式、甚至不同地域中。如果缺乏有效管理與整合&#xff0c;數據價值就無法真正釋放。這時&#xff0c;“數據集成”應運而生&#xff0c;它…

技術成長戰略是什么?

文章目錄技術成長戰略是什么&#xff1f;1. 前言2. 跟技術大牛學成長戰略2.1 系統性能專家案例2.2 從開源到企業案例2.3 技術媒體大V案例2.4 案例小結3. 學習金字塔和刻意訓練4. 戰略思維的誕生5. 建議技術成長戰略是什么&#xff1f; 1. 前言 在波波的微信技術交流群里頭&am…

從0到1打造一臺機器人走起來

聚焦仿人雙足機器人,著重解決其下肢魯棒行走中仿真到實機間隔(SimToReal gap)的誤差問題 總述 硬件:采用傅利葉智能科技一體化關節模組: 1)胯部和膝關節選用 FSA80 - 29E 電機,以承受較大扭矩; 2)大腿部分采用 FSA60 - 43E 電機,兼顧扭矩和轉速需求; 3)小腿選用 …

【Cmake】Cmake概覽

目錄 一.環境準備 1.1.Cmake安裝 1.2. VSCodeCMake插件安裝 1.3 快速樣例-helloworld?程 二. cmake的基礎命令?使用示例 2.1.文件準備 2.2.?成構建系統 2.3.編譯連接 2.4.測試Ctest模塊 2.5.測試安裝模塊 2.6.測試打包模塊 2.7 查看幫助 CMake語法簡潔清晰&…