浏览器渲染页面的大致过程
2021-09-01 本文已影响0人
路人丁0417
[图片上传失败...(image-735179-1630336184679)]
-
渲染引擎启动html解释器(htmlParser)解析html源码,根据DOM API创建dom tree,Browser进程并行下载网络资源(css/image/js...)。
在dom树中,每个html标签都有一个对应的节点,每个文本也有对应的文本节点,根节点就是documentElement,对应的是html节点。当遇到script节点时,将启动js引擎解析脚本,此时会阻塞DOM树的构建。
当DOM树构建完成时,DOMContentLoaded事件会被触发。
当DOM树构建完成,并且页面依赖的资源(图片、视频等) 都下载完了,onload事件会被触发。 -
渲染引擎启动css解释器(cssParser,cssGrammer)处理css源码,计算出最终样式,根据CSSOM API(css对象模型)构建cssRuleTree(css规则树),忽略其中的非法语法。
-
渲染引擎将domTree和cssRuleTree 合成rendering tree(渲染树),计算各个节点在页面上的布局或排版,忽略head、display:none的元素,每行都是独立的文本节点,每个节点都有对应的css。
-
当渲染树创建后,浏览器就会绘制(paint)页面到屏幕上。
这个过程并不是一次完成,实际上css和js会多次修改dom或者cssom。
重排/回流以及重绘
重排(reflow):元素的宽高引起布局的改变,就需要重排,重排后一定会重绘;
重绘(repaint):元素的颜色、透明度、字体样式变化会重绘,重绘不一定引起重排;
引起重排:
- 添加删除可见的dom元素;
- 元素位置、大小的变化;
- 内容改变;
- 页面渲染器初始化;
- 浏览器窗口大小改变;
避免重排和重绘:
- 使用类名来切换样式;
- 多个样式写在一起;
- 批量修改样式(先将需要改变的部分隐藏起来(display:none),修改后再展示)
- 缓存布局信息(offsetLeft,clientTop);当需要多次获取这些信息时,将其保存在一个临时变量中,通过访问变量得到这些值。
- 使用visible:hidden;代替display:none;