詳細解釋瀏覽器是如何渲染頁面的?

渲染流程概述

渲染的目標:將HTML文本轉化為可以看到的像素點

當瀏覽器的網絡線程收到 HTML 文檔后,會產生一個渲染任務,并將其傳遞給渲染主線程的消息隊列。在事件循環機制的作用下,渲染主線程取出消息隊列中的渲染任務,開啟渲染流程。

渲染流程概述

渲染流程的階段(8個步驟):

在這里插入圖片描述

  • HTML 解析
  • 樣式計算
  • 布局
  • 分層
  • 繪制
  • 分塊
  • 光柵化

每個階段的輸出將成為下一個階段的輸入,整個流程形成了一套高效的生產流水線。

1. 解析 HTML

第一步: 解析 HTML

在這里插入圖片描述

  • HTML 解析: 瀏覽器會解析 HTML 文件,遇到 CSS 會解析 CSS,遇到 JS 會執行 JS
  • 外部資源的加載: 瀏覽器會啟動一個預解析線程,提前下載外部的 CSSJS 文件。

關鍵點:

  • link 標簽會在主線程解析到時,繼續解析 HTML,不會阻塞。
    在這里插入圖片描述
  • script 標簽會暫停 HTML 解析,等待 JavaScript 下載并執行完成后,才能繼續解析。
    HTML解析

解析完成后,瀏覽器得到 DOM 樹CSSOM 樹

2. 樣式計算

第二步: 樣式計算

主線程會遍歷 DOM 樹,計算每個節點的最終樣式,稱之為 Computed Style

這一過程存在轉換操作,預設值(例如 red)轉換成絕對值(例如 rgb(255, 0, 0)),單位(例如 em)轉化為 px

此步驟后,我們得到了一棵包含樣式的 DOM 樹。

樣式計算


3. 布局

第三步: 布局

布局階段,瀏覽器會根據 DOM 樹計算出每個節點的幾何信息,如寬高、位置等。

布局樹的特性(DOM樹和Layout樹不一定是一一對應的):

  • display: none 的節點不會出現在布局樹中。
  • 偽元素 ::before 會出現在布局樹中,盡管 DOM 樹中沒有。

完成布局后,瀏覽器會生成 布局樹

布局


4. 分層

第四步: 分層

主線程會根據布局樹,按照一套復雜的策略進行分層。

為什么要分層:

如果某一層發生變化,后續只處理這一層,從而提升性能。

影響分層的因素包括:滾動條、transformopacity 等,也可以通過will-change屬性更大程度的影響分層結果。

分層


5. 繪制

第五步: 繪制

每一層的繪制指令集會被生成,用于描述圖層如何呈現內容。

繪制

完成繪制后,主線程將繪制信息提交給 合成線程,剩下的工作由合成線程完成。

分塊

6. 分塊

第六步: 分塊
在這里插入圖片描述

合成線程將每一層分成多個小塊,劃分為更小的區域。

在這里插入圖片描述

這一步會從線程池中取出多個線程來完成分塊的工作。

7. 光柵化

第七步: 光柵化

合成線程將分塊信息交給 GPU 進程,通過多個線程快速處理,優先處理靠近視口的區域。光柵化后的結果是每個塊的位圖。

光柵化
光柵化的過程中會啟動GPU進程進行加速。
在這里插入圖片描述

8. 畫

最后一步:

合成線程生成 指引(quad)信息,描述每個位圖如何繪制到屏幕的正確位置,并考慮旋轉、縮放等變形。

變形發生在合成線程,與渲染主線程無關,正是因為如此,transform 樣式非常高效。

最終,合成線程將指引信息提交給 GPU 進程,通過 GPU 硬件渲染生成屏幕上的圖像。

畫

總結

通過并行處理,瀏覽器能夠在多個線程中同時完成渲染任務,保證頁面能夠快速響應用戶交互,提高了整體性能。渲染流程的各個階段和線程池的協作使得瀏覽器能夠高效地繪制出用戶所看到的頁面,優化了體驗和性能。

加速技巧:

  • will-change 屬性可以提前告知瀏覽器需要優化的渲染層。
  • 使用 transformopacity 來避免頁面重排,提高渲染效率。

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

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

相關文章

java+postgresql+swagger-多表關聯insert操作(九)

入參為json,然后根據需要對多張表進行操作: 入參格式: {"username": "車主01","usertel": "11111111111","useridtype": "2","useridcard": null,"proname&qu…

JavaSpring 中使用 Redis

創建項目 配置 Redis 服務地址 創建 Controller 類 由于當前只是些簡單的測試代碼,所以就不進行分層了,只創建一個 Controller 來實現 jedis 通過 jedis 對象里的各種方法來操作 Redis 此處通過 StringRedisTemplate 來操作 Redis 最原始提供的類是 Re…

AI文生圖工具推薦

一、AI文生圖技術實現原理 AI文生圖(Text-to-Image)基于生成對抗網絡(GAN)或擴散模型(Diffusion Model)實現,通過深度學習將文本描述轉化為圖像。其核心流程包括: 文本編碼&#xf…

數據結構——快排和歸并排序(非遞歸)

快速排序和歸并排序一般都是用遞歸來實現的,但是掌握非遞歸也是很重要的,說不定在面試的時候面試官突然問你快排或者歸并非遞歸實現,遞歸有時候并不好,在數據量非常大的時候效率就不好,但是使用非遞歸結果就不一樣了&a…

【筆記】網絡安全管理

計算機硬件中,運算器和控制器通常集成在一塊芯片內,一般稱為()。 數據庫DB、數據庫系統DBS、數據庫管理系統DBMS,三者之間的關系是()。 OSI/RM體系結構中的網絡層與TCP/IP體系結構中的()功能相同。 三級系統應按照等保2.0要求采用密碼技術通信過程中數據的()。 …

.net core web api 數據驗證(DataAnnotations)

目錄 一、什么是 DataAnnotations? 二、擴展驗證邏輯(自定義驗證器) 一、什么是 DataAnnotations? DataAnnotations 是一組特性(Attributes),用于在模型類上定義驗證規則。主要用于屬性級別的…

小白從0學習網站搭建的關鍵事項和避坑指南

以下是針對小白從零學習網站搭建時需要注意的關鍵事項和避坑指南,幫助你高效學習、少走彎路: 一、學習路徑注意事項 不要跳過基礎 誤區:直接學習框架(如 React、Laravel)而忽視 HTML/CSS/JS 基礎。 正確做法&#xff…

深入剖析JavaScript內存泄漏:識別、定位與實戰解決

在JavaScript的世界里,開發者通常不必像使用C那樣手動管理內存的分配和釋放,這得益于JavaScript引擎內置的垃圾回收(Garbage Collection, GC)機制。然而,這并不意味著我們可以完全忽視內存管理。“自動"不等于&qu…

2025-04-19 Python 強類型編程

文章目錄 1 方法標注1.1 參數與返回值1.2 變參類型1.3 函數類型 2 數據類型2.1 內置類型2.2 復雜數據結構2.3 類別選擇2.4 泛型 3 標注方式3.1 注釋標注3.2 文件標注 4 特殊情形4.1 前置引用4.2 函數標注擴展4.3 協變與逆變4.4 dataclass 5 高級內容5.1 接口5.2 泛型的協變/逆變…

ETF價格相關性計算算法深度分析

1. 引言 在金融市場中,相關性就像是資產之間“跳舞”的默契程度。想象一下兩位舞者(ETF),有時步伐一致,有時各跳各的。對于管理大規模資金的投資組合而言,準確理解ETF之間的“舞步同步性”對于風險管理、資…

上海人工智能實驗室:LLM無監督自訓練

📖標題:Genius: A Generalizable and Purely Unsupervised Self-Training Framework For Advanced Reasoning 🌐來源:arXiv, 2504.08672 🌟摘要 🔸推進LLM推理技能引起了廣泛的興趣。然而,當前…

【WPF】 在WebView2使用echart顯示數據

文章目錄 前言一、NuGet安裝WebView2二、代碼部分1.xaml中引入webview22.編寫html3.在WebView2中加載html4.調用js方法為Echarts賦值 總結 前言 為了實現數據的三維效果,所以需要使用Echarts,但如何在WPF中使用Echarts呢? 一、NuGet安裝WebV…

2025年3月 Python編程等級考試 2級真題試卷

2025年3月青少年軟件編程Python等級考試(二級)真題試卷 題目總數:37 總分數:100 選擇題 第 1 題 單選題 老師要求大家記住四大名著的作者,小明機智地想到了可以用字典進行記錄,以下哪個選項的字典…

6. 話題通信 ---- 使用自定義msg,發布方和訂閱方cpp,python文件編寫

1)在功能包下新建msg目錄&#xff0c;在msg目錄下新建Person.msg,在Person.msg文件寫入&#xff1a; string name uint16 age float64 height 2)修改配置文件 2.1) 功能包下package.xml文件修改 <build_depend>message_generation</build_depend><exec_depend…

多線程使用——線程安全、線程同步

一、線程安全 &#xff08;一&#xff09;什么是線程安全問題 多個線程&#xff0c;同時操作同一個共享資源的時候&#xff0c;可能會出現業務安全的問題。 &#xff08;二&#xff09;用程序摹擬線程安全問題 二、線程同步 &#xff08;一&#xff09;同步思想概述 解決線…

4. 話題通信 ---- 發布方和訂閱方cpp文件編寫

本節對應趙虛左ROS書籍的2.1.2 以10hz,發布消息和消息的訂閱 1) 在功能包的src文件夾下&#xff0c;新建cpp文件&#xff0c;并且寫入 #include "ros/ros.h" #include "std_msgs/String.h" int main(int argc, char *argv[]) {setlocale(LC_ALL,"&…

有哪些哲學流派適合創業二

好的&#xff0c;讓我們更深入地探討如何將?哲學與數學?深度融合&#xff0c;構建一套可落地的創業操作系統。以下從?認知框架、決策引擎、執行算法?三個維度展開&#xff0c;包含具體工具和黑箱拆解&#xff1a; ?一、認知框架&#xff1a;用哲學重構商業本質? 1. ?本體…

【后端】【python】Python 爬蟲常用的框架解析

一、總結 Python 爬蟲常用的框架主要分為 三類&#xff1a; 輕量級請求庫&#xff1a;如 requests、httpx&#xff0c;用于快速發請求。解析與處理庫&#xff1a;如 BeautifulSoup、lxml、pyquery。爬蟲框架系統&#xff1a;如 Scrapy、pyspider、Selenium、Playwright 等&am…

力扣-hot100(無重復字符的最長子串)

3. 無重復字符的最長子串 中等 給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的 最長 子串 的長度。 示例 1: 輸入: s "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是 "abc"&#xff0c;所以其長度為 3。暴力直觀解法一&#xff1…

六邊形棋盤格(Hexagonal Grids)的坐標

1. 二位坐標轉六邊形棋盤的方式 1-1這是“波動式”的 這種就是把【方格子坐標】“左右各錯開半個格子”做到的 具體來說有如下幾種情況 具體到廟算平臺上&#xff0c;是很巧妙的用一個4位整數&#xff0c;前兩位為x、后兩位為y來進行表示 附上計算距離的代碼 def get_hex_di…