news 2026/1/19 5:08:29

重绘和重排怎么触发?怎么优化?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
重绘和重排怎么触发?怎么优化?

重绘(Repaint)

  • 定义:元素样式改变但不影响布局时触发,仅重新绘制元素外观,不改变DOM几何结构。
  • 常见场景:修改colorbackground-coloropacitybox-shadow等。

重排(Reflow)

  • 定义:元素几何属性改变(尺寸/位置/数量)时触发,浏览器需重新计算DOM布局并渲染,性能消耗远大于重绘。
  • 常见场景:修改widthheightmarginpaddingdisplay,或DOM增删、窗口resize。

核心差异

  1. 性能消耗:重排 > 重排(重排必触发重绘,重绘不一定触发重排)。
  2. 触发原因:重排是布局改变,重绘是外观改变。
  3. 影响范围:重排可能连锁影响父/子元素布局,重绘仅影响当前元素。

性能优化关键

  • 批量修改样式(用class代替inline样式)。
  • 避免频繁操作DOM,优先用文档片段DocumentFragment
  • 复杂动画用transform(GPU加速,仅触发合成层,不重排重绘)。

一、核心优化原则

重排性能消耗远大于重绘,优化核心是减少重排触发频率+缩小重排影响范围,优先规避高频布局操作。

二、落地优化方案(按优先级排序)

1. 批量操作DOM/样式,避免高频单次修改
  • 样式批量处理:用class统一切换样式,替代多次inline样式修改(减少样式计算次数)。
    // 差:3次样式修改可能触发多次重排dom.style.width='100px';dom.style.height='200px';dom.style.margin='10px';// 好:1次class切换,仅触发1次重排dom.classList.add('target-style');
  • DOM批量操作:先脱离文档流再修改,最后重新插入(避免修改时频繁触发布局计算)。
    // 方案1:隐藏元素(display: none)后操作dom.style.display='none';dom.innerHTML+='<div>新内容</div>';// 批量增删DOMdom.style.display='block';// 方案2:用DocumentFragment临时存储DOMconstfragment=document.createDocumentFragment();for(leti=0;i<100;i++){constdiv=document.createElement('div');fragment.appendChild(div);// 操作片段不触发重排}dom.appendChild(fragment);// 仅插入时触发1次重排
2. 避免触发"强制同步布局"

浏览器默认异步计算布局,若先读取布局属性(如offsetWidthscrollTop)再修改样式,会强制浏览器立即计算布局,导致性能卡顿,需先批量修改,再批量读取

// 差:读取→修改→读取,触发多次强制同步布局for(leti=0;i<doms.length;i++){constwidth=doms[i].offsetWidth;// 读取布局(触发布局计算)doms[i].style.width=`${width+10}px`;// 修改样式}// 好:先批量读取,再批量修改constwidths=[];// 1. 批量读取(仅触发1次布局计算)for(leti=0;i<doms.length;i++){widths.push(doms[i].offsetWidth);}// 2. 批量修改(仅触发1次重排)for(leti=0;i<doms.length;i++){doms[i].style.width=`${widths[i]+10}px`;}
3. 复杂动画/交互用GPU加速,规避重排重绘

transformopacity实现动画,浏览器会将元素放入独立合成层,仅触发合成操作(无重排、无重绘,性能最优),替代widthmargintop等布局属性。

/* 差:修改top触发频繁重排 */.animate-bad{position:absolute;top:0;transition:top 0.3s;}.animate-bad:hover{top:10px;}/* 好:transform仅触发合成,GPU加速 */.animate-good{transition:transform 0.3s;}.animate-good:hover{transform:translateY(10px);}
4. 缩小重排影响范围
  • position: absolute/fixed脱离文档流,元素修改仅影响自身,不连锁触发父/兄弟元素重排。
  • 避免嵌套过深的DOM结构,层级越深,重排计算范围越大。
5. 其他实用优化
  • 避免频繁查询布局属性(offsetWidthclientHeight等),缓存查询结果复用。
  • 窗口resize、滚动事件等高频触发场景,用debounce(防抖)限制执行频率,减少重排次数。
    // 滚动事件防抖,100ms内仅执行1次lettimer=null;window.addEventListener('scroll',()=>{clearTimeout(timer);timer=setTimeout(()=>{constscrollTop=document.documentElement.scrollTop;// 避免高频读取// 业务逻辑},100);});

三、总结

高频优化动作:批量操作DOM/样式+动画用transform/opacity+规避强制同步布局,这3点可解决80%的重排重绘性能问题,优先落地即可大幅提升页面流畅度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/18 14:49:03

【光照】Unity[PBR]环境光中的[漫反射]

漫反射辐照的核心作用漫反射辐照&#xff08;Diffuse Irradiance&#xff09;在URP PBR中用于模拟环境光对物体表面的均匀散射效果&#xff0c;通过预计算环境立方体贴图的低频光照信息&#xff0c;为动态物体提供间接漫反射光照。其核心公式为&#xff1a;$L_d\frac{c}{\pi}\i…

作者头像 李华
网站建设 2026/1/19 3:45:10

39、NFS与网络路由管理:配置、问题诊断及参数调优

NFS与网络路由管理:配置、问题诊断及参数调优 1. 网络路由配置 1.1 关闭IP转发 在系统启动时,如果存在 /etc/notrouter 文件,系统将不会执行IP转发。若想立即关闭IP转发,可执行以下命令: # touch /etc/notrouter # /usr/sbin/ndd -set /dev/ip ip_forwarding 01.2 …

作者头像 李华
网站建设 2026/1/18 23:52:06

CentOS7 磁盘扩容

1.在vm虚拟机中添加一个新的磁盘 在vm虚拟机中添加一个磁盘这里我添加了一个10GB的磁盘 2.对于磁盘进行分区 我们先运行 lsblk来查看我们刚刚新添加磁盘的代号可以看到我这里添加的新磁盘是sdf那么我们现在进行分区&#xff1a; fdisk /dev/sdf然后我们按n开始分区&#xff1a;…

作者头像 李华
网站建设 2026/1/17 20:35:06

PDFMathTranslate中文乱码终极解决方案:从诊断到完美修复

PDFMathTranslate中文乱码终极解决方案&#xff1a;从诊断到完美修复 【免费下载链接】PDFMathTranslate PDF scientific paper translation with preserved formats - 基于 AI 完整保留排版的 PDF 文档全文双语翻译&#xff0c;支持 Google/DeepL/Ollama/OpenAI 等服务&#x…

作者头像 李华
网站建设 2026/1/17 11:24:05

直接数字下变频 原理解释和python仿真

第一步&#xff1a;图 25.12 & 25.13 —— 寻找“完美的采样点”这两张图是在教我们怎么“偷懒”。1. 笨办法但很完美&#xff08;图 25.12&#xff09;2. 聪明的偷懒&#xff08;图 25.13&#xff09;第二步&#xff1a;图 25.14 —— 频域里的“乾坤大挪移”这张图解释了…

作者头像 李华
网站建设 2026/1/17 17:02:58

告别低效内耗:2025中小企业办公新方式

在数字化浪潮的推动下&#xff0c;中小企业的办公模式正迎来颠覆性变革。不同于大型企业拥有充足的资金和专业IT团队支撑复杂系统落地&#xff0c;中小企业更需要“轻量化部署、低成本投入、高适配性”的办公解决方案。仲量联行报告显示&#xff0c;2025年已有73%的中小企业实现…

作者头像 李华