这时候你要先了解防抖、节流(可以看看我的文章)
防抖 任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行(比如说我们一直点击按钮 只有不点击按钮之后1秒才会触发)
节流 指定时间间隔内只会执行一次任务(比如说我们一直点击按钮 1秒之后会触发一次 然后1秒之后又会触发一次......)
重绘与回流
重绘(repaint):当元素样式的改变不影响布局时,浏览器将使用重绘对元素进行更新,此时由于只需要 UI 层面的重新像素绘制,因此损耗较少(元素背景颜色,字体颜色等的改变,不会影响到布局的就喊重绘)
常见的重绘操作:
- 改变元素颜色
- 改变元素背景色
- more ……
回流(reflow):别名又叫重排。当元素的尺寸、结构或者触发某一些属性时,浏览器会重新渲染页面,称为回流。此时,浏览器需要重新经过计算,计算后还需要重新页面布局,因此是较重的操作。(元素宽高、位置等的改变,会影响到布局的就喊回流)
常见的回流操作:
- 页面初次渲染
- 浏览器窗口大小改变
- 元素尺寸/位置/内容发生改变
- 元素字体大小变化
- 添加或者删除可见的 DOM 元素
- 激活 CSS 伪类(:hover……)
- more ……
这个与防抖跟节流有什么关系?
举个例子:界面上有个 div 框,用户可以在 input 框中输入 div 框的一些信息,例如宽、高等,输入完毕立即改变属性。但是,因为改变之后还要随时存储到数据库中,所以需要调用接口。如果不加限制......
为什么需要节流?
因为有些事情会造成浏览器的 回流,而 回流 会使浏览器开销增大,所以我们通过 节流 来防止这种增大浏览器开销的事情
好 说到这里,估摸大家都理解了 什么是重绘? 什么是回流?什么是防抖?什么是节流?如何配合防抖、节流来优化重绘和回流(减少浏览器消耗)
那我们在工作中如何避免大量使用重绘与回流呢?
1.避免频繁操作样式,可汇总之后统一修改
2.尽量使用class进行样式修改,而不是直接操作样式
3.减少DOM的操作,可使用字符串一次性插入
参考:
一篇文章搞定前端面试(https://juejin.im/post/5bbaa549e51d450e827b6b13)
2019 面试准备 - JS 防抖与节流(https://juejin.im/post/5c87b54ce51d455f7943dddb)
浏览器渲染页面过程剖析(https://www.jianshu.com/p/32ca5f1c0768)