html网页渲染的基本过程

最近面试中经常会被问到html页面的渲染过程,之前一直只是在用,没有仔细的研究过其中的过程,今天查阅了一些资料,并整理了一些自己的理解,方便以后查看。如果有理解不正确的地方,还希望多包涵和指导。

整个渲染的过程其实就是将URL对应的各种资源,通过浏览器渲染引擎的解析,输出可视化的图像。

渲染模块:

从图中可以看出,一个渲染引擎大致包括HTML解释器、CSS解释器、布局和JavaScript引擎。

HTML解释器:解释HTML语言的解释器,本质是将HTML文本解释成DOM树(文档对象模型)。

CSS解释器:解释样式表的解释器,其作用是将DOM中的各个元素对象加上样式信息,从而为计算最后结果的布局提供依据。

布局:将DOM和css样式信息结合起来,计算它们的大小位置等布局信息,形成一个能够表示这所有信息的内部表示模型即渲染树。

JavaScript引擎:JavaScript可以修改网页的内容,也能修改CSS的信息,JavaScript引擎解释JavaScript代码并把代码的逻辑和对DOM和CSS的改动信息应用到布局中去,从而改变渲染的结果。

这些模块依赖很多其他的基础模块,这其中包括网络,存储,2D/3D图形,音频视频和图片解码器等。实际上,渲染引擎中还应该包括如何使用这些依赖模块的部分,这部分的工作其实并不少,因为需要使用它们来高效的渲染网页。例如,利用2D/3D图形库来实现高性能的网页绘制和网页的3D渲染,这个实现非常非常的复杂。最后,当然,在最下面,依然少不了操作系统的支持,例如线程支持,文件支持等等。

基本过程

1.解析HTML文件,创建DOM树

2.解析CSS,形成CSS对象模型

3.将CSS与DOM合并,构建渲染树(renderingtree)

4.布局和绘制

对渲染树上的每个元素,计算它的坐标,称之为布局。浏览器采用一种流方法,布局一个元素只需通过一次,但是表格元素需要通过多次。

最后,渲染树上的元素最终展示在浏览器里,这一过程称为“painting”。

当用户与网页交互,或者脚本程序改动修改网页时,前文提到的一些操作将会重复执行,因为网页的内在结构已经发生了改变。

Repaint(重绘)

重绘是改变不影响元素在网页中的位置的元素样式时,譬如background-color(背景色), border-color(边框色), visibility(可见性),浏览器会根据元素的新属性重新绘制一次(这就是重绘,或者说重新构造样式),使元素呈现新的外观。重绘不会带来重新布局,所以并不一定伴随重排。

Reflow(重排)

渲染对象在创建完成并添加到渲染树时,并不包含位置和大小信息。计算这些值的过程称为布局或重排。

当改变影响到文本内容或结构,或者元素位置时,重排或者说重新布局就会发生。这些改变通常由以下事件触发:

     DOM操作(元素添加、删除、修改或者元素顺序的改变);

  内容变化,包括表单域内的文本改变;

     CSS属性的计算或改变;

  添加或删除样式表;

  更改“类”的属性;

  浏览器窗口的操作(缩放,滚动);

  伪类激活(悬停)。


"重绘"不一定需要"重排",比如改变某个网页元素的颜色,就只会触发"重绘",不会触发"重排",因为布局没有改变。

但是,"重排"必然导致"重绘",比如改变一个网页元素的位置,就会同时触发"重排"和"重绘",因为布局改变了。


浏览器如何优化渲染?

(1)将多次改变样式属性的操作合并成一次操作

(2)将需要多次重排的元素,position属性设为absolute或fixed,

这样此元素就脱离了文档流,它的变化不会影响到其他元素。例如有动画效果的元素就最好设置为绝对定位。

(3)由于display属性为none的元素不在渲染树中,对隐藏的元素操作不会引发其他元素的重排。

如果要对一个元素进行复杂的操作时,可以先隐藏它,操作完成后再显示。这样只在隐藏和显示时触发2次重排。


看这个的时候又想到display:none、visibility:hidden和overflow:hidden的区别,顺便带一下。

display:none和visibility:hidden都是把网页上某个元素隐藏起来的功能

display:none:

隐藏元素,不占网页中的任何空间,让这个元素彻底消失(看不见也摸不着),由于会影响到网页的空间,所以会引起一次重排和重绘。

visibility:hidden:

他是把那个层隐藏了,也就是你看不到它的内容但是它内容所占据的空间还是存在的。(看不见但摸得到),该操作不会对页面有影响,所以只会引起一次重绘。

overflow:hidden:

让超出的元素隐藏(不占据网页空间),就是在设置该属性的时候他会根据你设置的宽高把多余的那部分剪掉,会引起一次重排和重绘。


参考资料:

http://blog.csdn.net/osdfhv/article/details/52159341

https://www.cnblogs.com/momo798/p/6368396.html

https://www.cnblogs.com/yangjie-space/p/4857654.html

你可能感兴趣的:(html网页渲染的基本过程)