update: reflow

This commit is contained in:
qianguyihao 2021-01-19 21:23:49 +08:00
parent 0c3df74022
commit a06e66c726
2 changed files with 51 additions and 25 deletions

View File

@ -3,22 +3,6 @@
## 前言
> 接下来的几篇文章讲一下二面的内容
**二面的内容**
- 渲染机制
- JS 运行机制
- 页面性能
- 错误监控
本文接下来讲渲染机制
**渲染机制**包括的内容
- 什么是DOCTYPE及作用
@ -27,6 +11,7 @@
面试经常会问在浏览器中输入url发生了哪些事情其中有一部就是浏览器的渲染过程
- Reflow重排
面试官问完了渲染机制一般会紧接着问重排Reflow你可千万别说你没听过
@ -37,6 +22,7 @@
这里的Layout指的是浏览器的Layout
## 什么是DOCTYPE及作用
### 定义
@ -91,6 +77,7 @@ PS该DTD包含所有的HTML元素和属性但包括展示性的和弃用
## 浏览器的渲染过程
### 渲染树
![](http://img.smyhvae.com/20210118-2005.png)
@ -115,7 +102,7 @@ PS该DTD包含所有的HTML元素和属性但包括展示性的和弃用
- 渲染树Render Tree: DOM 树与 CSSOM 树合并后形成渲染树渲染树只包含渲染网页所需的节点但并不知道位置
- 布局Layout: **通过布局计算出每个节点在屏幕中的位置**(大小颜色等)
- 布局Layout: 计算出每个节点在屏幕中的**位置和大小**
- 绘制Painting按照算出来的规则通过显卡把内容画出来
@ -147,32 +134,57 @@ PS该DTD包含所有的HTML元素和属性但包括展示性的和弃用
5conmposite同上一段
理论上上面的五个步骤都是必须要经历的但是有些样式并不会影响布局也不会影响绘制所以浏览器对这方面的性能进行了优化并不一定要经历布局和绘制这两个过程这就需要我们先了解一下重排重绘这两个概念详见下一段
理论上上面的五个步骤都是必须要经历的布局和绘制是关键渲染路径中最重要开销最高的两个步骤
## Reflow重排
但是有些样式并不会影响布局也不会影响绘制所以浏览器对这方面的性能进行了优化并不一定要经历布局和绘制这两个过程这就需要我们先了解一下重排重绘这两个概念详见下一段
## Reflow重排回流
### 定义
**重排 Reflow**DOM结果中的各个元素都有自己的盒子模型这些都需要浏览器**根据各种样式来计算并根据计算结果将元素放在它该出现的位置**这个过程称之为Reflow
**重排 Reflow**
渲染对象在创建完成并添加到渲染树时是将DOM节点和它对应的样式结合起来并不包含位置和大小信息
我们还需要通过 `Layout` 布局阶段来计算它们在设备视口(viewport)内的确切位置和大小计算这些值的过程称为`回流``布局``重排`
### 什么时候触发 Reflow
- 增加删除修改DOM节点时会导致 Reflow Repaint
参考链接
- 移动DOM的位置或是加个动画的时候
- [从浏览器渲染原理浅谈回流重绘与性能优化](https://www.cnblogs.com/xiahj/p/11777786.html)
- [你真的了解回流和重绘吗](https://github.com/chenjigeng/blog/issues/4)
### 什么时候会触发 Reflow
> 核心就是围绕DOM元素的**大小****位置**
- 增加删除DOM节点
- display: none
- 移动元素位置或是增加动画
- 修改CSS样式时宽高display 为none等都是通过css样式来修改的
- 当用户Resize窗口时移动端没有这个问题或是滚动的时候**有可能**会触发具体要看浏览器的规则
- offsetLeftscrollTopclientWidth
- 修改网页的默认字体时这个影响非常严重
- 修改浏览器窗口大小时即Resize窗口移动端没有这个问题或是滚动的时候**有可能**会触发具体要看浏览器的规则
- 修改网页的默认字体时这个很消耗性能
**面试总结**
首先要答出 Reflow 定义其次什么时候触发至少要答出两条更进一步面试官可能还会问你**怎么避免reflow**这个自己去查查吧
## Repaint重绘
### 定义

View File

@ -11,3 +11,17 @@
关于浏览器的渲染机制可以看本教程的另外一篇文章
> 前端面试/面试必看/浏览器渲染机制.md
## 避免布局抖动layout thrashing
1尽量避免 reflow
比如说如果想改变一个元素的位置很多人可能会使用相对布局的lefttop属性但是这个属性会引起 reflow我们可以使用 `transfrom:translate`让元素做位移这个属性既不会触发 reflow也不会触发 repaint只会触发 conmposite
再比如说vuereact这样的框架采用了虚拟DOM它会把涉及到DOM修改的操作积攒起来然后统一计算批量处理最后应用到真正的DOM上
2读写分离
## 使用FastDom 做防抖