当前位置: 首页 > news >正文

CSS 回流(Reflow)和重绘(Repaint)

基本概念

回流(Reflow) 和 重绘(Repaint) 是浏览器渲染过程中的两个重要概念,它们会影响页面性能。

回流(Reflow)

  • 也称为"布局"(Layout)

  • 当渲染树中的一部分或全部因为元素的规模尺寸、布局、隐藏等改变而需要重新构建时发生

  • 会计算所有受影响元素的几何属性(位置和大小)

  • 是开销较大的操作

重绘(Repaint)

  • 当元素的外观样式改变但不影响布局时发生(如颜色、背景色等)

  • 不需要重新计算几何属性

  • 开销相对较小

触发条件

触发回流的操作

  • 页面首次渲染

  • 浏览器窗口大小改变

  • 元素尺寸或位置改变(width, height, margin, padding, border等)

  • 元素内容变化(文字数量、图片大小等)

  • 添加/删除可见DOM元素

  • 激活CSS伪类(:hover等)

  • 查询某些属性或调用某些方法(见下文)

触发重绘的操作

  • 颜色、背景色等不影响布局的样式变化

  • visibility样式的改变(但display:none会触发回流)

性能影响

回流比重绘的代价更高,因为它会导致浏览器重新计算所有受影响元素的几何属性,并可能导致部分或整个渲染树需要重新构建。

优化建议

  1. 避免频繁操作样式:最好一次性修改样式,而不是多次修改

    // 不好
    el.style.margin = '5px';
    el.style.padding = '10px';// 更好
    el.style.cssText = 'margin:5px; padding:10px;';
  2. 使用文档片段(DocumentFragment):批量操作DOM

    const fragment = document.createDocumentFragment();
    // 添加多个元素到fragment
    document.body.appendChild(fragment);
  3. 避免强制同步布局:不要在读取布局属性前修改样式

    // 不好 - 强制同步布局
    const width = el.offsetWidth;
    el.style.width = width + 10 + 'px';// 更好 - 先修改后读取
    el.style.width = '100px';
    const width = el.offsetWidth;
  4. 使用transform和opacity:这些属性不会触发回流

  5. 避免table布局:table中一个小改动可能导致整个table回流

  6. CSS优化

    • 避免多层内联样式

    • 将动画元素设置为position: absolute/fixed

    • 避免CSS表达式

常见触发回流的属性和方法

属性(读取时会强制回流)

  • offsetTop/offsetLeft/offsetWidth/offsetHeight

  • scrollTop/scrollLeft/scrollWidth/scrollHeight

  • clientTop/clientLeft/clientWidth/clientHeight

  • getComputedStyle()

  • getBoundingClientRect()

方法(可能触发回流)

  • elem.append()

  • elem.remove()

  • elem.insertBefore()

  • elem.replaceChild()

  • elem.style.setProperty()

  • window.getComputedStyle()

  • elem.scrollIntoView()

  • elem.focus()

理解回流和重绘有助于开发者编写更高效的CSS和JavaScript代码,提升页面性能。

http://www.dtcms.com/a/317296.html

相关文章:

  • C语言基础_排序算法和二分法查找
  • TDengine IDMP 背后的技术三问:目录、标准与情景
  • 自学嵌入式 day43 中断系统
  • 1-知识图谱—知识图谱表示与建模:给知识 “搭框架”,让每句话都有条理
  • Java学习第一百一十一部分——Jenkins(二)
  • 开源流媒体服务器ZLMediaKit 的Java Api实现的Java版ZLMediaKit流媒体服务器-二开视频对话
  • 周鸿祎:AI 时代安全智能体,能否重塑数字安全格局?
  • 【数据库】Oracle学习笔记整理之一:ORACLE的核心组成部分
  • 亚矩阵云手机:解锁 Shopee/Lazada 东南亚电商运营“通关密码
  • Cortex-M MCU 默认的分散加载文件分析
  • CSS高频属性速查指南
  • SG105 Pro 网管交换机的3种VLAN配置
  • Uniapp生物识别(SOTER)
  • 什么是逻辑外键?我们要怎么实现逻辑外键?
  • 【C++详解】STL-set和map的介绍和使用样例、pair类型介绍、序列式容器和关联式容器
  • sqli-labs靶场less40-less45
  • uniapp 通用地磅称重系统手机端
  • 生成网站sitemap.xml地图教程
  • android 设置字体样式
  • QT----QAxObject在子线程中调用,发现excel指针为空
  • NCD57080CDR2G 安森美onsemi 通用驱动器, SOIC, 8针, 20V电源, 8 A输出NCD57080CDR2电流隔离式栅极驱动器
  • Excel制作尖刀图,直观展示业绩涨跌
  • 【Excel】通过Index函数向下拖动单元格并【重复引用/循环引用】数据源
  • Unity模型显示在UI上
  • mysql 8递归查询
  • AMD二季度净利润同比下降31%
  • 企业级建模平台Sparx EA的云服务实现全域架构协同
  • imx6ull-驱动开发篇11——gpio子系统
  • django permission_classes = [AllowAny] 如何限制到具体接口
  • 得物向量数据库落地实践