每天一个面试点!

85 阅读1分钟

如何最小化重绘和(repaint)和回流(reflow)

一、什么是重绘,什么是回流呢?

  • 重绘:当元素的一部分属性发生了改变,如外观、背景、颜色等不会引起布局变化,只需要浏览器根据元素的新属性重新绘制,使元素呈现新的外观叫做重绘。

  • 重排(回流) :当render树中的一部分或者全部因为大小边距等问题发生改变而需要DOM树重新计算的过程

敲重点了啊 : 重绘不一定会导致回流(比如颜色的改变),但是回流一定会导致重绘(比如改变网页的位置 等)

那么回归主题!

如何最小化重绘和回流呢!

  • 方法1、需要对元素进行复杂的操作时,可以 先隐藏(display:“none”),操作完成后在显示

  • 方法2、需要创建多个 DOM 节点时,使用 documentFragment 创建完后一次性的加入 document缓存 Layout 属性值,如: let left = elem.offsetleft; 这样,多次使用 left 只产生一次回流

  • 方法3、尽量避免用 table 布局 (table 元素一旦触发回流就会导致 table 里所有的其他元素回流)

  • 方法4、避免使用 css 表达式 (expression),因为每次调用都会重新计算值 (包括加载页面)

  • 方法5、尽量使用 css 属性简写,如: 用border 代替 border-width,border-style,border-color

  • 方法6、批量修改元素样式:elem.className 和 elem.style.cssText 代替 elem.style.xxxx