2026/4/18 12:06:25
网站建设
项目流程
深圳市富通建设工程有限公司网站,网站设计一年费用,做网站需要工具,成都做网站设重绘#xff08;Repaint#xff09;
定义#xff1a;元素样式改变但不影响布局时触发#xff0c;仅重新绘制元素外观#xff0c;不改变DOM几何结构。常见场景#xff1a;修改color、background-color、opacity、box-shadow等。
重排#xff08;Reflow#xff09;
定义Repaint定义元素样式改变但不影响布局时触发仅重新绘制元素外观不改变DOM几何结构。常见场景修改color、background-color、opacity、box-shadow等。重排Reflow定义元素几何属性改变尺寸/位置/数量时触发浏览器需重新计算DOM布局并渲染性能消耗远大于重绘。常见场景修改width、height、margin、padding、display或DOM增删、窗口resize。核心差异性能消耗重排 重排重排必触发重绘重绘不一定触发重排。触发原因重排是布局改变重绘是外观改变。影响范围重排可能连锁影响父/子元素布局重绘仅影响当前元素。性能优化关键批量修改样式用class代替inline样式。避免频繁操作DOM优先用文档片段DocumentFragment。复杂动画用transformGPU加速仅触发合成层不重排重绘。一、核心优化原则重排性能消耗远大于重绘优化核心是减少重排触发频率缩小重排影响范围优先规避高频布局操作。二、落地优化方案按优先级排序1. 批量操作DOM/样式避免高频单次修改样式批量处理用class统一切换样式替代多次inline样式修改减少样式计算次数。// 差3次样式修改可能触发多次重排dom.style.width100px;dom.style.height200px;dom.style.margin10px;// 好1次class切换仅触发1次重排dom.classList.add(target-style);DOM批量操作先脱离文档流再修改最后重新插入避免修改时频繁触发布局计算。// 方案1隐藏元素display: none后操作dom.style.displaynone;dom.innerHTMLdiv新内容/div;// 批量增删DOMdom.style.displayblock;// 方案2用DocumentFragment临时存储DOMconstfragmentdocument.createDocumentFragment();for(leti0;i100;i){constdivdocument.createElement(div);fragment.appendChild(div);// 操作片段不触发重排}dom.appendChild(fragment);// 仅插入时触发1次重排2. 避免触发强制同步布局浏览器默认异步计算布局若先读取布局属性如offsetWidth、scrollTop再修改样式会强制浏览器立即计算布局导致性能卡顿需先批量修改再批量读取。// 差读取→修改→读取触发多次强制同步布局for(leti0;idoms.length;i){constwidthdoms[i].offsetWidth;// 读取布局触发布局计算doms[i].style.width${width10}px;// 修改样式}// 好先批量读取再批量修改constwidths[];// 1. 批量读取仅触发1次布局计算for(leti0;idoms.length;i){widths.push(doms[i].offsetWidth);}// 2. 批量修改仅触发1次重排for(leti0;idoms.length;i){doms[i].style.width${widths[i]10}px;}3. 复杂动画/交互用GPU加速规避重排重绘用transform、opacity实现动画浏览器会将元素放入独立合成层仅触发合成操作无重排、无重绘性能最优替代width、margin、top等布局属性。/* 差修改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. 其他实用优化避免频繁查询布局属性offsetWidth、clientHeight等缓存查询结果复用。窗口resize、滚动事件等高频触发场景用debounce防抖限制执行频率减少重排次数。// 滚动事件防抖100ms内仅执行1次lettimernull;window.addEventListener(scroll,(){clearTimeout(timer);timersetTimeout((){constscrollTopdocument.documentElement.scrollTop;// 避免高频读取// 业务逻辑},100);});三、总结高频优化动作批量操作DOM/样式动画用transform/opacity规避强制同步布局这3点可解决80%的重排重绘性能问题优先落地即可大幅提升页面流畅度。