为什么要了解浏览器加载,解析,渲染这个过程?
1了解浏览器如何加载,可以在引用外部样式文件和js文件的时候,将它们放置在最优位置,使浏览器以最快的速度将文件加载完毕。
2了解浏览器如何解析,可以在构建dom结构,组织css选择器的时候,选择最优写法,提高浏览器的解析速率。
3了解浏览器如何渲染,明白渲染的过程,在设置元素属性及编写js文件的时候,可以减少reflow和repaint的消耗。
浏览器的主要功能?
浏览器的主要功能是将用户选择的web资源呈现出来,它需要从服务器请求资源,并将其显示在浏览器窗口中,资源的格式通常是HTML,也包括PDF,image及其他格式。用户用url(统一资源标识符)来指的所求资源的位置,通过DNS查询将网址转换为ip地址,整个浏览器工作的额流程:
1、输入网址。
2、浏览器查找域名的ip地址
3、浏览器给web服务器发送一个http请求。
4、网站服务器的永久重定向响应。
5、浏览器跟踪冲定向地址,现在,浏览器知道了要访问的正确地址,所以它会发送一个获取请求。
6、服务器处理请求,服务器接收到获取请求,然后处理并返回一个响应。
7、服务器发送一个html响应
8、浏览器开始显示html
9、浏览器发送请求,以获取嵌入在html中的对象,在浏览器显示html时,它会注意到需要获取其他地址的内容的标签。这时,浏览器会重新发送一个获得这些资源的请求来重新获得这些文件。这些文件包括css、js、图片资源等,这些资源都要经历一个和html读取过程一样的过程。所以浏览器会在dns中查找这些域名,发送请求,重定向等等……
那么浏览器如何渲染?
基本流程:1、解析html以构建dom树 。2、构建render树。3、布局render树。4、绘制render树。
浏览器会解析三个东西:
1、html,SVG,xhtml,会解析这三个文件产生一个dom tree。
2、Css,解析css产生css规则树。
3、JavaScript脚本,主要通过dom API 和cssom API来操作和css ruleTree。
到底浏览器是如何解析css和js的?是遇到link便签就开始解析,还是先解析html后再解析link?边加载边渲染,还是加载完毕后才开始渲染?
当浏览器获得一个html文件的时候,会自上而下加载,并在加载过程中进行解析渲染。
解析:
1、浏览器会将html解析成一个dom树,dom树的构建过程是一个深度遍历的过程,当前节点的所有子节点都构建好之后,才回去构建当前节点的下一个兄弟节点。
2、将css解析成css rule tree。
3、根据dom树和cssom来构建renderingtree 。(rendering tree中的一些header 或者display:none的东西都没有了)。
4、有了render tree ,浏览器已经知道网页中有哪些节点,各个节点的css定义以及他们的从属关系。下一步操作是 layuot,就是计算出每个节点在屏幕中的位置。
5、再下一步就是绘制,即遍历render树,并使用ui后端层绘制每个节点。
几个重要概念!!!
Reflow:(回流):浏览器要花时间去渲染,但当它发现某个部分发生了变化影响了布局,那就要倒回去重新渲染。
Repaint(重绘):如果只是改变某个元素的背景颜色,文字颜色等,不影响元素周围或者内部布局的属性,将只会引起浏览器的repaint,重画某一部分。
Reflow要比repaint更花费时间,也就更影响性能,所以写代码的时候要尽量避免过多的reflow。
Reflow的原因?
1、页面初始化的时候。
2、操作dom的时候。
3、某些元素的尺寸边了。
4、如果css的属性发生变化了。
如何减少reflow和repaint
1、不要一条一条的修改dom的样式。与其这样,还不如预先定义好css的class,然后修改dom的classname。
2、不要吧dom的节点的属性放在一个循环里当成循环变量。
3、为动画的html原件使用fixed或者absoult的position,那么修改它的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