监听元素宽高变化---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: 100y: 100entry.borderBoxSize:被监听元素的宽高:blockSize: 1000inlineSize: 1443entry.contentBoxSize:被监听元素content部分的宽高:blockSize: 600inlineSize: 1043entry.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 = argumentsif(!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.mzph.cn/news/648131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全用电管理平台方案介绍——Acrelcloud-6000

安全用电管理平台是一个针对电力系统安全管理的平台,旨在提供对电力设备和用电行为进行监控、分析和管理的解决方案。该平台结合了物联网技术、数据分析和远程监控等技术手段,能够实时监测、分析和预警电力系统的安全状况,以便及时采取措施防…

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

随着科技的飞速发展,新型工业化的概念逐渐成为全球关注的焦点。在数字化转型的浪潮中,工业制造业的发展面临着巨大的机遇和挑战。广州作为中国南方的重要工业基地,积极探索工业元宇宙的赋能作用,以推动工业制造业的数字化转型发展…

[蓝桥学习] 前缀和与差分

前缀和原理 特点 求区间和 如果要实现一边修改一边查询,需要使用树状树组和线段树。 例题 题目很简单,但是代码实现惊艳到我了,是L就加1,是Q就减1,如果区间 [i,j] 是平衡子串的话,那它会在前缀prefix i …

基于Kubernetes(K8s)构建企业容器云基础运行环境

cncfstack 新 文章上线: 书名:《云原生解决方案》 地址:https://zhaowenyu.com/cncf-solution 访问:文章底部“阅读原文”或访问域名 云原生计算是云计算发展新的里程碑阶段,是当今与未来很长一段时间中 IT 发展的技…

【学网攻】 第(10)节 -- 路由器单臂路由配置

系列文章目录 目录 系列文章目录 文章目录 前言 一、单臂路由是什么? 二、实验 1.引入 实验拓扑图 PC配置 Sw配置 Router配置 实验验证 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交…

【医学图像隐私保护】PLAN方法:解决 GAN 生成医学图像 Latent 空间中的隐私保护

PLAN方法:解决 GAN 生成医学图像 Latent 空间中的隐私保护方法 PLAN 原理StyleGAN 生成视网膜图k-SALSA 生成视网膜图PLAN方法 生成视网膜图 总结 PLAN 原理 论文:https://arxiv.org/abs/2307.02984 代码:https://github.com/perceivelab/P…

电商价格监测准确率如何保证

品牌做电商价格监测的前提是为了找出网络渠道中的破价链接,只有精准到筛选出破价链接,才能进行针对性的治理,比如经销渠道,只有当品牌拿出其破价的证据,才能对授权渠道进行规则管控,非授权渠道也是如此&…

HTML5与App封装技术将网站一键打包成App

HTML5:跨平台的利器HTML5作为一种先进的网页标记语言,其最大的优势在于跨平台性。开发者仅需编写一次代码,即可在各种操作系统和设备上运行,无需为每个平台单独开发App。这种“编写一次,运行处处”的模式,大…

系统架构15 - 软件工程(3)

软件过程模型 瀑布模型特点缺点 原型化模型特点两个阶段不同类型注意 螺旋模型V 模型特点 增量模型特点 喷泉模型基于构件的开发模型(CBSD)形式化方法模型敏捷模型特点“适应性” (adaptive) 而非“预设性” (predictive)“面向人的” (People-oriented) 而非“面向过程的” (P…

如何使用 WebRTC 与 Kurento 建立视频会议 App

本文作者 WebRTC Ventures 工程师。在 RTC 2018 实时互联网大会上,WebRTC Ventures 的资深软件工程师,将围绕 WebRTC 开发带来经验分享。欢迎访问RTC 开发者社区,与更多WebRTC开发者交流经验。 了解 WebRTC 如何工作的一种简单方式是通过学习…

golang入门

学习方法 1、在实践中学 2、适当的囫囵吞枣,有可能学到后面,对前面的疑问焕然大悟 3、注重整体,刚开始不要去扣细节 安装 需要配置3个环境变量,如果.msi文件安装时设置好了就不需要了,自己可以检查下 GOROOT&…

VUE--VUEX

一、什么是Vuex Vuex就是一个vue的状态(数据)管理工具,是vue项目实现大范围数据共享的技术方案。能够方便、高效的实现组件之间的数据共享。 Vuex的好处: (1)数据的存储一步到位,不需要层层传递…

权威媒体报道 | 百分点科技谈“数据要素×”

近日,国家数据局等17部门联合印发《“数据要素”三年行动计划(2024—2026年)》,引起广泛关注,作为数据要素技术厂商代表,百分点科技CTO刘译璟接受经济日报、中国高新技术产业导报采访,结合产业现…

<蓝桥杯软件赛>零基础备赛20周--第17周--并查集

报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周。 在QQ群上交流答疑&am…

《微信小程序开发从入门到实战》学习九十三

7.1 视图容器组件 7.1.3 swiper与swiper-item组件 swiper组件的显示效果如下图所示: indicator-dots、indicator-color和indicator-active-color三个属性用于设置swiper组件下方的指示点。设置指示点的颜色时,可以使用HexColor,也可以使用r…

读懂比特币—bitcoin代码分析(五)

今天的代码分析主要是 bitcoin/src/init.cpp 文件中的三个函数:AppInitSanityChecks、AppInitLockDataDirectory、AppInitInterfaces,下面我们来说明这三个函数是用来干什么的,并逐行解读函数代码,先贴出源代码如下: …

C++ 程序使用 OpenCV 库来创建一个图像金字塔,然后将这些图像合并成一张大图

文章目录 源码文件功能解读编译文件 源码文件 #include <iostream> #include <vector> #include <string> #include <opencv2/opencv.hpp>int main() {// 这里应该有代码来生成或加载一系列图像到 imagePyramidstd::vector<cv::Mat> imagePyram…

AWS 专题学习 P10 (Databases、 Data Analytics)

文章目录 专题总览1. Databases1.1 选择合适的数据库1.2 数据库类型1.3 AWS 数据库服务概述Amazon RDSAmazon AuroraAmazon ElastiCacheAmazon DynamoDBAmazon S3DocumentDBAmazon NeptuneAmazon Keyspaces (for Apache Cassandra)Amazon QLDBAmazon Timestream 2. Data & …

8.12用最少数量的箭引爆气球(LC452-M)

452. 用最少数量的箭引爆气球 - 力扣&#xff08;LeetCode&#xff09; 算法&#xff1a; 局部最优&#xff1a;当气球出现重叠&#xff0c;一起射&#xff0c;所用弓箭最少。 全局最优&#xff1a;把所有气球射爆所用弓箭最少。 为了让气球尽可能的重叠&#xff0c;需要对…

5JS语句

表达式在JavaScript中是短语&#xff0c;那么语句&#xff08;statement&#xff09;就是JavaScript整句或命令。 表达式计算出一个值&#xff0c;但语句用来执行以使某件事发生。诸如赋值和函数调用这些有副作用的表达式&#xff0c;是可以作为单独的语句的&#xff0c;这种把…