监听DOM尺寸变化 - ResizeObserver

news2025/2/21 22:26:46

一、与 MutationObserver Api的区别

  • MutationObserver 主要用来监听 DOM 元素的属性和节点变化的,非 DOM 样式尺寸,可查看之前一篇 blog - DOM规范 - MutationObserver接口观察DOM元素的属性和节点变化
  • ResizeObserver 主要用来监听 DOM 元素的 内容区域 的尺寸变化,可以监听到 Element 的内容区域或 SVGElement 的边界框改变

二、用法

1. 构造函数,创建并返回一个 ResizeObserver 对象

const resizeObserver = new ResizeObserver(entries => {
  console.log('监听到了尺寸变化了...', entries)
})

resizeObserver.observe(document.getElementById('box'))

  • resizeObserver 是返回的一个操作对象,可调用其中的方法来监听、取消监听 DOM 元素等操作。

  • observe 方法用于开始观察指定的 Element 或 SVGElement 的尺寸变化。

  • entries 参数返回是一个数组,里面包含监听的每个 DOM 元素的相关信息,其中 contentRect 包含的是变化后的 内容区域 的尺寸信息。

在这里插入图片描述

2. unobserve 结束观察指定的 Element 或 SVGElement

resizeObserver.unobserve(document.getElementById('box'))

3. disconnect 取消和结束目标对象上所有对 Element或 SVGElement 观察

resizeObserver.disconnect()

三、完整栗子及注意点~

  • #box1 是 标准盒模型(w3c标准),width = 内容区(content),height 同理。

  • #box2 是边框盒模型(IE盒模型),width = 内容区(content)+ 内边距(padding) + 内边框(border),height 同理。

<!DOCTYPE html>
<html lang="zh_CN">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>ResizeObserver 测试</title>
  <style>
    body {
      margin: 0;
    }
    #box1 {
      width: 200px;
      height: 200px;
      margin: 10px;
      padding: 10px;
      background-color: rgb(195, 245, 175);
    }
    #box2 {
      width: 200px;
      height: 200px;
      margin: 10px;
      padding: 10px;
      box-sizing: border-box; /** 注意,此处盒模型与 #box1 不同 */
      background-color: rgb(175, 182, 245);
    }
  </style>
</head>
<body>

  <button onclick="change1()">更改box1样式</button>
  <button onclick="change2()">更改box2样式</button>
  <button onclick="cancel1()">取消监听box1</button>
  <button onclick="cancel2()">取消监听box2</button>
  <button onclick="cancel()">取消所有元素</button>

  <div id="box1">这是一个测试盒子111~~~</div>

  <div id="box2">这是一个测试盒子222~~~</div>
  

  <script>
    const box1 = document.getElementById('box1')
    const box2 = document.getElementById('box2')
    let b1width = 1
    let b2width = 1

    const resizeObserver = new ResizeObserver(entries => {
      console.log('监听到了尺寸变化了...', entries)
    })

    resizeObserver.observe(box1)
    resizeObserver.observe(box2)

    function change1 () {
      const rect = box1.getBoundingClientRect()
      // box1.style.width = rect.width + 10 + 'px'
      // 因 #box1 是标准盒,所以边框(border)尺寸变化不会引起内容区(content)尺寸变化,所以以下语句`不会`触发观察的回调函数事件
      box1.style.border = 1 + b1width + 'px solid red'
      b1width ++
    }

    function change2 () {
      const rect = box2.getBoundingClientRect()
      // box2.style.width = rect.width + 10 + 'px'
      // 因 #box2 是边框盒,所以边框(border)尺寸变化会引起内容区(content)尺寸变化,所以以下语句`会`触发观察的回调函数事件
      box2.style.border = 1 + b2width + 'px solid red'
      b2width ++
    }

    function cancel1 () {
      resizeObserver.unobserve(box1)
    }

    function cancel2 () {
      resizeObserver.unobserve(box2)
    }

    function cancel () {
      resizeObserver.disconnect()
    }

  </script>
</body>
</html>

打印信息

在这里插入图片描述
盒模型示意图

在这里插入图片描述

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

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

相关文章

Stable Diffusion WebUI 不同采样方法的效果、耗时对比记录

测试方法 所有测试除了采样方法调整&#xff0c;其他均保持一致。主要参数信息如下 1girl, 3d, architecture, blurry, blurry background, blurry foreground, breasts, brown hair, building, cherry blossoms, city, cityscape, cosplay photo, cowboy shot, day, depth o…

hive2.3.7安装部署-问题:show databases;没反应

目录 一、安装包准备 二、安装mysql 三、hive安装 四、hive启动 五、问题 环境&#xff1a;CentOS7.2.xx、hadoop2.6.4、jdk1.8.0xx、mysql-5.7.38 hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射成一张表&#xff0c;并提供类SQL查询功能。…

【计算机组成原理期末课设作业】16位微型计算机实现——MOVS串传送扩展指令设计

16位微型计算机实现——MOVS串传送扩展指令设计&#x1f60e; 前言&#x1f64c;教学目的&#xff1a;1、数据**加粗样式**通路分析2、微程序控制器分析3、指令系统分析4、微程序控制器指令周期流程图5、微指令编码6、测试程序和运行结果&#xff08;1&#xff09;首先先在内存…

asp.net core 框架搭建2-搭建MVC后台管理系统

文章目录 系列文章1.项目搭建1.1 新建Asp.net core MVC项目1.2 ASP.NET Core MVC目录结构1.3 创建一个控制器&#xff0c;与页面数据交互1.4 实现一个登录页面1.5 实现后台管理主界面 2.过程中知识点和涉及到的问题2.1 session的使用2.2 EF Core连接mysql 源码下载 作者&#x…

机器学习29:《推荐系统-II》协同过滤

在《机器学习28&#xff1a;《推荐系统-I》概述》一文中&#xff0c;笔者介绍了“基于内容过滤&#xff08;content-based filtering&#xff09;”和“协同过滤&#xff08;Collaborative Filtering&#xff09;”两种常见的【候选 Item 池】生成方法。其中&#xff0c;基于内…

android studio使用Flutter Inspector调试布局

1、点击anroid studio右侧的Flutter Inspector按钮 2、点击展开布局右上角的‘Select Widget Mode’&#xff0c;即可实现点击相关节点&#xff0c;真机上可以看到相关的方框 如下图

月薪65k的大厂项目经理,是种什么体验

早上好&#xff0c;我是老原。 之前给大家更新了几期关于项目管理行业的面试题&#xff0c;又值一年毕业季&#xff0c;想入行的新手小白&#xff0c;或者想跳槽的行业大佬可以码起来了。 有很多粉丝朋友都在后台给我留言&#xff0c;想看云计算行业的岗位分析&#xff0c;今…

前端开发:JS中常用事件汇总

前言 在前端开发中&#xff0c;关于事件相关的操作是非常常见的操作&#xff0c;尤其是实际业务场景中涉及复杂交互的需求。在JS中比较常用的事件有很多&#xff0c;而且涉及不同方式不同类型的点击事件&#xff0c;一般情况下事件会和函数结合使用&#xff0c;这就是事件和函数…

Python 背包问题

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

MySQL阶段DAY20(附笔记)

【注意】&#xff1a;工厂模式学习知识结构如下&#xff1a; &#xff08;一&#xff09;、单例模式 1.Single类&#xff1a; 使用懒汉式&#xff1a;对象的延迟加载&#xff0c;安全的&#xff0c;高效的应用 双重判断提升效率和安全性 package singleton;/** 单例设计模式之…

Prisma 国内镜像设置

背景 相信大家在体验完 prisma 后&#xff0c;一般都是会感觉开发起来很方便&#xff0c;功能使用起来很顺畅很爽&#xff0c;但是想推广起来团队内使用的时候发现。。。 原因是prisma client 需要下载几个引擎&#xff0c;在其他没有翻墙工具的小伙伴使用的时候发现一直下不下…

供应商管理解决方案实战指南:打造高效供应链

在现代商业环境中&#xff0c;供应商管理是企业成功运营的关键因素之一。随着全球化和供应链的复杂性不断增加&#xff0c;供应商管理面临着许多挑战&#xff0c;如供应商选择、供应商绩效评估和供应链风险管理等。为了解决这些挑战&#xff0c;企业需要采取一系列的解决方案&a…

Sui x KuCoin Labs夏季黑客松第四批入围项目公布

自Sui x KuCoin Labs夏季黑客松开放注册以来&#xff0c;收获了众多开发者的关注和报名参与。现在比赛的报名阶段已结束&#xff0c;截至目前为止&#xff0c;我们已经公布了三批入围项目名单&#xff0c;现在第四批入围名单项目新鲜出炉&#xff0c;最后一轮入围结果将于7月12…

十、HTML中的浮动

1、浮动 1、浮动 块级元素 独占一行 若块级元素宽度较少时&#xff0c;导致后续是空白 布局 先整体&#xff0c;后局部 先简单&#xff0c;再复杂 复杂再划分 整体布局 局部 2、float属性 浮动飘 float属性 让网页元素按照标准文档流方式显示 自上到下&#xff0c;…

19.内部温度传感器

1.STM32内部温度传感器介绍&#xff1a; 内部温度传感器支持的温度范围为&#xff1a;-40~125度&#xff0c;精度为1.5℃左右&#xff1b;T(℃){(V25-Vsense)/Avg_Slope}25;STM32的内部温度传感器是直接连接在ADC内部输入通道&#xff0c;在ADC1通道16连接的内部温度传感器&am…

Django基础入门⑬:Cookie和Session详讲和Django HTML表单实战讲解

Django基础入门⑫&#xff1a;Django 对象查询详解&#xff0c;分组聚合 Cookie和SessionCookie简述Session使用Session的定义理解Session的作用 Session配置Session的基本操作Session在settings.py中的配置Cookie和Session的区别 Django HTML表单实战HTML表单实现用户的登录实…

基于混沌集成决策树的电能质量复合扰动识别(matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 程序链接 1 主要内容 该程序参考《基于混沌集成决策树的电能质量复合扰动识别》&#xff0c;主要做的是S变换电能质量扰动识别&#xff0c;通过S变换对电能质量扰动&#xff08;谐波&#xff0c;闪变&#xff0c;暂升等单一扰动和…

15 | 边界:微服务的各种边界在架构演进中的作用?

目录 演进式架构 微服务还是小单体&#xff1f; 微服务边界的作用 逻辑边界 物理边界 代码边界 正确理解微服务的边界 总结 那重点落到边界的时候&#xff0c;总结一下就是&#xff0c;微服务的设计要涉及到逻辑边界、物理边界和代码边界等等。 那么这些边界在微服务架…

vue清除地址栏参数(可以单个,可以多个)

需求 vue跳转新页面后&#xff0c;清除url里面的参数&#xff0c;就是上一个页面带过来的参数&#xff0c;只用一次 mounted () {this.$nextTick(() > {let url this.getnewurl()window.history.replaceState(null, null, url);})},methods: { //根据参数名去清除&#xf…

深度学习训练营之调用Gensim来训练Word2Vec模型

深度学习训练营之调用Gensim来训练Word2Vec模型 原文链接环境介绍前置工作下载Gensim库对于原始语料进行分词添加停用词 模型训练模型介绍模型正式训练 计算词频 原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#…