CSS——重排和重绘

1.概念

重排(Reflow)与重绘(Repaint)是浏览器渲染管线中的两个关键环节,直接决定页面性能。重排一定触发重绘,重绘不一定触发重排。

1.2 重排(Reflow)

重排 = Layout(布局) 阶段重新计算元素的几何信息(位置、大小)。触发条件:

典型代码 说明
el.style.width = '200px' 改变宽度
el.style.display = 'none' 隐藏元素
el.classList.add('col-3') 类名改变布局
dom.offsetHeight / getComputedStyle 强制同步刷新
字体大小、内容变化、图片加载完成 都会让浏览器重新算盒子
特点
  • 作用范围:从当前元素向上找定位祖先,向下找所有子节点,可能整页一起算。

  • 耗时:与 DOM 大小成正比,移动端尤其明显。

  • 阻塞后续 JS 执行(渲染线程和主线程互斥)。

1.3 重绘(Repaint)

重绘 = Paint 阶段重新绘制像素(颜色、阴影、文字等)。触发条件:

典型代码 说明
el.style.color = 'red' 改文字颜色
el.style.boxShadow = '...' 改阴影
el.style.visibility = 'hidden' visibility 隐藏仍占位,不影响布局
特点
  • 跳过 Layout 阶段,比重排便宜(性能:重排 > 重绘),但仍需重新绘制像素。

  • 若元素在独立合成层 (will-change、transform、opacity),可直接 GPU 合成,连 Paint(绘制) 都跳过

2.扩展

2.1 translate去改变位置------减少重排

translate代替传统定位方式(top、left、right、bottom),它操作的是合成层而不是布局层,所以浏览器不会因位置改变而重新布局。

新版本浏览器会自动将元素提升为独立合成层,而旧版本需要will-change: transform; 属性
javascript 复制代码
// 手动提升为合成层属性
will-change: transform;   /* 最标准 */
transform: translateZ(0); /* 传统 hack */
相关推荐
尘世中一位迷途小书童5 分钟前
从零搭建:pnpm + Turborepo 项目架构实战(含完整代码)
前端·架构
JarvanMo14 分钟前
Flutter 中的 ClipRRect | 每日 Flutter 组件
前端
某柚啊15 分钟前
iOS移动端H5键盘弹出时页面布局异常和滚动解决方案
前端·javascript·css·ios·html5
心.c15 分钟前
如何学习Lodash源码?
前端·javascript·学习
JamSlade22 分钟前
react 无限画布难点和实现
前端·react.js
im_AMBER28 分钟前
React 02
前端·笔记·学习·react.js·前端框架
浩男孩28 分钟前
🍀我实现了个摸鱼聊天室🚀
前端
玲小珑29 分钟前
LangChain.js 完全开发手册(十六)实战综合项目二:AI 驱动的代码助手
前端·langchain·ai编程
井柏然1 小时前
从 Monorepo 重温 ESM 的模块化机制
前端·javascript·前端工程化
晓得迷路了1 小时前
栗子前端技术周刊第 102 期 - Vite+ 正式发布、React Native 0.82、Nitro v3 alpha 版...
前端·javascript·vite