当前位置: 首页 > 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.lryc.cn/news/623505.html

相关文章:

  • Linux入门指南:基础开发工具---vim
  • 谈谈对面向对象OOP的理解
  • Spring MVC 九大组件源码深度剖析(四):HandlerMapping - 请求映射的玄机
  • 问津集 #5:Crystal: A Unified Cache Storage System for Analytical Databases
  • Python自学10-常用数据结构之字符串
  • Windchill 11 Enumerated Type Customization Utility-枚举类型自定义实用程序
  • python---装饰器
  • 光耦,发声器件,继电器,瞬态抑制二极管
  • Rust Async 异步编程(一):入门
  • NestJS 手动集成TypeORM
  • USB 2.0声卡
  • Python中f - 字符串(f-string)
  • 基于Vue的个人博客网站的设计与实现/基于node.js的博客系统的设计与实现#express框架、vscode
  • 进程互斥的硬件实现方法
  • 影刀初级B级考试大题2
  • 快速掌握Hardhat与Solidity智能合约开发
  • 模型提取的相关经验
  • JavaWeb前端(HTML,CSS具体案例)
  • C语言网络编程TCP通信实战:客户端↔服务器双向键盘互动全流程解析
  • Java线程的6种状态和JVM状态打印
  • Vue深入组件:Props 详解3
  • 2.Pod理论
  • Golang database/sql 包深度解析(二):连接池实现原理
  • 云原生俱乐部-RH134知识点总结(3)
  • PyCharm与前沿技术集成指南:AI开发、云原生与大数据实战
  • Spring Boot 项目配置 MySQL SSL 加密访问
  • Debug马拉松:崩溃Bug的终极挑战
  • 本地处理不上传!隐私安全的PDF转换解决方案
  • 华为云之Linux系统安装部署Tomcat服务器
  • Git 命令指南:从 0 到熟练、从常用到“几乎全集”(含常见报错与解决)建议收藏!!!