浏览器的渲染流程:从 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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语法简洁清晰&…