浏览器渲染页面的过程

上网浏览网页对普通人来讲是非常简单的操作,而对于程序员来说,这件事的背后发生了什么事情呢?

输入的网址在通过DNS解析后得到服务器地址,

浏览器向服务器发起http请求,经过TCP三次握手确认链接后,

服务器将需要的代码发回给浏览器,

浏览器接收到代码后进行解析,

经过三大步骤:DOM构造、布局以及绘制页面。

最终展现为人人都能看懂的网页。

第一步:DOM构造。

浏览器首先将收到的html代码,通过html解析器解析构建为一颗DOM树。

数据结构中有许多的树,而DOM树就像是一颗倒着长的大树,这样的对象模型决定了节点之间都有一定的关联,它们关系可能有父子有兄弟,我们可以顺着这棵树做出许多操作。

接着将接收到的css代码,通过css解析器构建出样式表规则。将这些规则分别放到对应的DOM树节点上,得到一颗带有样式属性的DOM树。

第二步:布局。

浏览器按从上到下、从左到右的顺序,读取DOM树的文档节点,顺序存放到一条虚拟的传送带上,传送带上的盒子就是节点,而这条流动的传送带就是文档流。

如果我们读取到的节点是属于另一个节点下的子节点,那么在放入传送带的时候,就应该按顺序放到该节点盒子的内部。

如果子节点下还有子节点,在传送带上的时候就继续套到子一级的盒子内部,根据它在DOM树上的结构,可以嵌套的层级没有限制的。

文档流排完之后,开始获取计算节点的坐标和大小等css属性,作为盒子的包装说明,

然后把盒子在仓库里一一摆放,这就将节点布局到了页面。

第三步:绘制页面。

布局完成之后,我们在页面上其实是看不到任何内容的,浏览器只是计算出了每一个节点对象,应该被放到页面的哪个位置上,但并没有可视化,

因此最后一步就是将所有内容绘制出来,完成整个页面的渲染。

 

举个栗子

浏览器获得一些代码,它们最终会渲染成这样。

第一步是将代码解析为一颗DOM树。

第二步是按照从上到下、从左到右的顺序,将树上的节点压入文档流。我们看看从body节点开始,然后是body节点下的input节点label节点,一个接一个的被压入文档流。第三步是布局。布局的时候因为是行内元素无法占满一行,会在同一行里挨个排列,如果调整页面宽度让它变窄,行内元素会因为一行放不下而换行。第四步是渲染。最后将它们渲染就完成了这个页面。可见文档流与网页之间的关系,其实就是将一维节点映射到二维空间的关系。(备注:块级元素,每个盒子都会独占一行。遇到图片只需把它当作设置了宽高的普通行内元素处理。)

 

原文视频连接:https://www.iqiyi.com/w_19sad9379l.html

好文:https://www.jianshu.com/p/b22ff1771225

https://blog.youkuaiyun.com/Liu_yunzhao/article/details/91550704?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.not_use_machine_learn_pai
 

 

 

浏览器渲染过程是一个复杂但高效的机制,主要涉及多个关键步骤,包括构建DOM树、CSS规则树、渲染树、布局、绘制和合成等阶段。以下是详细说明: ### 构建DOM树 当浏览器接收到HTML文档后,会解析HTML并生成DOM(Document Object Model)树。DOM树是一个由HTML标签转换而来的层次结构,每个节点代表一个HTML元素。解析过程中,浏览器会处理HTML标签并生成相应的节点对象,形成树状结构 [^3]。 ### 构建CSS规则树 与此同时,浏览器会解析CSS样式表,将CSS规则转化为CSS对象模型(CSSOM),即CSS规则树。CSSOM与DOM树是分开构建的,但它决定了每个DOM节点的样式属性。CSSOM的构建需要解析CSS文件、内联样式以及浏览器默认样式 [^3]。 ### 构建渲染树 在DOM树和CSSOM构建完成后,浏览器会将两者结合,生成渲染树(Render Tree)。渲染树包含所有可见元素及其样式信息,不包括隐藏元素(如`<head>`标签中的内容或`display: none`的元素)。渲染树的构建是为后续的布局和绘制做准备 。 ### 布局(Layout) 布局阶段也称为“回流”(Reflow),是计算每个元素在页面中的确切位置和大小的过程浏览器会根据渲染树遍历所有节点,并将它们以盒模型的形式写入文档流。这个阶段决定了每个元素的几何属性,如宽度、高度、位置等 [^1]。 ### 绘制(Painting) 在布局完成后,浏览器会进入绘制阶段。此阶段会将每个元素的视觉信息(如颜色、边框、文本、阴影等)绘制到屏幕上。绘制过程是逐层进行的,通常分为多个图层进行管理,以提高渲染效率 [^3]。 ### 合成(Compositing) 最后,浏览器会将多个图层按照正确的顺序进行合成,最终呈现给用户。现代浏览器通常使用GPU进行合成操作,以提升性能。复合图层可以避免不必要的重绘和重排,提高页面渲染效率 [^3]。 ### 回流与重绘 当DOM元素的几何属性发生变化时(如修改宽度、高度或位置),浏览器会触发回流(Reflow),重新计算元素的位置和大小。回流之后通常会触发重绘(Repaint),将新的几何属性绘制到屏幕上。频繁的回流和重绘会影响性能,因此在开发中应尽量减少此类操作 [^4]。 ### 浏览器渲染引擎的组件 浏览器渲染引擎负责解析HTML和CSS,并将结果显示到窗口中。其核心组件包括: - **DOM解析器**:负责解析HTML文档并构建DOM树。 - **CSS解析器**:负责解析CSS样式并生成CSSOM。 - **布局引擎**:负责计算元素的几何属性。 - **绘制引擎**:负责将元素绘制到屏幕上。 - **JavaScript引擎**:负责解析和执行JavaScript代码,可能会影响DOM和CSSOM的更新 [^2]。 ### 优化渲染性能 为了提升浏览器渲染性能,开发者可以采取以下措施: - **减少DOM操作**:频繁的DOM修改会触发多次回流和重绘,应尽量合并DOM操作。 - **使用CSS动画优化**:使用`transform`和`opacity`属性进行动画操作,可以避免触发回流。 - **避免强制同步布局**:某些JavaScript操作会强制浏览器立即执行布局,影响性能。 - **使用复合图层**:将频繁变化的元素提升为复合图层,可以减少对其他元素的影响 。 ```css /* 使用 transform 进行动画优化 */ .element { transition: transform 0.3s ease; } .element:hover { transform: scale(1.1); } ``` ### 相关问题 1. 什么是回流(Reflow)和重绘(Repaint)?它们对性能有什么影响? 2. 如何通过CSS和JavaScript优化浏览器渲染性能? 3. 浏览器是如何处理复合图层的?复合图层有哪些优缺点? 4. DOM树、CSSOM和渲染树之间有什么关系? 5. JavaScript是如何影响浏览器渲染过程的?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值