重绘(Repaint)是浏览器渲染引擎中的一个过程,指的是当页面中元素的外观样式发生变化,但是这些变化不影响元素在文档流中的位置时,浏览器重新绘制该元素外观的过程,重绘是对元素视觉表现的更新,比如改变元素的背景色、边框颜色、文字颜色等,这些改动不需要浏览器重新计算元素的大小或位置,因此不会引起布局的调整。
避免频繁修改样式属性:尽量减少对影响元素外观样式的属性(如颜色、背景等)的动态修改,特别是在循环或高频事件处理中。
使用CSS动画和过渡:相较于JavaScript控制的动画,CSS的transition
和@keyframes
动画可以在合成线程上运行,不会阻塞主线程,减少了重绘的需求。
批量修改样式:如果需要修改多个样式属性,尽可能一次性修改,而不是逐个修改,这样可以将多次重绘合并为一次。
使用will-change
属性:当确实需要改变某个元素的属性时,可以预先使用will-change
属性告诉浏览器哪些属性即将发生变化,让浏览器提前做好优化准备。
避免强制同步布局读取:减少使用诸如offsetWidth
、offsetHeight
等会触发强制同步布局的属性读取,因为这些读取操作会导致浏览器立即计算布局,从而可能触发不必要的重绘。
利用层叠上下文:创建新的层叠上下文(如通过transform: translateZ(0)
或will-change
等)可以使元素独立于其他元素重绘,有助于限制重绘的范围。
文档片段操作:当需要大量添加或修改DOM节点时,先使用DocumentFragment
在内存中构建好DOM结构,然后再一次性添加到文档中,这样可以减少重排和重绘次数。
合理使用CSS:避免使用会引起回流(重排)的CSS属性(如宽度、高度、浮动、定位等),转而使用不会影响布局的属性,如transform
进行位移和旋转。