返回

浅析前端面试中的重排与重绘

前端

在这个急速发展的互联网时代,技术领域中往往会有层出不穷的精彩面试题,时时刻刻考验着广大技术工作者的知识储备。近日,一道字节前端提前批面试题更是让笔者受益匪浅,刷新了笔者的认知,也让我对重排与重绘有了更深入的理解。

本文将以字节面试题为例,详细分析重排与重绘的概念,并探讨其触发条件与相互关系。此外,笔者还将分享一些相关的知识点和笔者的个人见解,希望能够给各位读者带来启发和帮助。

面试题解析

问题: 触发了几次回流几次重绘

const div = document.querySelector('div');
div.offsetWidth; // 1
div.style.color = 'red'; // 2
console.log(div.offsetWidth); // 3

乍一看,笔者认为该问题答案应该是:3次回流、3次重绘。

分析:

  • offsetWidth: 获取元素的宽度,需要重新计算元素的布局,因此会触发回流。
  • style.color: 修改元素的样式,需要重新绘制元素,因此会触发重绘。

但是,后来笔者发现了一个关键点,即:offsetWidth在获取元素的宽度时,会触发渲染队列的刷新。而在本例中,之前的渲染队列为空,因此不会触发回流。因此,该问题答案实际上应该是:2次回流、3次重绘

重排与重绘的概念

重排(reflow): 当元素的布局或几何属性发生变化时,浏览器需要重新计算元素的位置和大小。这个过程称为重排。

重绘(repaint): 当元素的外观发生变化,但其布局或几何属性保持不变时,浏览器需要重新绘制元素。这个过程称为重绘。

重排与重绘的触发条件

重排的触发条件:

  • 改变元素的几何属性(例如:width、height、margin、padding)
  • 改变元素的显示属性(例如:display、visibility)
  • 插入或删除元素
  • 元素内容发生变化

重绘的触发条件:

  • 改变元素的颜色或背景颜色
  • 改变元素的字体或字体大小
  • 改变元素的文本内容

重排与重绘的相互关系

重排和重绘是一个相互关联的过程。重排会导致重绘,但重绘不一定会导致重排。例如,如果我们改变元素的颜色,这将触发重绘,但不会触发重排。但是,如果我们改变元素的宽度,这将触发重排,随后也会触发重绘。

优化重排与重绘

为了优化网站性能,减少重排和重绘的次数非常重要。这里有一些技巧:

  • 避免频繁更改元素的几何属性。
  • 使用CSS3 transform和animation代替JavaScript来更改元素的位置和大小。
  • 使用requestAnimationFrame()来批量更新多个元素的样式。
  • 在DOM树的末尾添加或删除元素。