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

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

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

相关推荐

一面 面试官非常专业问问题非常有条理,是在我介绍项目的中途插入一些扩展性问题或者基础性八股,一面无手撕1.介绍一下你对 HTTP 这个协议的一些理解2.HTTP2 的多路复用解决了并行发送的问题,但是在一条链路中并行发送 123 这些数据,它怎么知道哪些数据是属于第一个请求?哪些属于第二个请求?接收端它怎么知道当前收到这个数据包,它是属于一还是属于 2 还是属于3?3.有没有更深入一点的理解HTTP2 头部压缩是做什么?4.HTTP 的缓存机制5.项目实际项目之中是怎么去配置和怎么利用协商缓存和强缓存机制?实际项目中应该怎么去考量这个时间和过期机制?6.加载相关的优化业界是有哪些常见的优化方案?7.CDN详细说一下8.懒加载是怎么达到优化效果?以及它的核心理念是怎么样的?9.无限滚动那种场景除了你刚刚说的这个懒加载,这种长列表还有没有其他一些优化点呢?10.上面已经滚动到可视区以外的内容进行一个处理,具体是做了什么?(回收DOM)11.介绍一个你觉得最能体现你技术能力的一个功能或项目12.长列表的图片的延迟加载。用户他可能很快的往下滑,比如说他当前是属于第一屏。他下面的第二、第三屏,你们是先用占位的空间占着那个图片的位置。用户他可能一滑的话立马划过了,一下子到了第五、第六屏。那么第二、第三屏这些被他快速划过了,你们还会继续去加载渲染图片吗?(回答防抖优化)13.平时在开发项目和学习的过程中,你是有用 AI 吗?14.开发项目的流程之中有没有使用 AI 去帮你开发项目?会用哪些 AI 的工具呢?15.IDE 相关的有没有用?比如说 cursor 啊?平时 cursor 开发具体是怎么去用吗?比如说让它去给你开发项目的时候。16.用这种 cursor agent AI 给你开发这个过程之中,你觉得会有哪些坑?17.有没有了解过业界在编程使用 AI 的一些最佳实践或工作流?或者一些相关的配套的 skill MCP 还有实践经验来帮你更好的开发呢。18.除了开发之外,在哪些编程的节点或流程上,你觉得可以用 AI 继续进行一些辅助或者是提效的呢。19.在实际使用中或者你什么经验去怎么去review,或者是测试 AI 的产出,避免幻觉呢?20.有没有了解过多 agent 甚至是 team 模式?你觉得怎么利用多 agent 甚至是 agent 质检的这种模式在接入我们的开发流程之中呢?你觉得比较理想的,又能提高效率,又能提高 agent 的自身的代码质量的一个流程是怎么样?21.你平时是怎么去关注现在迭代很快的 AI 知识,或者是一些理论或一些实践22.有了解最近 Git上在编程方面有哪些比较火的一些项目吗?23.有没有自己搭一些openclaw?二面面试官也非常好1.实现流式传输,为什么选择RXJS,而不是用原生的event source? RXJS的核心价值是什么?2. SSE 和 Web SOCKET 有什么区别?3.流式输出的话在前端怎么渲染的?是逐字的去追加 DOM 呢?还是做缓冲区批量更新?有没有遇到一个频繁的DOM 更新导致的性能问题4.文件上传解析这部分前端主要负责的哪些部分?主要做了些什么?5.在这个项目中,你觉得前端部分和后端部分的工作量大概是什么比例?6.keepalive的作用7.typescript 的 type 和interface有什么区别?8.BFC是什么?9.从这个浏览器地址栏输入一个 URL 地址到页面呈现的一个过程10.webpack和vite11.算法题:防抖12.前面几次面试的不足点13.vue、node更擅长哪一块?14.职业发展方向?15.AI 的这个辅助编码和独立编码怎么看16.让你快速上手react ,会有一些什么方式三面实习经历为什么会考虑前端开发自学前端的学习路径选一个有挑战性的项目讲讲,有没有可以优化的点学习 AI 大概多久了skill 跟 MCP 有什么区别有开发过 skill 吗openclaw怎么实现用户需求的个人规划实现一个谷歌、百度首页搜索框要注意哪些点?算法:找一个链表中间的节点、找一个链表倒数第n个节点已oc,祝大家早日上岸
点赞 评论 收藏
分享
评论
1
6
分享

创作者周榜

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