浏览器渲染原理和流程

今天碰到一个问题,要谈一下浏览器的渲染过程。于是今天去学习了一下,在此做了总结。

浏览器的内部都有一个叫做渲染引擎的东西,负责渲染呈现网页的内容,不同的浏览器有不同的渲染引擎。一般情况下,渲染引擎可以显示HTML,CSS,JS,XML和一些媒体数据,像一些WORD,PDF之类的也可以用一些专用插件渲染。

基本流程

1、渲染引擎通过网络获得文档的内容

2、解析HTML,构成DOM树

3、解析CSS,构成CSS规则树

4、将DOM树和CSS规则树合并起来形成Render树

5、Render树进行布局(layout),计算每个节点在屏幕中的位置

6、绘制,按照计算的规则将内容绘制到屏幕上

7、reflow(回流),当浏览器的某些节点发生变化影响到了布局时,就会倒回去重新渲染。例如:元素的显示与隐藏,折叠菜单等引起了页面上元素的大小,位置,内外边距等。回流会从文档的根节点html标签开始,向下依次计算所有节点的大小和位置,引起部分或整个页面的重新渲染。

8、repaint(重绘),当某些元素发生像颜色等一些不会影响布局的变化时,会触发重绘,此时元素的大小和位置不会发生变化。

 

注意:

1、display:none;该元素以及它的所有后代元素都会隐藏,会把元素从DOM树中删除,其他元素会立马占据它的位置,引起了布局的变化是,所以会触发回流。

2、visibility:hidden;单纯的将元素不显示,但元素位置仍占据着,类似于“透明”,会引起重绘。

3、visibility具有继承性,给父元素设置visibility:hidden;子元素也会继承这个属性。但是如果再给子元素设置visibility:visible,则子元素又会显示出来。

4、visibility: hidden不会影响计数器的计数。例如:在ol中,visibility:hidden;的 li 仍然占据着有序列表的序号,而display:none:不会。

### 浏览器渲染原理及过程详解 #### 渲染引擎与JavaScript引擎的作用 浏览器内核主要包括两个核心组件:**渲染引擎****JavaScript引擎**。以Chrome浏览器为例,其渲染引擎为 **Blink**(前身是 WebKit),负责解析 HTML CSS,并将内容绘制到屏幕上;而 JavaScript 引擎则是 **V8**,用于执行页面中的脚本逻辑 [^2]。 渲染引擎的主要任务包括: - 解析 HTML 文档生成 DOM 树。 - 解析 CSS 生成 CSSOM(CSS Object Model)树。 - 将 DOM CSSOM 合并生成渲染树(Render Tree)[^4]。 - 根据渲染树进行布局计算(Layout/Reflow),确定每个元素的几何位置。 - 绘制像素到屏幕上(Painting)。 - 最后进行合成(Composite),将多个图层组合成最终画面。 #### 构建DOM树与CSSOM树 当浏览器接收到 HTML 响应后,会从上至下逐行解析 HTML 内容,构建出一棵 DOM 树。这棵树反映了文档中所有节点的层级关系。与此同时,如果遇到 `<style>` 或外部链接如 `<link rel="stylesheet">`,则会开始解析 CSS 并生成 CSSOM 树。CSSOM 不仅包含样式规则,还体现了选择器之间的嵌套结构优先级关系 [^4]。 值得注意的是,在解析过程中,若主线程遇到 `<link>` 标签引入的外部 CSS 文件,它不会等待该文件下载完成,而是继续解析后续 HTML。这是由于 CSS 的下载解析是由预加载扫描器(Preloader Scanner)单独处理的线程所负责,从而避免阻塞主 HTML 的解析流程 [^5]。 #### 渲染树的构建 在 DOM CSSOM 都准备好之后,两者会被合并形成渲染树。渲染树只包含需要显示的节点及其对应的样式信息。例如,`<head>` 中的内容或设置了 `display: none` 的元素不会出现在渲染树中。这一阶段完成后,浏览器就能知道哪些内容需要被绘制以及如何绘制。 #### 回流(Reflow)与重绘(Repaint) 一旦渲染树建立完毕,浏览器便进入布局阶段。此阶段会对渲染树上的每一个可见元素进行几何尺寸位置的计算,这个过程被称为 **回流(Reflow)**。任何影响页面布局的操作都会触发回流,比如修改宽高、调整边距、改变字体大小等。此外,某些用户交互行为如鼠标悬停、点击事件也可能导致回流的发生。回流几乎不可避免,且通常会影响到整个文档树的一部分甚至全部 [^3]。 随后,浏览器进入 **重绘(Repaint)** 阶段,即将计算好的几何属性转换为屏幕上的实际像素值。虽然重绘比回流耗时较短,但如果频繁发生仍然会导致性能问题。为了保证良好的用户体验,现代浏览器对每一帧的渲染工作都有严格的时间限制——大约每秒60帧,即每次渲染不得超过约16毫秒。超过这个时间就会出现卡顿现象,直接影响用户的视觉感受 [^1]。 #### 主线程的工作机制 整个渲染流程主要由浏览器的主线程来驱动。该线程不仅负责 HTML/CSS 的解析,还要处理 JavaScript 执行、布局计算、绘制操作以及其他异步任务。因此,过多复杂的计算或者长时间运行的脚本可能会占用主线程资源,进而延迟其他关键任务的执行,造成页面响应迟缓甚至冻结。 #### 示例代码:模拟简单渲染流程 以下是一个简化的示例,演示了如何使用 JavaScript 来观察页面渲染的基本步骤: ```javascript // 创建一个简单的 div 元素并添加到 body const newDiv = document.createElement('div'); newDiv.textContent = 'Hello, rendering process!'; document.body.appendChild(newDiv); // 修改样式以触发 reflow repaint newDiv.style.color = 'red'; newDiv.style.fontSize = '20px'; // 强制浏览器立即执行 layout 计算 console.log(newDiv.offsetHeight); // 这里会强制同步 layout ``` 上述代码创建了一个新的 `<div>` 元素,并通过修改其样式属性来触发回流与重绘。最后通过访问 `offsetHeight` 属性迫使浏览器立刻完成一次布局计算。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值