浏览器渲染页面的原理及流程

浏览器渲染页面的原理及流程css

浏览器将域名经过网络通讯从服务器拿到html文件后,如何渲染页面呢?html

1.根据html文件构建DOM树和CSSOM树。构建DOM树期间,若是遇到JS,阻塞DOM树及CSSOM树的构建,优先加载JS文件,加载完毕,再继续构建DOM树及CSSOM树。浏览器

2.构建渲染树(Render Tree)。缓存

3.页面的重绘(repaint)与重排(reflow,也有称回流)。页面渲染完成后,若JS操做了DOM节点,根据JS对DOM操做动做的大小,浏览器对页面进行重绘或是重排。服务器

1、构建DOM树及CSSOM树网络

1.1构建DOM树async

HTML 文档中的全部内容皆是节点,各节点之间拥有层级关系,如父子关系、兄弟关系等,彼此相连,构成DOM树。最多见的几种节点有:文档节点、元素节点、文本节点、属性节点、注释节点布局

DOM节点树中节点与HTML文档中内容一一对应,DOM树构建过程:读取html文档,将字节转换成字符,肯定tokens(标签),再将tokens转换成节点,以节点构建 DOM 树。以下图所示:性能

                        

 1.2构建CSSOM树字体

 CSS文档中,全部元素皆是节点,与HTML文件中的标签节点一一对应。CSS中各节点之间一样拥有层级关系,如父子关系、兄弟关系等,彼此相连,构成CSSOM树。

在构建DOM树的过程当中,在 HTML 文档的 head 标签中遇到 link 标签,该标签引用了一个外部CSS样式表。因为预见到须要利用该CSS资源来渲染页面,浏览器会当即发出对该CSS资源的请求,并进行CSSDOM树的构建。

CSSOM树构建过程与DOM树构建流程一致:读取CSS文档,将字节转换成字符,肯定tokens(标签),再将tokens转换成节点,以节点构建 CSSOM 树。以下图所示:

                                              

.CSS文件,又名层叠样式表。当CSSOM树生成节点时,每个节点首先会继承其父节点的全部样式,层叠覆盖,而后再以"向下级联"的规则,为该节点应用更具体的样式,递归生成CSSOM树。譬如,上右图中第二层的p节点,有父节点body,所以该p将继承body节点的样式:"font-size: 16px;"。而后再应用该p节点自身的样式:"font-weight: bold;"。因此最终该p节点的样式为:"font-size: 16px;font-weight: bold;"。

1.3加载JS

若在构建DOM树的过程当中,当 HTML 解析器遇到一个 script 标记时,即遇到了js,将当即阻塞DOM树的构建,将控制权移交给 JavaScript 引擎,等到 JavaScript 引擎运行完毕,浏览器才会从中断的地方恢复DOM树的构建。
其根本缘由在于,JS会对DOM节点进行操做,浏览器没法预测将来的DOM节点的具体内容,为了防止无效操做,节省资源,只能阻塞DOM树的构建。譬如,若不阻塞DOM树的构建,若JS删除了某个DOM节点A,那么浏览器为构建此节点A花费的资源就是无效的。

若在HTML头部加载JS文件,因为JS阻塞,会推迟页面的首绘。为了加快页面渲染,通常将JS文件放到HTML底部进行加载,或是对JS文件执行async或defer加载。

二.构建渲染树

渲染树(Render Tree)由DOM树、CSSOM树合并而成,但并非必须等DOM树及CSSOM树加载完成后才开始合并构建渲染树。三者的构建并没有前后条件,亦非彻底独立,而是会有交叉,并行构建。所以会造成一边加载,一边解析,一边渲染的工做现象。

构建渲染树,根据渲染树计算每一个可见元素的布局,并输出到绘制流程,将像素渲染到屏幕上。

三.页面的重绘(repaint)重排(reflow)

 3.1重绘(repaint):屏幕的一部分要重绘。渲染树节点发生改变,但不影响该节点在页面当中的空间位置及大小。譬如某个div标签节点的背景颜色、字体颜色等等发生改变,可是该div标签节点的宽、高、内外边距并不发生变化,此时触发浏览器重绘(repaint)。

 3.2重reflow:也有称回流,当渲染树节点发生改变,影响了节点的几何属性(如宽、高、内边距、外边距、或是float、position、display:none;等等),致使节点位置发生变化,此时触发浏览器重排(reflow),须要从新生成渲染树。譬如JS为某个p标签节点添加新的样式:"display:none;"。致使该p标签被隐藏起来,该p标签以后的全部节点位置都会发生改变。此时浏览器须要从新生成渲染树,从新布局,即重排(reflow)。

注意:重排必将引发重绘,而重绘不必定会引发重排。

什么时候回引发重排?

当页面布局和几何属性改变时就须要重排。下述状况会发生浏览器重排:

一、添加或者删除可见的DOM元素;

二、元素位置改变——display、float、position、overflow等等;

三、元素尺寸改变——边距、填充、边框、宽度和高度

四、内容改变——好比文本改变或者图片大小改变而引发的计算值宽度和高度改变;

五、页面渲染初始化;

六、浏览器窗口尺寸改变——resize事件发生时;

3.3如何减小和避免重排

Reflow 的成本比 Repaint 的成本高得多的多。一个节点的 Reflow 颇有可能致使子节点,甚至父节点以及兄弟节点的 Reflow 。在一些高性能的电脑上也许还没什么,可是若是 Reflow 发生在手机上,那么这个过程是延慢加载和耗电的。----浏览器的渲染原理简介

1. 直接改变className,若是动态改变样式,则使用cssText(考虑没有优化的浏览器);

2. 让要操做的元素进行”离线处理”,处理完后一块儿更新;

a) 使用DocumentFragment进行缓存操做,引起一次回流和重绘;
b) 使用display:none技术,只引起两次回流和重绘;
c) 使用cloneNode(true or false) 和 replaceChild 技术,引起一次回流和重绘;

3.不要常常访问会引发浏览器flush队列的属性,若是你确实要访问,利用缓存;

4. 让元素脱离动画流,减小回流的Render Tree的规模;

相关文章
相关标签/搜索