Resize Observer监测DOM元素尺寸改变的神器

news2024/11/24 12:45:27

前言

大家在遇到需要监测DOM元素尺寸大小的需求时,可能第一时间想到的都是使用window.addEventListener来监听resize 事件,

但是reize事件会在一秒内触发将近60次,所以很容易在改变窗口大小时导致性能问题。因为它会监听我们页面每个元素的大小变化,而不是具体到某个元素的变化。如果我们只想监听某个元素的变化的话,这种操作就很浪费性能了。 并且只有在window对象才有resize事件

所以我们今天就来认识另一个可以帮助我们监测DOM元素尺寸大小的API,Resize Observer它不仅性能上更有优势而且也具备更好的兼容性

Resize Observer(视图观察者)

定义

Resize Observer是一种JavaScript API,用于监测元素的大小和位置变化。它可以帮助我们在元素的大小或位置发生变化时触发回调函数,以适应不同视口大小或布局变化。

兼容性

image.png

用法

1.创建Resize Observer实例

首先,我们需要创建一个Resize Observer的实例。它需要一个回调函数作为参数,这个回调函数会在元素的大小发生变化时被触发。

const observer = new ResizeObserver(callback);

2.指定要观察的目标元素

然后,我们需要指定要观察的目标元素。它可以是任何DOM元素,例如一个<div>元素或其他HTML元素。

const target = document.querySelector('#elementToObserve');
observer.observe(target);

3.编写回调函数

回调函数会在元素的大小或位置变化时被触发,它接受两个参数:entriesobserver

  • entries:一个Resize Observer Entry对象的数组,每个对象描述了一个被观察元素的尺寸和位置变化。
  • observer:对观察器本身的引用。通常用于在回调函数中进行操作,例如停止观察或处理被观察元素的变化

每个 entries 对象都附带了一个 contentRect 属性,其中包含了有关被观察元素的大小信息,包括宽度(width)和高度(height),我们就可以通过contentRect 属性的宽度(width)和高度(height)来获取元素对象变化后的大小

const callback = (entries, observer) => {
  entries.forEach(entry => {
    const { target, contentRect } = entry;
    
     // 处理元素尺寸变化
    // contentRect包含了元素的新尺寸和位置信息
    
    const target = entry.target; 
    const contentRect = entry.contentRect;
    console.log(`目标元素: ${target}`); 
    console.log(`宽度: ${contentRect.width}px`);
    console.log(`高度: ${contentRect.height}px`);
  });
};

Resize方法

1. ResizeObserver.observe()

ResizeObserver.observe() 方法用于开始观察一个 DOM 元素的大小变化。当元素的大小发生变化时,Resize Observer 会调用注册的回调函数。

const resizeObserver = new ResizeObserver(entries => {
  for (const entry of entries) {
    // 处理大小变化
  }
});

const elementToObserve = document.getElementById('myElement');
resizeObserver.observe(elementToObserve);

并且我们可以观察多个元素,只需分别使用observe方法指定不同的目标元素。

const target1 = document.querySelector('#element1');
const target2 = document.querySelector('#element2');
observer.observe(target1);
observer.observe(target2);
2. ResizeObserver.disconnect()

ResizeObserver.disconnect() 方法用于停止观察一个 DOM 元素的大小变化。一旦调用 disconnect(),观察将立即停止,不再触发回调函数。

resizeObserver.disconnect(); // 停止观察所有被观察的元素
3. ResizeObserver.unobserve()

ResizeObserver.unobserve() 方法用于停止观察一个或多个 DOM 元素的大小变化。我们可以多次调用 unobserve() 来停止观察不同的元素。

const elementToUnobserve = document.getElementById('elementToStopObserving');
resizeObserver.unobserve(elementToUnobserve); // 停止观察特定元素

实战

我们创建一个div和一个按钮,当点击按钮时,改变div的宽度和高度,然后使用Resize Observer进行监听,在控制台打印每次改变后的宽高。

动画.gif

右上角点击查看详情

jcode

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

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

相关文章

MySQL总体功能

基于Innodb存储引擎的讨论 MySQL 核心功能 功能解决的问题ACID模型数据并发访问&#xff0c;和奔溃恢复安全问题,一致性&奔溃恢复索引数据查询效率问题备份容错设计,解决硬件错误带来的问题复制数据迁移监控执行数据库操作的异常记录

《嵌入式 - 嵌入式大杂烩》ARM Cortex-M寄存器详解

1 ARM Cortex-M寄存器概述 ARM Cortex-M提供了 16 个 32 位的通用寄存器(R0 - R15),如下图所示。前15个(R0 - R14)可以用作通用的数据存储,R15 是程序计数器 PC,用来保存将要执行的指令。除了通用寄存器,还有一些特殊功能寄存器。特殊功能寄存器有预定义的功能,而且必须通…

Java编码算法

编码 1.编码算法2.URL编码**URLEncoder类&#xff0c;主要进行编码****URLDecoder类&#xff0c;主要进行解码** 3.Base64编码Base64编码Base64的补充字符Base64的占位符Base64的应用 结论&#xff1a; 1.编码算法 什么是编码? ASCII码就是一种编码&#xff0c;字母A的编码是…

C语言典型例题28

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题2.5 输入一个华氏温度&#xff0c;要求输出摄氏温度。公式为C5/9(F-32)&#xff0c;要求输出要有文字说明&#xff0c;取两位小数 数学知识&#xff1a; &#xff08;1&#xff09;华氏温度与摄氏温度&#x…

MySQL(六):mysql 约束

基本介绍&#xff1a;约束用于确保数据库的数据满足特定的商业规则&#xff0c;约束包括&#xff1a;not null、unique、primary key、foreign key 、check五种。 一、主键的使用&#xff08;primary key) 字段名 字段类型 primary key用于唯一的表示表行的数据&#xff0c;当…

SpringBoot基础 第二天

SpringBoot对静态资源的映射: (1) 要在src/main/resources文件夹下创建static和templates两个文件夹staitc存储静态资源,templates存储模板引擎 (2)要在pom.xml依赖下导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>…

VS项目打包成lib库并使用

一、新建一个静态库项目 一般要把项目设为Release模式 二、添加文件 将所需要打包的头文件、源文件添加到该静态库项目中 三、生成项目 生成成功后即可在Release文件夹出现找到相应的.lib文件 四、使用静态库 将静态库文件复制到项目文件夹中&#xff0c;然后在项目属性设…

LSV实验——部署DR模式集群

目录 一、实验环境 二、配置 1、LVS 2、router 3、client 4、RS 三、配置策略 1.Director服务器采用双IP桥接网络&#xff0c;一个是VPP&#xff0c;一个DIP 2.Web服务器采用和DIP相同的网段和Director连接 3.每个Web服务器配置VIP 4.每个web服务器可以出外网 一、实验环…

CENTOS9+RSYSLOG+LOGROTATE收集日志

系统版版本为CentOS Stream release 9 rsyslog和lograte通常系统已经安装了。 #rpm -qa | grep rsyslog rsyslog-logrotate-8.2310.0-4.el9.x86_64 rsyslog-8.2310.0-4.el9.x86_64 rsyslog-gnutls-8.2310.0-4.el9.x86_64 rsyslog-gssapi-8.2310.0-4.el9.x86_64 rsyslog-relp-…

常见中间件漏洞(三、Jboss合集)

目录 三、Jboss Jboss介绍 3.1 CVE-2015-7501 漏洞介绍 影响范围 环境搭建 漏洞复现 3.2 CVE-2017-7504 漏洞介绍 影响范围 环境搭建 漏洞复现 3.3 CVE-2017-12149 漏洞简述 漏洞范围 漏洞复现 3.4 Administration Console弱囗令 漏洞描述 影响版本 环境搭建…

Netty技术全解析:ByteToMessageCodec类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

Qt/C++最新地图组件发布/历时半年重构/同时支持各种地图内核/包括百度高德腾讯天地图

一、前言说明 最近花了半年时间&#xff0c;专门重构了整个地图组件&#xff0c;之前写的比较粗糙&#xff0c;有点为了完成功能而做的&#xff0c;没有考虑太多拓展性和易用性。这套地图自检这几年大量的实际项目和用户使用下来&#xff0c;反馈了不少很好的建议和意见&#…

【技巧】IDEA 个性化配置

【技巧】IDEA 个性化配置 自动补全 关闭大小写区分 自动导包 插件 Rainbow Brackets 彩色括号 更容易区分是哪个括号

【LVS】负载均衡之NAT模式

一、LVS概念 LVS&#xff08;Linux Virtual Server&#xff09;是一个基于Linux操作系统的虚拟服务器技术&#xff0c;用于实现负载均衡和高可用性。LVS通过将客户端的请求分发到多台后端服务器上&#xff0c;从而提高整体服务的处理能力和可靠性。 二、LVS优势 高性能&…

Centos安装OpenJDK

使用yum包管理器搜索可用的OpenJDK包 sudo yum search openjdk根据你的需求选择合适的OpenJDK版本进行安装 sudo yum install java-1.8.0-openjdk.x86_64安装完成后&#xff0c;验证安装是否成功 java -version

MS2201BP以太网收发电路

MS2201BP 是吉比特以太网收发器电路&#xff0c;可以实现 超高速度的全双工数据传输。它的通信遵从 IEEE 802.3 Gigabit Ethernet 协议中的 10 比特接口的时序要求协 议 。 MS2201BP 支 持 数 据 传 输 速 率 从 1Gbps 到 1.85Gbps 。 主要特点 ◼ 电源电压&#xff…

实验24.创建并挂载文件系统

已完成实验 已完成实验链接 简介 实验 24. 创建并挂载文件系统 总结 创建文件系统: 初始化每一个分区的结构&#xff0c;把扇区划分为超级块&#xff0c;扇区位图&#xff0c;inode 位图&#xff0c;inode 表&#xff0c;根目录&#xff0c;空闲扇区 挂载分区: 创建一个分…

学习STM32(4)--STM32单片机定时器的应用

1 引 言 在STM32单片机的开发中&#xff0c;定时器是一个非常重要的模块&#xff0c;可以用于实现精准的时间控制和周期性的任务。在STM32F103系列单片机中&#xff0c;常见的定时器包括基本定时器、通用定时器和高级定时器。 2 实验目的 1.掌握STM32F103的基本定时器的使…

HAL库源码移植与使用之ADC

ADC类型&#xff1a; F1 F4 H4 H7用的都是逐次递进式 ADC电气特性&#xff1a; 该ADC只能承受3.6v以下电压 F1时钟不能超过14Mhz 流程顺序&#xff1a;先配置好1参考电压和芯片电源&#xff0c;再配置2电压输入通道并通过模拟多路开关选择通路到注入通道或规则通道&#xff0…

Spring AI -快速开发ChatGPT应用

Spring AI介绍 Spring AI是AI工程师的一个应用框架&#xff0c;它提供了一个友好的API和开发AI应用的抽象&#xff0c;旨在简化AI应用的开发工序&#xff0c;例如开发一款基于ChatGPT的对话、图片、音频等应用程序。 Spring AI已经集成了OpenAI的API&#xff0c;因此我们不需…