浏览器相关(3)

来源:互联网 发布:java识别屏幕数字 编辑:程序博客网 时间:2024/06/10 15:53

浏览器的渲染过程

浏览器的渲染过程:
①解析html以构建DOM树
②构建render树
③布局render树
④渲染render树

渲染过程如图:

这里写图片描述

①浏览器会将HTML解析成一个DOM树,DOM树的构建过程是一个深度遍历的过程:当前节点的所有子节点都构建好后才会去构建当前节点的下一个兄弟节点。
②解析CSS会产生CSS规则树。
③根据DOM树和CSSOM来构造Rendering Tree。(注意:Rendering Tree 渲染树并不等同于DOM树,因为一些像Header 或 display:none 的东西就没必要放在渲染树中了

详细的过程

④有了Render Tree,浏览器已经知道网页中有哪些节点 、各个节点的CSS定义以及他们的从属关系。下一步操作称之为Layout,顾名思义就是计算出每个节点在屏幕中的位置。
⑤最后一步是绘制,即遍历render树,并使用UI后端层绘制每个节点。

注意:上述过程是逐步完成的,为了更好的用户体验,渲染引擎会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。(《how browsers work》)

HTML页面加载和解析的过程

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

reflow 与 repaint
reflow(回流):浏览器要花时间去渲染,当它发现了某个部分发生了变化影响了布局,那就倒回去重新渲染;
repaint(重绘):如果只是改变了某个元素的背景颜色、文字颜色等,不影响元素周围或内部布局的属性,将只会引起浏览器的repaint,重画某一部分。

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

产生reflow的原因:
①页面初始化的时候;
②操作DOM的时候;
③某些元素的尺寸变了;
④css的属性发生变化了

减少reflow/repaint
①不要一条一条地修改DOM的样式。最好是预先定义好css的class,然后修改DOM的className;
②不要把DOM结点的属性值放在一个循环中当成循环的变量;
③为东湖的HTML元件使用fixed或absolute的position,那么修改他们的CSS是不会reflow的;
④使用div+css布局,代替table布局。

以上内容是参考这篇博客 http://blog.csdn.net/xiaozhuxmen/article/details/52014901

原创粉丝点击