详细解释浏览器是如何渲染页面的?

news2025/4/21 2:20:13

渲染流程概述

渲染的目标:将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.coloradmin.cn/o/2339137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nacos安装及数据持久化

1.Nacos安装及数据持久化 1.1下载nacos 下载地址:https://nacos.io/download/nacos-server/ 不用安装,直接解压缩即可。 1.2配置文件增加jdk环境和修改单机启动standalone 找到bin目录下的startup.cmd文件,添加以下语句(jdk路径根据自己…

FPGA_YOLO(四)用HLS实现循环展开以及存储模块

Vivado HLS(High-Level Synthesis,高层次综合)是赛灵思(Xilinx)在其 Vivado 设计套件 中提供的一款工具,用于将 高级编程语言(如 C、C、SystemC) 直接转换为 硬件描述语言&#xff0…

ASP.NET MVC 实现增删改查(CRUD)操作的完整示例

提供一个完整的 ASP.NET MVC 实现增删改查(CRUD)操作的示例。该示例使用 SQL Server 数据库,以一个简单的 Product 实体为例。 步骤 1:创建 ASP.NET MVC 项目 首先,在 Visual Studio 中创建一个新的 ASP.NET MVC 项目…

MCP理解笔记及deepseek使用MCP案例介绍

文章目录 一、MCP介绍(1)使用MCP与之前的AI比较(2)原理(3)优点 二、deepseek使用MCP使用案例介绍 一、MCP介绍 全称 模型上下文协议 来源 由Claude母公司Anthropic于24年底开源发布 简介 AI大模型的标准化…

# 手写数字识别:使用PyTorch构建MNIST分类器

手写数字识别:使用PyTorch构建MNIST分类器 在这篇文章中,我将引导你通过使用PyTorch框架构建一个简单的神经网络模型,用于识别MNIST数据集中的手写数字。MNIST数据集是一个经典的机器学习数据集,包含了60,000张训练图像和10,000张…

LeetCode:DFS综合练习

简单 1863. 找出所有子集的异或总和再求和 一个数组的 异或总和 定义为数组中所有元素按位 XOR 的结果;如果数组为 空 ,则异或总和为 0 。 例如,数组 [2,5,6] 的 异或总和 为 2 XOR 5 XOR 6 1 。 给你一个数组 nums ,请你求出 n…

Perf学习

重要的能解决的问题是这些: perf_events is an event-oriented observability tool, which can help you solve advanced performance and troubleshooting functions. Questions that can be answered include: Why is the kernel on-CPU so much? What code-pa…

齐次坐标变换+Unity矩阵变换

矩阵变换 变换(transform):指的是我们把一些数据,如点,方向向量甚至是颜色,通过某种方式(矩阵运算),进行转换的过程。 变换类型 线性变换:保留矢量加和标量乘的计算 f(x)…

Pandas取代Excel?

有人在知乎上提问:为什么大公司不用pandas取代excel? 而且列出了几个理由:Pandas功能比Excel强大,运行速度更快,Excel除了简单和可视化界面外,没有其他更多的优势。 有个可怕的现实是,对比Exce…

启动vite项目报Unexpected “\x88“ in JSON

启动vite项目报Unexpected “\x88” in JSON 通常是文件被防火墙加密需要寻找运维解决 重启重装npm install

HTTP测试智能化升级:动态变量管理实战与效能跃迁

在Web应用、API接口测试等领域,测试场景的动态性和复杂性对测试数据的灵活管理提出了极高要求。传统的静态测试数据难以满足多用户并发、参数化请求及响应内容验证等需求。例如,在电商系统性能测试中,若无法动态生成用户ID、订单号或实时提取…

关于一对多关系(即E-R图中1:n)中的界面展示优化和数据库设计

前言 一对多,是常见的数据库关系。在界面设计时,有时为了方便,就展示成逗号分割的字符串。例如:学生和爱好的界面。 存储 如果是简单存储,建立数据库:爱好,课程,存在一张表中。 但…

JVM笔记【一】java和Tomcat类加载机制

JVM笔记一java和Tomcat类加载机制 java和Tomcat类加载机制 Java类加载 * loadClass加载步骤类加载机制类加载器初始化过程双亲委派机制全盘负责委托机制类关系图自定义类加载器打破双亲委派机制 Tomcat类加载器 * 为了解决以上问题,tomcat是如何实现类加载机制的…

React 组件类型详解:类组件 vs. 函数组件

React 是一个用于构建用户界面的 JavaScript 库,其核心思想是组件化开发。React 组件可以分为类组件(Class Components)和函数组件(Function Components),它们在设计理念、使用方式和适用场景上有所不同。随…

GPT-SoVITS 使用指南

一、简介 TTS(Text-to-Speech,文本转语音):是一种将文字转换为自然语音的技术,通过算法生成人类可听的语音输出,广泛应用于语音助手、无障碍服务、导航系统等场景。类似的还有SVC(歌声转换&…

美信监控易:数据采集与整合的卓越之选

在当今复杂多变的运维环境中,一款具备强大数据采集与整合能力的运维管理软件对于企业的稳定运行和高效决策至关重要。美信监控易正是这样一款在数据采集与整合方面展现出显著优势的软件,以下是它的一些关键技术优势,值得每一个运维团队深入了…

End-to-End从混沌到秩序:基于LLM的Pipeline将非结构化数据转化为知识图谱

摘要:本文介绍了一种将非结构化数据转换为知识图谱的端到端方法。通过使用大型语言模型(LLM)和一系列数据处理技术,我们能够从原始文本中自动提取结构化的知识。这一过程包括文本分块、LLM 提示设计、三元组提取、归一化与去重,最终利用 NetworkX 和 ipycytoscape 构建并可…

MySql 三大日志(redolog、undolog、binlog)详解

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/aa730ab3f84049638f6c9a785e6e51e9.png 1. redo log:“你他妈别丢数据啊!” 干啥的? 这货是InnoDB的“紧急备忘录”。比如你改了一条数据,MySQL怕自己突然断电嗝屁了&am…

HTTP:九.WEB机器人

概念 Web机器人是能够在无需人类干预的情况下自动进行一系列Web事务处理的软件程序。人们根据这些机器人探查web站点的方式,形象的给它们取了一个饱含特色的名字,比如“爬虫”、“蜘蛛”、“蠕虫”以及“机器人”等!爬虫概述 网络爬虫(英语:web crawler),也叫网络蜘蛛(…

2025妈妈杯数学建模C题完整分析论文(共36页)(含模型建立、可运行代码、数据)

2025 年第十五届 MathorCup 数学建模C题完整分析论文 目录 摘 要 一、问题分析 二、问题重述 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1代码(仅供参考) 4.1.4问题1求解结果(仅…