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

家人们谁懂啊!前端面试被问重排重绘,明明背过却答得磕磕绊绊😭 而且工作中不小心写多了重排代码,页面直接卡成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项目、顶级简历修改,挖掘包装项目重难点、模拟面试等全流程服务)

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

相关推荐

昨天 20:39
已编辑
门头沟学院 Web前端
1. 主要写前端还是后端(前端)2. 简单说一下盒模型有什么参数(只说出weight/height/padding/margin后耻辱下播,后面追问box-sizing内写什么说了个flex/grid,简直耻辱完了)3. 对于一个多列,用什么渲染方式比较好(grid/hidden table)4. Tailwind与传统css最大区别(className代替复写样式)5. tailwind缺点(说了个apply复用样式,可读性ai好但是对人而言要复制重复维护,退化标准css)6. 自己项目部分7. Vue2/Vue3之间最大的差异(definProperty/Proxy包装器)√8. 解释一下浏览器缓存工作方式(CacheControl/ETag,会请求服务端是否有修改,如果没有修改会返回204空缓存(但实际是304))9. 详细说明浏览器缓存控制头有什么(只答出了CacheControl/ETag/Vary/Hash比较,没有详细说明强缓存和协商缓存详细区分)10. 跨域,CORS,同源策略(同源:协议/域名/端口三元组,策略:不同源默认opaque不允许js读取,要检查ACAO,默认不携带Cookie,要ACAC)√11. CSRF,诱导提及√12. Cookie/JWT √(但是被误导,认为JWT传输的是密文,实际上是明文传输(b64)但是有签名。不能被篡改特性是提及了,经过面试官提醒才发现传的是明文)13. EventLoop机制(宏任务/微任务/rAF刷新)√14. 判断题:console.log(1)setTimeout(() => {console.log(2)}, 0)Promise.resolve().then(() => {console.log(3)})console.log(4)顺序1432 但是4和3纠结了一段时间,虽然结果是正确的13. html中async/defer标签的含义(完蛋了只说了async是异步的,还把dom加载完成后才加载defer套到async上了)14. Vite为什么**开发环境**这么快(ESBuild,动态加载浏览器需要的内容,不事先编译)√15. Shaking的机制和一票否决情况(摇掉死叶子,去除那些导入但不用的组件。只说了CJS因为动态导入无法静态分析、可以在import的时候判断是否有导入和使用,经过面试官重述才明白还有Global副作用的影响)16. 手撕题:展平一个有多层嵌套的数组本来想用reduce的,卡了10分钟,结果耻辱用递归和...arr展开完成了唯一解法17. base地(优先杭州,北京也可)、实习时长、多久到岗18. 反问(这里结束的很急,没有主动问要不要反问什么,看起来面试官不想过多说,经提醒才说可以,不过这个时间已经拖到45min了):18.1 进去之后干什么(回答很模糊,说很多业务已经迁移到中后端,研发中心主要在北京和深圳) 18.2 反问面试过程中有什么不足(说很扎实,但是又没说什么不好的地方,很客套) 18.3 问暑期实习相关问题,明确说不保证。总体来讲,感觉很有可能是mt面,八股居多,项目很少。尽管大部分八股算是能答出来,但是只能算及格线水平。尤其是反问环节结束的非常仓促,感觉面过的可能性不大。字节一面明显八股偏多,而且最后的岗位问题听起来是没有hc名额了,进的概率不大。当天晚上补充:寄了
查看19道真题和解析
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

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