2-19 谈谈你对重绘和回流的理解?


浏览器渲染的理解

首先要理解,为什么会有回流和重绘的这个名词的出现,要知道,浏览器其实也是一个软件,浏览器在将html 字符串和css 字符串,解析为dom,样式的过程,被称为解析过程,最终会渲染为一棵DOM树和一棵style树,结合形成渲染树,之后浏览器,在将解析,已经解析好的元素位置大小,颜色信息,通过,浏览器底层自行运行的底层指令,进行渲染。最后在页面中呈现出网页的样子

重绘?

当一个元素的外观发生改变,但没有改变布局,重新把元素外观绘制出来的过程,叫做重绘。表现为某些元素的外观被改变

回流?

DOM的变化影响了元素的几何信息,浏览器需要重新计算元素的几何属性,将其安放在界面中的正确位置,这个过程叫做重排。表现为重新生成布局,重新排列元素。

他们的区别?

可以看出,回流的影响是巨大的,他会导致,浏览器重新的去计算,会消耗大量的性能,而重绘,只是由于外观的变化,才会触发,所以得出:回流一定会导致重绘,而重绘不能导致回流

如何触发回流和重绘?

  1. 添加、删除、更新DOM节点
  2. 通过display: none隐藏一个DOM节点-触发重排和重绘
  3. 通过visibility: hidden隐藏一个DOM节点-只触发重绘,因为没有几何变化
  4. 移动或者给页面中的DOM节点添加动画
  5. 添加一个样式表,调整样式属性
  6. 用户行为,例如调整窗口大小,改变字号,或者滚动

如何避免触发回流和重绘

  1. 集中改变样式,不要一条一条地修改 DOM 的样式。
  2. 不要把 DOM 结点的属性值放在循环里当成循环里的变量。
  3. 为动画的 HTML 元件使用 fixedabsoultposition,那么修改他们的 CSS 是不会 reflow 的。
  4. 不使用 table 布局。因为可能很小的一个小改动会造成整个 table 的重新布局。
  5. 尽量只修改position:absolutefixed元素,对其他元素影响不大
  6. 动画开始GPU加速,translate使用3D变化
  7. 提升为合成层

相关