浏览器加载解析渲染过程总结学习

本文介绍浏览器加载、解析和渲染HTML、CSS及JavaScript的过程,包括如何优化以减少重排和重绘,提高网页性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要了解浏览器加载,解析,渲染这个过程?

1了解浏览器如何加载,可以在引用外部样式文件和js文件的时候,将它们放置在最优位置,使浏览器以最快的速度将文件加载完毕。

2了解浏览器如何解析,可以在构建dom结构,组织css选择器的时候,选择最优写法,提高浏览器的解析速率。

3了解浏览器如何渲染,明白渲染的过程,在设置元素属性及编写js文件的时候,可以减少reflowrepaint的消耗。

 

 

浏览器的主要功能?

浏览器的主要功能是将用户选择的web资源呈现出来,它需要从服务器请求资源,并将其显示在浏览器窗口中,资源的格式通常是HTML,也包括PDFimage及其他格式。用户用url(统一资源标识符)来指的所求资源的位置,通过DNS查询将网址转换为ip地址,整个浏览器工作的额流程:

1、输入网址。

2、浏览器查找域名的ip地址

3、浏览器给web服务器发送一个http请求。

4、网站服务器的永久重定向响应。

5、浏览器跟踪冲定向地址,现在,浏览器知道了要访问的正确地址,所以它会发送一个获取请求。

6、服务器处理请求,服务器接收到获取请求,然后处理并返回一个响应。

7、服务器发送一个html响应

8、浏览器开始显示html

9、浏览器发送请求,以获取嵌入在html中的对象,在浏览器显示html时,它会注意到需要获取其他地址的内容的标签。这时,浏览器会重新发送一个获得这些资源的请求来重新获得这些文件。这些文件包括cssjs、图片资源等,这些资源都要经历一个和html读取过程一样的过程。所以浏览器会在dns中查找这些域名,发送请求,重定向等等……

 

 

 

 

那么浏览器如何渲染?

基本流程:1、解析html以构建dom树 。2、构建render树。3、布局render树。4、绘制render树。

浏览器会解析三个东西:

1、htmlSVGxhtml,会解析这三个文件产生一个dom tree

2、Css,解析css产生css规则树。

3、JavaScript脚本,主要通过dom API cssom API来操作和css ruleTree

 

 

 

到底浏览器是如何解析cssjs的?是遇到link便签就开始解析,还是先解析html后再解析link?边加载边渲染,还是加载完毕后才开始渲染?

 

当浏览器获得一个html文件的时候,会自上而下加载,并在加载过程中进行解析渲染。

解析:

1、浏览器会将html解析成一个dom树,dom树的构建过程是一个深度遍历的过程,当前节点的所有子节点都构建好之后,才回去构建当前节点的下一个兄弟节点。

2、css解析成css rule tree

3、根据dom树和cssom来构建renderingtree 。(rendering tree中的一些header 或者displaynone的东西都没有了)。

4、有了render tree ,浏览器已经知道网页中有哪些节点,各个节点的css定义以及他们的从属关系。下一步操作是 layuot,就是计算出每个节点在屏幕中的位置。

5、再下一步就是绘制,即遍历render树,并使用ui后端层绘制每个节点。

 

几个重要概念!!!

Reflow:(回流):浏览器要花时间去渲染,但当它发现某个部分发生了变化影响了布局,那就要倒回去重新渲染。

Repaint(重绘):如果只是改变某个元素的背景颜色,文字颜色等,不影响元素周围或者内部布局的属性,将只会引起浏览器的repaint,重画某一部分。

Reflow要比repaint更花费时间,也就更影响性能,所以写代码的时候要尽量避免过多的reflow

 

Reflow的原因?

1、页面初始化的时候。

2、操作dom的时候。

3、某些元素的尺寸边了。

4、如果css的属性发生变化了。

 

 

如何减少reflowrepaint

1、不要一条一条的修改dom的样式。与其这样,还不如预先定义好cssclass,然后修改domclassname

2、不要吧dom的节点的属性放在一个循环里当成循环变量。

3、为动画的html原件使用fixed或者absoultposition,那么修改它的css是不会reflow的。

4、千万不要使用table布局,因为可能很小一个改懂就会造成整个table的重新布局。

 

 

 

HTML页面加载和解析流程 
1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件; 
2. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件; 
3. 浏览器又发出CSS文件的请求,服务器返回这个CSS文件; 
4. 浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了; 
5. 浏览器在代码中发现一个<img>标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码; 
6. 服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码; 
7. 浏览器发现了一个包含一行Javascript代码的<script>标签,赶快运行它; 
8. Javascript脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个<div> (style.display=”none”)。突然少了这么一个元素,浏览器不得不重新渲染这部分代码; 
9. 终于等到了</html>的到来,浏览器泪流满面…… 
10. 等等,还没完,用户点了一下界面中的“换肤”按钮,Javascript让浏览器换了一下<link>标签的CSS路径; 
11. 浏览器召集了在座的各位<div><span><ul><li>们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请求了新的CSS文件,重新渲染页面。

 

参考网址:

http://blog.youkuaiyun.com/xiaozhuxmen/article/details/52014901

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值