前端必看!重排和重绘别再搞混了🔥面试高频考点+避坑技巧

家人们谁懂啊!前端面试被问重排重绘,明明背过却答得磕磕绊绊😭 而且工作中不小心写多了重排代码,页面直接卡成PPT…今天就用最通俗的话,把重排、重绘讲明白,再附上避坑技巧,不管是面试还是实际开发都能用得上,建议收藏备用✅

先搞懂前提:浏览器渲染页面的完整流程(简单记这5步,不用死记硬背)
构建DOM树 → 构建CSSOM → 构建渲染树 → 布局渲染树 → 绘制渲染树
简单说:布局阶段算好每个元素的大小、位置(给元素定坐标),绘制阶段再把元素画到屏幕上。重排和重绘,就是这两个阶段出了“重复工作”!

一、重排(回流):最费性能的“大动作”⚠️

一句话总结:元素的“身材”“位置”变了,浏览器得重新算布局、重新排元素,相当于把页面重新“摆一遍”。

比如你把一个div的宽度从100px改成200px,或者把它从左边移到右边,浏览器就得重新计算所有相关元素的位置和尺寸,这就是重排。

重点:重排一定会触发重绘(摆完位置总得重新画吧),而且开销极大,尤其是页面元素多的时候!

这些场景一定会触发重排(记牢,面试必问):

  • 页面第一次渲染(这是开销最大的一次重排,没法避免)

  • 添加/删除可见的DOM元素(比如点击按钮加个div)

  • 改变元素位置(比如用left/top移动,或者float、flex布局调整)

  • 改变元素尺寸(边距、填充、边框、宽度、高度随便改一个)

  • 改变元素内容(文字变多/变少、图片加载完成后尺寸变化)

  • 改变字体大小(整个页面的文字布局都会变)

  • 浏览器窗口 resize(比如拉大缩小浏览器)

  • 激活CSS伪类(比如hover,有些hover会改变元素尺寸/位置)

  • 查询某些属性/调用方法(重点坑!offsetWidth、offsetHeight、scrollTop这些,会强制刷新DOM队列,触发重排)

二、重绘:相对“轻量”的“小修改”✅

一句话总结:元素的“身材”“位置”没变,只是换了件“衣服”,浏览器只需要重新画这个元素,不用动整体布局。

比如给div改个颜色、换个背景图、改个字体样式,元素还是原来的大小和位置,这就是重绘。

重点:重绘不一定会触发重排,开销比重排小很多,但频繁重绘也会卡顿哦!

三、最关键!减少重排的实用技巧(核心:少折腾DOM)

面试必问+工作必用,直接上代码对比,一看就会!

技巧1:样式集中改变,别频繁操作style

反面例子(踩坑!):


// bad 多次操作style,触发多次重排

var left = 10;

var top = 10;

el.style.left = left + "px";

el.style.top = top + "px";

正面例子(推荐!):


// better 用cssText一次性修改

el.style.cssText += "; left: " + left + "px; top: " + top + "px;";



// 更优 直接加类名(推荐,更易维护)

el.className += " className";

技巧2:分离DOM读写操作,别穿插着来

坑点:DOM读操作(查属性)和写操作(改样式)穿插,会强制刷新队列,触发多次重排!

反面例子(踩坑!):


// bad 强制刷新 触发四次重排+重绘

div.style.left = div.offsetLeft + 1 + 'px';

div.style.top = div.offsetTop + 1 + 'px';

div.style.width = div.offsetWidth + 1 + 'px';

div.style.height = div.offsetHeight + 1 + 'px';

正面例子(推荐!):


// better 先读所有需要的属性,再一次性写操作

var left = div.offsetLeft;

var top = div.offsetTop;

var width = div.offsetWidth;

var height = div.offsetHeight;



div.style.left = left + 1 + 'px';

div.style.top = top + 1 + 'px';

div.style.width = width + 1 + 'px';

div.style.height = height + 1 + 'px';

最后总结(面试速记)

  1. 重排=改布局(尺寸/位置),重绘=改外观(颜色/背景);

  2. 重排必重绘,重绘不一定重排;

  3. 减少重排核心:集中操作样式、分离DOM读写、减少不必要的DOM操作。

家人们,你们面试被问过重排重绘吗?有没有踩过相关的坑?评论区交流一下,互相避坑👇

觉得有用的话,点赞收藏,关注我,后续更前端面试高频干货!💪

PS:打个小广告🚀 我是24届前端,拿了八个大厂offer,大部分ssp。最近在辅导一些同学,大多数同学都拿到了心仪的大厂offer,感兴趣的26-28届同学可以私信我了解哈(深度八股文、ssp项目、顶级简历修改,挖掘包装项目重难点、模拟面试等全流程服务)

#前端##前端实习##简历##暑期实习#
全部评论

相关推荐

03-14 11:45
golang
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务