返回
浅析前端面试中的重排与重绘
前端
2024-02-21 12:43:09
在这个急速发展的互联网时代,技术领域中往往会有层出不穷的精彩面试题,时时刻刻考验着广大技术工作者的知识储备。近日,一道字节前端提前批面试题更是让笔者受益匪浅,刷新了笔者的认知,也让我对重排与重绘有了更深入的理解。
本文将以字节面试题为例,详细分析重排与重绘的概念,并探讨其触发条件与相互关系。此外,笔者还将分享一些相关的知识点和笔者的个人见解,希望能够给各位读者带来启发和帮助。
面试题解析
问题: 触发了几次回流几次重绘
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树的末尾添加或删除元素。