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

说一下分离读写

分离读写,在前端和浏览器渲染上下文中通常指 将 DOM 读取操作和写入操作分开执行,目的是 减少回流(Reflow)和重绘(Repaint),提升性能。

1. 读与写的区别

  • 读操作(Read / Measure)

    • 获取元素信息,不改变 DOM

常见方法:

element.offsetHeight
element.offsetWidth
element.scrollTop
element.getBoundingClientRect()
window.getComputedStyle(element)
  • 写操作(Write / Mutate)

    • 修改 DOM 或样式,可能触发回流

常见方法:

element.style.width = '100px'
element.classList.add('active')
element.appendChild(newNode)

2. 为什么要分离读写

  • 浏览器渲染机制:

    1. DOM 或样式变化 → 标记为脏(需要回流)

    2. 下一次读尺寸或绘制时,如果发现 DOM 脏了 → 强制回流(Reflow)

问题示例:

const height = element.offsetHeight;  // 读
element.style.width = '200px';        // 写
const newHeight = element.offsetHeight; // 再读 → 浏览器会强制回流

上面这种“读-写-读”顺序会导致 回流两次,性能开销大

  • 优化策略:

    • 先全部读,再全部写,避免多次回流

    • 即把读写操作分组,减少渲染触发次数

3. 实际操作方法

方法 1:批量读写

// 先读取
const height = element1.offsetHeight;
const width = element2.offsetWidth;// 再修改
element1.style.height = height + 'px';
element2.style.width = width + 'px';

方法 2:使用 requestAnimationFrame

// 所有 DOM 读操作在 raf 外层
const readValues = () => {return {height: element.offsetHeight,width: element.offsetWidth};
};requestAnimationFrame(() => {const {height, width} = readValues();element.style.height = height + 'px';element.style.width = width + 'px';
});

好处:让 DOM 修改在下一帧统一执行,减少强制回流

方法 3:使用 Batch / DOM 打包库

  • 比如 FastDom 或 前端框架虚拟 DOM

  • 自动分离读写操作,批量执行,性能更优

总结

概念说明
读操作获取 DOM 信息,不修改,可能触发回流
写操作修改 DOM 或样式,会触发回流和重绘
分离读写先全部读,再全部写,减少回流次数,提高性能
优化手段批量读写、requestAnimationFrame、虚拟 DOM、FastDom

核心理解:

  • 浏览器在读写 DOM 时会触发回流/重绘,频繁交替“读-写-读”会导致性能下降

  • 分离读写 = 批量读 + 批量写,让浏览器渲染更高效

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

相关文章:

  • c_str()函数的详细解析
  • 力扣438:找到字符串中所有的字母异位词
  • ACCESS/SQL SERVER保存软件版本号为整数类型,转成字符串
  • 第13章《远程处理:一对一及一对多》——PowerShell Remoting 学习笔记
  • Windows_Server软件定义网络架构
  • MXFP4量化:如何在80GB GPU上运行1200亿参数的GPT-OSS模型
  • 编程算法实例-阶乘
  • 天地图开发的优点
  • Steam 上传游戏包体操作步骤
  • Win11 文件资源管理器预览窗格显示 XAML 文件内容教程
  • K8S集群环境搭建(一)
  • STL 容器
  • 华东师范上海AiLab商汤!NaviMaster:学习适用于GUI和具身导航任务的统一策略
  • React学习(四)
  • 计算机视觉(一):nvidia与cuda介绍
  • 王树森深度强化学习DRL(一)RL基本概念+价值学习
  • 基于51单片机汽车自动照明灯超声波光敏远近光灯设计
  • Git安装使用
  • 【软考中级网络工程师】知识点之网络存储
  • 如何巧妙通过面试提高业务经验?
  • Spring IoC DI 终极指南:从造车模型到企业级开发实战
  • 嵌入式开发入门—电子元器件~半导体
  • Linux中iSCSI存储配置与管理指南
  • Java的网络攻防仿真演练系统
  • 深度学习·GFSS
  • C语言字符串操作汇总
  • 线程相关知识
  • NokoPrint:安卓平台上的便捷无线打印解决方案
  • 存储引擎 InnoDB
  • 【Python】Python 面向对象编程详解​