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

ResizeObserver的使用

这篇说下ResizeObserver API。ResizeObserver接口监视 Element 内容盒或边框盒或者 SVGElement 边界尺寸的变化。

ResizeObserver避免了通过回调函数调整大小时,通常创建的无限回调循环和循环依赖项。它只能通过在后续的帧中处理 DOM 中更深层次的元素来做到这一点。如果它的实现遵循规范,则应在绘制前和布局后调用 resize 事件。

这是官方介绍:ResizeObserver

方法

ResizeObserver.disconnect()

取消特定观察者目标上所有对 Element 的监听。

ResizeObserver.observe()

开始对指定 Element 的监听。

ResizeObserver.unobserve()

结束对指定 Element 的监听。

使用

let resizeObserver;

if (!resizeObserver) {
  resizeObserver = new ResizeObserver(() => {
    // 监听元素发生改变触发
  })

  // 监听的目标容器盒子
  resizeObserver.observe(Element)
}

使用碰到的问题

在使用echarts图表的时候,我用这个api相对多点,在这之前我是监听的window的resize方法,当浏览器分辨率、缩放改变的时候调用echarts的resize方法来实现图表自适应,但是这样当局部容器盒子宽高发生改变时并不能监听到。

从此后我就使用了ResizeObserver API了,确实只要当容器盒子发生改变就可以进行监听到实现自适应,但是有个问题:我们一般在echarts setOption之后会进行监听图表容器的变化,来实现图表的自适应,就像下面这样写的:

this.charts = echarts.init(document.getElementById(this.id))
let option = {
  // ...
}
this.charts.setOption(option);
if (!this.resizeObserver) {
  this.resizeObserver = new ResizeObserver(() => {
    if (this.charts) {
      this.charts.resize()
    }
  });
  this.resizeObserver.observe(document.getElementById(this.id));
}

但是这样写,我们图表在进行第一次绘制的时候,就失去了动画效果 ,就是我们echarts图表自身时带有动画效果的,下面是一些官方基础配置:

具体是为什么失去了动画,我也没太搞明白,没去看ResizeObserver或者echarts的动画这块儿的源码,时间、精力有限。然后就简单看了下如何解决这个问题

我们要解决这个问题,其实也很简单,就是我们在echarts setOption之后等图表第一次绘制并动画结束之后再使用ResizeObserver监听即可。使用setTimeout 延迟就可以了,至于延迟几秒是取决于echarts中的animationDuration配置(这个动画时长),默认是1000ms ,所以我们把上面代码改造成下面就可以:

this.charts = echarts.init(document.getElementById(this.id))
let option = {
  // ...
}
this.charts.setOption(option);
if (!this.resizeObserver) {
  setTimeout(() => {
    this.resizeObserver = new ResizeObserver(() => {
      if (this.charts) {
        this.charts.resize()
      }
    });
    this.resizeObserver.observe(document.getElementById(this.id));
  }, 1000)
}

http://www.kler.cn/a/232309.html

相关文章:

  • 领夹麦克风哪个品牌好,手机领夹麦克风哪个牌子好,选购推荐
  • 接口文档的编写
  • 【快捷入门笔记】mysql基本操作大全-SQL表
  • 两种鼠标hover切换对应图片方法对比
  • ABAP关于PS模块CJ20N中项目物料的屏幕和字段增强CI_RSADD
  • C/C++语言基础--C++模板与元编程系列六,C++元编程相关库的讲解与使用
  • 网络编程-Socket套接字
  • Netty源码系列 之 HashedWheelTimer源码
  • 《幻兽帕鲁》攻略:0基础入门及游戏基础操作 幻兽帕鲁基础设施 幻兽帕鲁基础攻击力 Mac苹果电脑玩幻兽帕鲁 幻兽帕鲁加班加点
  • Kubernetes基础(十五)-k8s网络通信
  • ubuntu22.04@laptop OpenCV Get Started: 001_reading_displaying_write_image
  • 如何使用宝塔面板搭建MySQL 5.5数据库并实现公网远程连接
  • C++ pair 的使用
  • Elasticsearch:通过 ingest pipeline 对大型文档进行分块
  • MySQL篇----第十五篇
  • C语言:亲密数对
  • 免费生成ios证书的方法(无需mac电脑)
  • Java stream 流的基本使用
  • Cilium CNI深度指南
  • Elasticsearch(四)
  • Kylin下Qt找不到打印机解决方案
  • 《Docker极简教程》--Docker基础--基础知识(三)
  • 跟着小德学C++之TCP基础
  • 常用的文件系统、存储类型小整理
  • Rust语言入门小结(第1篇)
  • Nginx 缓存集成、清除、设置不缓存资源