dom构建渲染过程

html-css025

dom构建渲染过程,第1张

1、构建DOM树(parse):渲染引擎解析HTML文档,首先将标签转换成DOM树中的DOM node(包括js生成的标签)生成内容树(Content Tree/DOM Tree);

2、构建渲染树(construct):解析对应的CSS样式文件信息(包括js生成的样式和外部css文件),而这些文件信息以及HTML中可见的指令(如<b></b>),构建渲染树(Rendering Tree/Frame Tree);

3、布局渲染树(reflow/layout):从根节点递归调用,计算每一个元素的大小、位置等,给出每个节点所应该在屏幕上出现的精确坐标;

4、绘制渲染树(paint/repaint):遍历渲染树,使用UI后端层来绘制每个节点。

重排必定引起重绘,重绘不一定是重排引起的。

不影响位置大小的,单纯为重绘即可 比如修改color 等。

(1)直接改变元素的className

(2)display:none;先设置元素为display:none;然后进行页面布局等操作;设置完成后将元素设置为display:block;这样的话就只引发两次重绘和重排;

(3)不要经常访问浏览器的flush队列属性;如果一定要访问,可以利用缓存。将访问的值存储起来,接下来使用就不会再引发回流;

(4)使用cloneNode(true or false) 和 replaceChild 技术,引发一次回流和重绘;

(5)将需要多次重排的元素,position属性设为absolute或fixed,元素脱离了文档流,它的变化不会影响到其他元素;

(6)如果需要创建多个DOM节点,可以使用DocumentFragment创建完后一次性的加入document;

写css最逃不开的应该是浏览器兼容问题了吧,因为css存在一些 未定义行为 ,各个浏览器都会按照自己的渲染规则来表现,就会存在表现不一致的情况,还有很多属性某些浏览器不支持,很多时候需要我们用更通用的方法来实现一些UI效果。本文重点来说说浏览器是如何把一个页面渲染出来的。

主要流程:

DOM生成、样式计算、布局、分层、图层绘制、栅格化、合成显示

下面主要讲css相关的几个步骤

我们书写的html最终都会被解析成一颗dom树,它来表达的dom结构能被浏览器所理解,那css做的就是赋予dom节点每个元素样式。当然,我们写的css也是不能直接被浏览器理解的,需要转化成styleSheets,我们在浏览器控制台输入document.styleSheets就能看到。

styleSheets要应用到各个元素上还需要两个步骤:

最后得出dom节点每个元素的具体样式。

得到dom树后,浏览器会遍历这棵树,把所有可见的节点加到布局树中,再进行布局计算,得到每个节点的坐标位置,保存在布局树中。

得到每个元素的具体位置后,还不能开始绘制页面,因为我们的页面并不是二维的,3D变换,z轴排序、页面滚动等效果都需要图层来实现。所以浏览器会为特定的节点生成专门的图层便于这些效果的实现。那什么样的节点会创建专门的图层呢,包括拥有层叠上下文属性的元素以及需要剪裁(clip)的地方,可以看一下 css(五)层叠

在浏览器开发者工具会有一个Layers标签,这里面可以直观地看到页面的分层情况

当改变了元素宽高或者几何位置的时候,就会触发 重排 ,需要走一遍完整的渲染过程,开销最大。

如果只是改变颜色,那么布局阶段就不需要执行,可以直接进入绘制阶段,所以叫 重绘 ,省去了布局和分层,效率会比重排要高一些。

而使用css的transform实现动画效果,则可以避开重绘和重排,只进行后续的合成操作,被称为 合成 ,能大大提升绘制效率。

Ps 合成操作实在非主线程(GPU进程)上执行的,不占用主线程资源

前端web页面的渲染流程

1、构建DOM与 CSSOM

浏览器通过http请求,获得静态资源后,进行页面渲染时,构建dom与cssom是同时进行的。

html 构建dom

构建dom时,按照html页面中标签的顺序,由上向下渲染。

css 构建cssom

html构建cssom的同时,将css样式构建为cssom

2、渲染树 Render Tree

该过程中DOM与CSSOM合并,生成渲染树,树中包含了渲染页面所需要的节点。

3、布局Layout

计算出每个节点对象的精确位置和大小

4、绘制Paint

使用上面准备好的节点信息,绘制出页面

javascript

我们看到,在构建DOM和CSSOM阶段,会有javascript进入

1、当浏览器遇到一个 script 标记时,DOM 构建将暂停,直至脚本完成执行。

2、JavaScript 可以查询和修改 DOM 与 CSSOM。

3、JavaScript 执行将暂停,直至 CSSOM 就绪。

————————————————

原文链接: https://blog.csdn.net/baidu_30891377/article/details/106313534