前言
其实关于浏览器原理这一块的理解,我个人来说是比较魔幻和懵的一个事情,因为大多是理论知识所以平常看到的时候页就很难有什么感触,所以今天写下一篇文章记录自己对于浏览器原理相关知识的理解过程,也是为了面试。
渲染篇
具体过程
- 构建dom树
- cssdom
- 布局阶段
- 分层
- 绘制
- 分块
- 光栅化
- 合成
1. 构建dom
渲染进程将html文件内的标签内容转换为浏览器可以理解的dom树(而这个dom树会在css解析过程中被添加上另外一些信息变成css树)(这个可以理解,但是浏览器具体有哪些进程呢,然后就去b站看视频) 视频结果
- Dom解析
- css解析
- 样式计算
- 布局树
- 图层树
- 绘制
- 合并图层 显然视频内容对于渲染原理解析是进行简化了部分的
1.1浏览器进程:
- 渲染进程
- 插件进程
- 网络进程
- 浏览器主进程
- GPU进程
2. cssDom 对css进行解析生成css树(这里的css树后面又会被添加上其它的信息变成布局树)
3. 样式计算
对margin之类的css属性进行计算方便在之后让dom树+css树生成布局树再进行绘制
4.dom树+css树 --》布局树
5.根据布局树生成图层树
就像人类会根据肤色、地域来划分不同人种一样,那么图层又会划分为哪几类图层呢,其实图层就分两种类型:一个是最基础的body标签在同一平面的普通图层,另一个是和body元素不在同一平面内的独立图层
注意点:含有css动画的dom元素在执行动画过程中属于单独的图层,而在执行动画完毕后会回归普通图层
6.绘制(前五个步骤都还没开始在浏览器上渲染,从此步骤开始渲染 )(在gpu中进行绘制)
- 先绘制html页面,即基础图层
- 再绘制各个独立图层(是逐个绘制)
- 最后将绘制出来的各个图层组合起来
tip
这里我在使用浏览器性能分析工具时发现很多网页会有在进行这6个步骤后再次重复执行这几个步骤的行为,而这就涉及到另外几个知识点: 重排,重绘,合成。
- 重排
更新元素集合属性触发 - 重绘
通过js更改元素属性
执行效率比重排效率高 - 合成
效率最高