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

如何优雅的监听dom的变化(尺寸)

ResizeObserver的用法

  • 介绍
    • ResizeObserver 是什么?
    • 三步走:最小可运行例子
    • 生命周期与内存管理
    • 回调参数详解
  • 在 Vue3 中的两种姿势
  • 实例的observe方法是否可以传入多个参数

介绍

ResizeObserver 是什么?

ResizeObserve
浏览器原生 API,用来「异步」监听某个(或某些)DOM 元素的内容盒 / 边框盒尺寸变化

替代传统的 window.resize + getBoundingClientRect 轮询,避免全局事件、减少重排,性能更优

三步走:最小可运行例子

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="box" style="resize:both;overflow:hidden;border:1px solid">拖拽右下角改变我<div id="box1" style="resize:both;overflow:hidden;border:1px solid;margin: 35px;">拖拽右下角改变我</div></div><script>const box = document.getElementById('box');const box1 = document.getElementById('box1');// 1️⃣ 创建观察者const observer = new ResizeObserver(entries => {for (const entry of entries) {console.log('entry',entry)const { width, height } = entry.contentRect;  // 内容区尺寸console.log(`新尺寸 ${width}×${height}`);}});// 2️⃣ 开始观察observer.observe(box);observer.observe(box1);// 3️⃣ 随时可停止// observer.unobserve(box);  // 单个// observer.disconnect();    // 全部</script>
</body>
</html>

生命周期与内存管理

• observe() 后立即生效,元素被移除时会自动停止,不会泄漏。
• 组件卸载前手动 disconnect() / unobserve() 可提前释放引用(尤其 SPA)。

回调参数详解

每个 entry(ResizeObserverEntry)包含:

属性含义兼容性
target被观察的节点100%
contentRectDOMRectReadOnly,内容区宽高100%
borderBoxSize{inlineSize, blockSize} 数组部分浏览器
contentBoxSize同上,内容盒同上

在 Vue3 中的两种姿势

vue3代码中实际运行

import { onMounted, onUnmounted, ref } from 'vue'const myDiv = ref(null)
const divWidth = ref(0)
let observer = nullonMounted(() => {if (myDiv.value) {observer = new ResizeObserver(entries => {divWidth.value = entries[0].contentRect.width})observer.observe(myDiv.value)}
})onUnmounted(() => {observer?.disconnect()
})
<template><div ref="root" class="chart-container"></div>
</template><script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue'const root = ref(null)
let observer = nullonMounted(() => {observer = new ResizeObserver(entries => {const { width, height } = entries[0].contentRect// 调用 echarts.resize({width, height}) 等})observer.observe(root.value)
})onBeforeUnmount(() => observer?.disconnect())
</script>

使用 @vueuse/core 的 useResizeObserver(更简洁)

import { useResizeObserver } from '@vueuse/core'const { width, height } = useResizeObserver(root)

实例的observe方法是否可以传入多个参数

不可以。
ResizeObserver.prototype.observe(target, options?) 只接受两个参数:
target(必需):要监听的单个 DOM 元素。
options(可选):一个配置对象,如 { box: ‘border-box’ },用于指定观察哪个盒模型。

因此:
❌ 不能一次传入多个元素;想监听 N 个节点,就要对每个节点都调用一次 observe()。
✅ 同一个 ResizeObserver 实例可以多次调用 observe(),把所有需要监听的元素都注册进去;在回调里通过 entry.target 区分来源即可

const obs = new ResizeObserver(entries => {entries.forEach(entry => {console.log(entry.target, entry.contentRect);});
});// 分别注册 3 个元素
obs.observe(document.querySelector('#a'));
obs.observe(document.querySelector('#b'));
obs.observe(document.querySelector('#c'));
http://www.dtcms.com/a/344851.html

相关文章:

  • php apache无法接收到Authorization header
  • JDK17 升级避坑指南:技术原理与解决方案详解
  • 【学习记录】structuredClone,URLSearchParams,groupBy
  • 【大语言模型 14】Transformer权重初始化策略:从Xavier到GPT的参数初始化演进之路
  • 网络编程8.22
  • Python面试常考函数
  • 技术分析 剖析一个利用FTP快捷方式与批处理混淆的钓鱼攻击
  • RSS与今日头条技术对比分析
  • Unreal Engine UObject
  • 嵌入式-EXTI的工作原理和按钮实验-Day19
  • 6口千兆图像采集卡:突破多路高清视觉系统的传输瓶颈
  • DFS序与树链剖分入门
  • RORPCAP: retrieval-based objects and relations prompt for image captioning
  • 多元函数积分学
  • kafka生产者 消费者工作原理
  • 线性回归8.21
  • 椭圆、双曲线、抛物线总对比表
  • Java 对象内存布局详解
  • Docker容器化部署实战:Tomcat与Nginx服务配置指南
  • 大模型推理-MTK Neurapilot sdk了解与环境配置-1
  • Unreal Engine UPrimitiveComponent
  • QT5 UI界面上Scroll Area控件显示滚动条
  • 浏览器开发CEFSharp+X86+win7(十三)之Vue架构自动化——仙盟创梦IDE
  • Lua脚本如何执行主程序的C函数
  • 智能二维码QR\刷IC卡\人脸AI识别梯控系统功能设计需基于模块化架构,整合物联网、生物识别、权限控制等技术,以下是多奥分层次的系统设计框架
  • 攻防世界—bug
  • 深度学习①【张量、全连接神经网络、激活函数、交叉熵损失函数】
  • 机器学习之线性回归:原理、实现与实践
  • 定制化鲜狗粮:宠物经济浪潮下的“精准喂养”革命
  • Python 办公自动化实战:Excel 批量处理 + 自动发邮件