监听元素宽高变化---new ResizeObserver

参考:ResizeObserver API详解-CSDN博客

有的时候需要监听某个元素的宽高变化,这个时候可以使用JS的  resizeObserver 钩子函数。

用于监视元素的大小变化。它可以观察一个或多个 DOM 元素,以便在元素的大小或形状发生变化时触发回调函数。ResizeObserver 是为了更有效地处理元素尺寸变化而引入的,特别适用于响应式设计和自适应布局。

观察多个元素:你可以同时观察多个 DOM 元素,当这些元素的尺寸发生变化时,ResizeObserver 会在每个元素上触发回调函数。

异步回调:ResizeObserver 的回调是异步执行的,这意味着它会在浏览器准备好更新时触发,而不会引发性能问题。

兼容性:

完全不兼容ie浏览器,主流浏览器只兼容高版本,基本上2018年以前的浏览器都不兼容,部分浏览器甚至2020年以前都不兼容。

ResizeObserver是个构造函数。在使用new关键字调用构造函数,返回实例对象时,需要传入一个回调函数,这个回调用于监听实例对象某个DOM节点的变化。

回调函数的第一个参数entries是一个数组,数组里有几个对象。

entry.contentRect:被监听元素content的宽高及位置:
  bottom: 700   指top + height的值
  height: 600   指元素本身的高度,不包含padding,border值
  left: 100     指padding-left的值
  right: 1143   指left + width的值
  top: 100      指padidng-top的值
  width: 1043   指元素本身的宽度,不包含padding,border值
  x: 100
  y: 100

entry.borderBoxSize:被监听元素的宽高:
  blockSize: 1000
  inlineSize: 1443

entry.contentBoxSize:被监听元素content部分的宽高:
  blockSize: 600
  inlineSize: 1043

entry.target:被监听的元素
// 监听el-form的宽高
    createResizeObserver(selector) {
        const wrapper = this.$el.querySelector(selector);
        this.observer = new ResizeObserver((entries) => {
          entries.forEach((entry) => {
              this.totalWidth =  entry.contentRect.width; //被监听元素宽
              this.totalHeight = entry.contentRect.height;//被监听元素高
            
          });
          resolve()
        });
        this.observer.observe(wrapper);
    }

this.createResizeObserver("#searchLeft1")

因为 ResizeObserver是异步的,所以会暂时被放到异步任务队列中,等待同步执行完毕后,才回去执行异步函数。如果需要在被监听的元素变化后执行某些操作,可以使用promise处理,如下:
 

createResizeObserver(selector) {
      return new Promise(resolve => {
        const wrapper = this.$el.querySelector(selector);
        this.observer = new ResizeObserver((entries) => {
          entries.forEach((entry) => {
            // for (const entry of entries) {
              this.totalWidth =  entry.contentRect.width;
              this.totalHeight = entry.contentRect.height;
              this.$store.commit("teachResearch/SET_ACTIVEHEIGHT", this.totalHeight); //存储查询条件动态高
            // }
          });
          resolve()//注意resolve的位置
        });
        this.observer.observe(wrapper);
      })
    },

this.createResizeObserver("#searchLeft1").then(()=>{
      // 监听元素大小后,要执行的某些操作
      //XXXXX
    })

取消和结束对目标元素的监听

vue2的写法:
beforeDestroy() {
  resizeObserver.disconnect(this.$refs.wrapper);
},

vue3的写法:
beforeUnmount() {
 resizeObserver.disconnect(this.$refs.wrapper);
}

react的写法:
useEffect(() => {
	return () => {
		resizeObserver.disconnect(this.$refs.wrapper);
	}
},[])

componentWillUnmount() {
	resizeObserver.disconnect(this.$refs.wrapper);
}

节流使用

最后,在使用ResizeObserver API的时候,在每次触发元素的大小变化时,会在1s内触发回调蛮多次的。如果想进一步优化性能,可以加上throttle节流函数处理

const throttle = (fun,delay) => {
	let timer = null;
	return function() {
		const args = arguments
		if(!timer) {
			timer = setTimeout(() => {
				timer = null
			}, delay)
			fun(args )
		}
	}
}

const myObserver = new ResizeObserver(throttle(entries => {
  entries.forEach(entry => {
    console.log('大小位置 contentRect', entry.contentRect)
    console.log('监听的DOM target', entry.target)
  })
}), 500)

myObserver.observe(document.body)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/349182.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VsCode提高生产力的插件推荐-持续更新中

别名路径跳转 自定义配置// 文件名别名跳转 "alias-skip.mappings": { "~/": "/src", "views": "/src/views", "assets": "/src/assets", "network": "/src/network", "comm…

深圳工业元宇宙赋能新型工业化,推动工业制造业数字化转型发展

在当今数字化时代,工业制造业正面临着巨大的变革。随着技术的不断进步,工业元宇宙的概念逐渐成为推动工业制造业数字化转型的重要力量。深圳作为中国的高科技之都,在这方面走在了前列,积极探索工业元宇宙的应用,赋能新…

引领未来:云原生在产品、架构与商业模式中的创新与应用

文章目录 一、云原生产品创新二、云原生架构设计三、云原生商业模式变革《云原生落地 产品、架构与商业模式》适读人群编辑推荐内容简介目录 随着云计算技术的不断发展,云原生已经成为企业数字化转型的重要方向。接下来将从产品、架构和商业模式三个方面&#xff0c…

【洛谷】P1135奇怪的电梯(DFS)

这题利用 dfs 解决,编程实现比较简单。 具体来说,每层楼有两种可能,上楼或下楼,因此可以形成一个以 a 楼为根的二叉树,因此只需一个 for 循环遍历某个父节点的两个子节点,之后递归就行。 易错点&#xff…

浅出深入-机器学习

文章目录 一、K近邻算法1.1 先画一个散列图1.2 使用K最近算法建模拟合数据1.3 进行预测1.4 K最近邻算法处理多元分类问题1.5 K最近邻算法用于回归分析1.6 K最近邻算法项目实战-酒的分类1.6.1 对数据进行分析1.6.2 生成训练数据集和测试数据集1.6.3 使用K最近邻算法对数据进行建…

手把手教你用plotly绘制excel中常见的8种图表

目录: 0. 准备工作 1. 柱状图 2. 条形图 3. 折线图 4. 面积图 5. 饼图与圆环图 6. 散点图 7. 气泡图 8. 极坐标(雷达图) 0. 准备工作 我这边是在jupyterlab中演示的plotly图表,如果只安装plotly是无法正常显示图表的(会显示为空白…

Mac怎么录屏?简单易懂,关键技巧分享!

随着时代的变迁,人们对mac电脑的使用需求也越来越多样化。其中,屏幕录制成为了很多用户的常用需求,比如录制教程、游戏视频、会议记录等。可是很多用户不知道mac怎么录屏。本文将为你详细介绍两种mac录屏的方法,让大家轻松学会如何…

Internet Download Manager 6.42.3 (IDM) 中文破解免激活绿色版

Internet Download Manager 6.42.3中文破解版,全球最佳下载利器。Internet Download Manager (简称IDM) 是一款Windows 平台功能强大的多线程下载工具,国外非常受欢迎。支持断点续传,支持嗅探视频音频,接管所有浏览器,…

【并发编程】AQS——详细解释公平锁,非公平锁,独占锁,什么是可重入以及condition

目录 1、公平 2.非公平 3.独占锁 4.可重入 5.condition 1、公平 第一步:获取状态的 state 的值。如果 state0 即代表锁没有被其它线程占用,执行第二步。如果 state!0 则代表锁正在被其它线程占用,执行第三步。 第二步:判断队列…

ICSpector:一款功能强大的微软开源工业PLC安全取证框架

关于ICSpector ICSpector是一款功能强大的开源工业PLC安全取证框架,该工具由微软的研究人员负责开发和维护,可以帮助广大研究人员轻松分析工业PLC元数据和项目文件。 ICSpector提供了方便的方式来扫描PLC并识别ICS环境中的可疑痕迹,可以用于…

Spring与Web环境集成

1. Spring与Web环境集成 1.1 ApplicationContext应用上下文获取方式 应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的,但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件) ,这…

RX4901CE (RTC模块)

RX4901CE是一个集成了32.768 kHz数字温度补偿晶体振荡器(DTCXO)的RTC模块。高稳定性,低电流消耗,时间戳功能,当外部或内部事件发生时,可以记录多达32个日期和时间,以及基本的RTC功能,如时间和日历&#xff…

江科大STM32 中

目录 6、TIM(Timer)定时器基本定时器通用定时器高级定时器示例程序(定时器定时中断&定时器外部时钟)TIM输出比较示例程序(PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机)TIM输入捕获示例程序&…

微信小程序登录获取手机号教程(超详细)

1. 背景介绍: 在我们开发微信小程序时,登录时,需要获取用户手机号作为唯一标识,下面我介绍一下获取手机号的教程。 本篇文章介绍后端获取方法: 前端工作 后端工作 前端 新建Page页面,在xxx.wxml中加入…

Linux的 .bashrc 有什么作用?

一、.bashrc 是什么? 有什么用? .bashrc是一个存储在你的home目录下的隐藏文件,它用来配置和自定义你的终端环境和行为。 每次你启动一个新的终端时,.bashrc文件就会被执行,加载你设置的环境变量,别名,函数…

Linux下的gcc与g++

文章目录 一.Linux gcc与g1.gcc如何生成可执行程序(g同)2.函数库 二.Linux项目自动化构建工具-make/makefile 一.Linux gcc与g 1.gcc如何生成可执行程序(g同) 预处理(宏定义替换,展开头文件代码,条件编译,去注释&…

京东云开发者DDD妙文欣赏(3-4)什么时候厨师是Actor

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 京东云开发者DDD妙文欣赏(1-2)报菜名和化繁为简的创新>> 图8 《餐厅》中的“用例图” (01) 原文 用例图 赏析 揉一揉眼睛仔细…

目标检测 - RCNN系列模型

文章目录 1. RCNN2. Fast-RCNN3. Faster-RCNN 1. RCNN 论文:Rich feature hierarchies for accurate object detection and semantic segmentation 地址:https://arxiv.org/abs/1311.2524 分为两个阶段: 目标候选框Object ProposalsProposal…

04 SB实战 -微头条之头条模块(登录验证拦截器+发布文章+修改文章)

1.登陆验证 为什么还要做登陆验证? 尽管先前我们已经进行过登录, 但是要知道token是有有效期的, 而用户登陆后有可能长时间停留在页面不退出, 甚至这个停留的时间超出token有效期, 因此,尽管用户已经登录, 但是, 在需要登录才能进行的操作(进入发布页前、发布新闻前、进入修改…

MongoDB单机部署

Windows系统安装启动 下载安装包 附件中已准备好win32位、win64位安装包 MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www.mongodb.com/download-cente…
最新文章