2-19 谈谈你对重绘和回流的理解?
浏览器渲染的理解
首先要理解,为什么会有回流和重绘的这个名词的出现,要知道,浏览器其实也是一个软件,浏览器在将html 字符串和css 字符串,解析为dom,样式的过程,被称为解析过程,最终会渲染为一棵DOM树和一棵style树,结合形成渲染树,之后浏览器,在将解析,已经解析好的元素位置大小,颜色信息,通过,浏览器底层自行运行的底层指令,进行渲染。最后在页面中呈现出网页的样子
重绘?
当一个元素的外观发生改变,但没有改变布局,重新把元素外观绘制出来的过程,叫做重绘。表现为某些元素的外观被改变
回流?
当DOM
的变化影响了元素的几何信息,浏览器需要重新计算元素的几何属性,将其安放在界面中的正确位置,这个过程叫做重排。表现为重新生成布局,重新排列元素。
他们的区别?
可以看出,回流的影响是巨大的,他会导致,浏览器重新的去计算,会消耗大量的性能,而重绘,只是由于外观的变化,才会触发,所以得出:回流一定会导致重绘,而重绘不能导致回流
如何触发回流和重绘?
- 添加、删除、更新DOM节点
- 通过display: none隐藏一个DOM节点-触发重排和重绘
- 通过visibility: hidden隐藏一个DOM节点-只触发重绘,因为没有几何变化
- 移动或者给页面中的DOM节点添加动画
- 添加一个样式表,调整样式属性
- 用户行为,例如调整窗口大小,改变字号,或者滚动
如何避免触发回流和重绘
集中改变样式
,不要一条一条地修改 DOM 的样式。- 不要把 DOM 结点的属性值放在循环里当成循环里的变量。
- 为动画的 HTML 元件使用
fixed
或absoult
的position
,那么修改他们的 CSS 是不会 reflow 的。 - 不使用 table 布局。因为可能很小的一个小改动会造成整个 table 的重新布局。
- 尽量只修改
position:absolute
或fixed
元素,对其他元素影响不大 - 动画开始
GPU
加速,translate
使用3D
变化 - 提升为合成层