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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值