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

  • 20
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录: 目录 第1篇 html基础入门篇 第1章 建立首要的、基础的正确认知 1.1 internet和万维网 1.1.1 什么是www(万维网) 1.1.2 w3c是什么 1.2 网页、浏览器、网站和网络服务器 1.2.1 网页和浏览器 1.2.2 不可不知的浏览器发展史 1.2.3 浏览网页 1.2.4 网站和网络服务器 1.3 了解html语言 1.3.1 关于htmlhtml编辑器 1.3.2 创建第一个网页 1.3.3 查看网页的源文件 1.4 html 4.0的特点 1.4.1 国际化 1.4.2 可访问性 1.4.3 表格 1.4.4 混合文档 1.4.5 样式表 . 1.4.6 脚本 1.4.7 打印 1.5 巩固与自测 第2章 html文档的基本结构 2.1 使用dreamweaver创建第一个网页 2.1.1 dreamweaver安装和配置向导 2.1.2 使用dreamweaver创建网页的基本步骤 2.1.3 使用dreamweaver的基本知识 2.2 html文档的基本结构 2.2.1 了解sgml和html的关系 2.2.2 html简要的历史和为何要使用html 2.2.3 html 4.01的版本和文档类型声明 2.2.4 [html][/html]标签对和属性 2.2.5 [head][/head]标签对 2.2.6 [body][/body]标签对 2.3 巩固与自测 第3章 html文档的编写规范 3.1 使用标签、元素和属性 3.1.1 标签 3.1.2 元素 3.1.3 属性的定义 3.1.4 属性值的定义 3.1.5 元素和属性的大小写规范 3.2 字符引用 3.2.1 字符数字引用 3.2.2 字符实体引用 3.3 使用注释 3.4 关于空白和空白字符 3.4.1 关于断行符 3.4.2 空白字符 3.5 基本html数据型式 3.5.1 cdata数据类型 3.5.2 id和name使用的数据类型 3.5.3 idref和idrefs使用的数据类型 3.5.4 number数据类型 3.5.5 文本字符串 3.5.6 使用uri 3.5.7 使用颜色 3.5.8 使用长度 3.5.9 内容类型(mime类型) 3.5.10 语言代码 3.5.11 字符编码 3.5.12 单字符 3.5.13 日期和时间 3.5.14 链接类型 3.5.15 介质描述符 3.5.16 脚本数据 3.5.17 样式表数据 3.5.18 框架目标名 3.6 巩固与自测 第2篇 html详细学习篇 第4章 html文档的头部定义 4.1 定义标题(title元素) 4.2 怎样定义元数据 4.2.1 定义元数据关键字 4.2.2 元数据的语言信息 4.2.3 元数据的其他定义方法 4.3 用于搜索引擎的元数据 4.3.1 定义编辑工具 4.3.2 定义版权信息 4.3.3 定义关键字 4.3.4 定义概要描述 4.3.5 定义设计者 4.3.6 定义创作日期 4.3.7 定义搜索引擎搜索方式 4.4 用于http消息报头的元数据(属性http-equiv) 4.4.1 设置网页内容类型和字符集 4.4.2 设置网页所使用的语言 4.4.3 设置网页定时跳转 4.4.4 设置网页禁用缓存 4.4.5 设置网页到期 4.4.6 设置网页cookie存活时间 4.4.7 设置网页框架目标 4.4.8 设置网页转场效果 4.4.9 设置网页分级 4.5 元数据纲要和元数据架构 4.5.1 使用元数据纲要(profile属性) 4.5.2 使用元数据架构(scheme属性) 4.6 巩固与自测 第5章 文字与段落 5.1 结构化的文本 5.1.1 用于强调的短语元素(em元素、strong元素、cite元素) 5.1.2 用于缩写的短语元素(abbr元素、acronym元素) 5.1.3 其他的短语元素(dfn、code、samp、kbd、var) 5.1.4 引用(blockquote元素、q元素) 5.1.5 下标和上标(sub元素、sup元素) 5.2 行和段落 5.2.1 段落(p元素) 5.2.2 控制换行(br元素) 5.2.3 连字符 5.2.4 预格式化文本(pre元素) 5.2.5 段落的视觉呈现 5.3 标题字体(h#元素) 5.4 标记文档改变:ins和del元素 5.5 基本文字格式(tt、i、b、big、small、strike、s、u) 5.6 字体修改(font、basefont元素) 5.6.1 改变字体大小(size属性) 5.6.2 改变文本颜色(color属性) 5.6.3 改变字体(face属性) 5.7 加入水平分割线(hr元素) 5.7.1 分隔线宽度和高度

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值