前言
作为一个前端开发人员,浏览器渲染机制是个老生常谈的问题,为了日后参考回顾,于是写下该文,如有遗漏或者错误,欢迎留言指出!
主流浏览器介绍
市面上主流浏览器:Chrome,FireFox,Safari,IE
浏览器使用内核也是有差别的,大致可以分为以下几类:
- Trident内核: IE
- Webkit内核:Chrome,Safari
- Gecko内核:FireFox
浏览器基础结构
主要包括如下7部分:
1.用户界面(User Interface):用户所看到及与之交互的功能组件,如地址栏,返回,前进按钮等;
2.浏览器引擎(Browser engine):负责控制和管理下一级的渲染引擎;
3.渲染引擎(Rendering engine):负责解析用户请求的内容(如HTML或XML,渲染引擎会解析HTML或XML,以及相关CSS,然后返回解析后的内容);
4.网络(Networking):负责处理网络相关的事务,如HTTP请求等;
5.UI后端(UI backend):负责绘制提示框等浏览器组件,其底层使用的是操作系统的用户接口;
6.JavaScript解释器(JavaScript interpreter):负责解析和执行JavaScript代码;
7.数据存储(Data storage):负责持久存储诸如cookie和缓存等应用数据。
渲染引擎及关键渲染路径(Critical Rendering Path)
渲染引擎所做的事是将请求内容展现给我们,默认支持HTML,XML和图片类型,对于其他诸如PDF等类型的内容则需要安装相应插件,但浏览器的展示工作流程基本是一样的。
通过网络模块加载到HTML文件后渲染引擎渲染流程如下,这也通常被称作关键渲染路径(Critical Rendering Path):
- 1.构建DOM树(DOM tree):从上到下解析HTML文档生成DOM节点树(DOM tree),也叫内容树(content tree);
- 2.构建CSSOM(CSS Object Model)树:加载解析样式生成CSSOM树;
- 3.执行JavaScript:加载并执行JavaScript代码(包括内联代码或外联JavaScript文件);
4.构建渲染树(render tree):根据DOM树和CSSOM树,生成渲染树(render tree);
渲染树:按顺序展示在屏幕上的一系列矩形,这些矩形带有字体,颜色和尺寸等视觉属性。
- 5.布局(layout):根据渲染树将节点树的每一个节点布局在屏幕上的正确位置;
- 6.绘制(painting):遍历渲染树绘制所有节点,为每一个节点适用对应的样式,这一过程是通过UI后端模块完成;
为了更友好的用户体验,浏览器会尽可能快的展现内容,而不会等到文档所有内容到达才开始解析和构建/布局渲染树,而是每次处理一部分,并展现在屏幕上,这也是为什么我们经常可以看到页面加载的时候内容是从上到下一点一点展现的。
渲染引擎流程图
Webkit渲染引擎流程如下图:
Gecko渲染引擎流程如下图:
如上图,Webkit浏览器和Gecko浏览器渲染流程大致相同,不同的是:
如上图,Webkit浏览器和Gecko浏览器渲染流程大致相同,不同的是:
- 1.Webkit浏览器中的渲染树(render tree),在Gecko浏览器中对应的则是框架树(frame tree),渲染对象(render object)对应的是框架(frame);
- 2.Webkit中的布局(Layout)过程,在Gecko中称为回流(Reflow),本质是一样的,后文会解释回流的另一层含义–重新布局;
- 3.Gecko中HTML和DOM树中间多了一层内容池(Content sink),可以理解成生成DOM元素的工厂。
解析文档(parser HTML)
解析顺序:浏览器按从上到下的顺序扫描解析文档;