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

react echarts图表监听窗口变化window.addEventListener(‘resize’)与ResizeObserver()

发生问题场景

系统页面使用tabs标签页,当有多个组件,有使用eCharts图表的页面时,其中的一个页面或其他页面使用了F11的页面全屏关闭全屏后图表收缩起来(注:固定eCharts的width、height 的参数值是无影响,按照固定参数大小展示),如使用百分比:

<div ref={myChartRef} style={{ width: '100%', height: '100%' }} />

会收缩,这时候window.addEventListener(‘resize’)(仅监听窗口)无法监听

优缺点

在监听窗口或元素尺寸变化时,window.addEventListener(‘resize’) 和 ResizeObserver 是两种常见方法,各有优缺点。以下是详细对比:

1. window.addEventListener(‘resize’)

优点

  • 广泛兼容性
  • 所有浏览器均支持,包括旧版本(如 IE9+)。
  • 简单直接
  • 监听整个窗口的尺寸变化,代码简洁,适合全局布局调整。
  • 性能优化空间
  • 可通过防抖(debounce)或节流(throttle)减少回调触发频率。

缺点

  • 仅监听窗口
  • 无法直接监听特定元素的尺寸变化(如 div、iframe 等)。
  • 触发频率
  • 浏览器窗口调整时可能连续触发多次回调,需手动优化(如防抖)。
  • 无法获取变化前后的尺寸
  • 需自行存储上一次的尺寸值进行比较。
  • 移动端问题
  • 虚拟键盘弹出/收起可能触发 resize,但实际窗口尺寸未变,需额外处理。
    示例代码
javascript
window.addEventListener('resize', debounce(() => {console.log('窗口尺寸变化:', window.innerWidth, window.innerHeight);
}, 200));function debounce(fn, delay) {let timer;return () => {clearTimeout(timer);timer = setTimeout(fn, delay);};
}

2. ResizeObserver

优点

  • 监听任意元素
  • 精确监听特定 DOM 元素的尺寸变化(包括 width、height、padding、border 等)。
  • 高效触发
  • 浏览器内部优化,仅在尺寸实际变化时触发回调,避免冗余计算。
  • 提供详细信息
  • 回调中直接返回元素的 contentRect(内容尺寸)和 borderBoxSize(边框盒尺寸)。
  • 现代标准
  • 专为动态尺寸监听设计,是W3C 推荐方案。

缺点

  • 兼容性限制
  • 不支持 IE 和旧版 Edge(需 Polyfill 或降级处理)。
  • 初始尺寸不触发
  • 仅在尺寸变化时触发,若需初始尺寸需额外调用一次。
  • 循环观察风险
  • 若回调中修改元素尺寸,可能导致无限循环(需谨慎处理)。
    示例代码

const element = document.getElementById('target');
const observer = new ResizeObserver((entries) => {for (let entry of entries) {console.log('元素尺寸变化:', entry.contentRect);}
});observer.observe(element); // 开始观察
// observer.unobserve(element); // 停止观察

对比总结

在这里插入图片描述

// 优先使用 ResizeObserver,不支持时回退到 resize + 防抖
if ('ResizeObserver' in window) {const observer = new ResizeObserver(/* ... */);observer.observe(element);
} else {// 使用 resize 事件 + 防抖(需通过其他方式获取元素尺寸)
}

根据项目需求和浏览器支持情况灵活选择即可。

http://www.lryc.cn/news/623988.html

相关文章:

  • 音乐创作魔法:解锁和弦与旋律的变化技巧
  • 3D打印——给开发板做外壳
  • 如何做HTTP优化
  • 【JAVA 核心编程】面向对象高级:类变量与方法 抽象类与接口
  • PowerPoint和WPS演示让多个对象通过动画同时出现
  • NY270NY273美光固态闪存NY277NY287
  • Portkey-AI gateway 的一次“假压缩头”翻车的完整排障记:由 httpx 解压异常引发的根因分析
  • duiLib 解决点击标题栏中按钮无响应问题
  • C# 反射和特性(自定义特性)
  • 健身房预约系统SSM+Mybatis实现(三、校验 +页面完善+头像上传)
  • RISC-V汇编新手入门
  • 【LeetCode】单链表经典算法:移除元素,反转链表,约瑟夫环问题,找中间节点,分割链表
  • 开发指南132-DOM的宽度、高度属性
  • HTTP0.9/1.0/1.1/2.0
  • SWE-bench:真实世界软件工程任务的“试金石”
  • 人工智能入门②:AI基础知识(下)
  • C++入门自学Day11-- String, Vector, List 复习
  • 如何利用gemini-cli快速了解一个项目以及学习新的组件?
  • 数据结构03(Java)--(递归行为和递归行为时间复杂度估算,master公式)
  • 人脸AI半球梯控/门禁读头的功能参数与技术实现方案
  • MySQL的事务基础概念:
  • 力扣刷题904——水果成篮
  • 黑马商城day08-Elasticsearch作业(个人记录、仅供参考、详细图解)
  • MLArena:一款不错的AutoML工具介绍
  • 【Linux】IO多路复用
  • SpringCloud 07 微服务网关
  • linux-高级IO(上)
  • 【撸靶笔记】第五关:GET - Double Injection - Single Quotes - String
  • Linux目录介绍
  • 002.Redis 配置及数据类型