首页 > 其他分享 >JS监听dom高度变化方法总结

JS监听dom高度变化方法总结

时间:2023-05-31 16:35:10浏览次数:52  
标签:const dom height MutationObserver 节点 JS 监听

前沿:

有时候我们需要监听dom的变化,比如获取父元素的高度,动态的设置子元素的高度,所以需要监听 dom 的高度变化,才能准确获取dom的高度,那么有哪些监听dom高度变化的方法呢?今天简单列举一下。

1、MutationObserver 构造函数

Mutation Observer API 用来监视 DOM 变动。DOM 的任何变动,比如节点的增减、属性的变动、文本内容的变动,这个 API 都可以得到通知。 目前来看,IE11及以上都可以兼容。兼容性还可以,可以大胆使用。

// 创建一个观察器实例并传入回调函数
const observer = new MutationObserver(callback);

// 以上述配置开始观察目标节点
observer.observe(targetNode, config);

// 之后,可停止观察
observer.disconnect();

Mutation Observer 的应用

const element = document.getElementById('id');
const MutationObserver = window.MutationObserver || window.webkitMutationObserver || window.MozMutationObserver;

const recordHeight = 0;
const mutationObserver = new MutationObserver(function (mutations) {
  console.log(mutations);

  let height = window.getComputedStyle(haoroomsId).getPropertyValue('height');
  if (height === recordHeight) {
    return;
  }
  recordHeight = height;
  console.log('高度变化了');
  // 之后更新外部容器等操作
})

mutationObserver.observe(element, {
  childList: true, // 子节点的变动(新增、删除或者更改)
  attributes: true, // 属性的变动
  characterData: true, // 节点内容或节点文本的变动
  subtree: true // 是否将观察器应用于该节点的所有后代节点
})

注意:如果要监听元素的宽、高,元素要设置width和height属性,没有该属性值时,宽高发生变化时 MutationObserver监听函数不会触发

2、ResizeObserver 

ResizeObserver 接口监视 Element 内容盒或边框盒或者 SVGElement 边界尺寸的变化。

// create an Observer instance
const resizeObserver = new ResizeObserver((entries) =>
  console.log('Body height changed:', entries[0].target.clientHeight)
);

// start observing a DOM node
resizeObserver.observe(document.body);

参考原文:js监听dom高度变化方法总结

 

标签:const,dom,height,MutationObserver,节点,JS,监听
From: https://www.cnblogs.com/hyt09/p/17446548.html

相关文章

  • java.lang.ClassCastException: com.alibaba.fastjson2.JSONArray cannot be cast to
    是这样的,今天跟着写springboot项目的时候,前端登录的时候报403错误。检查了半天,是后端的问题报错代码: 第二句报错提示如下 说是JSONArray不能转String,但我这也不是JSONArry转String而是Object转String啊。网上搜了半天,用了好多种方法也没什么用最后索性死马当活马医,让它......
  • Web - js数组对象去重
    letarr=[{id:'1',key:'1',value:'明月'},{id:'3',key:'2',value:'可欣'}}]Map()方法set方法设置key所对应的键值,然后返回整个Map结构。如果key已经有值,则键值会被更新,否则就新生成该键。values方法可......
  • docker json日志把服务器磁盘占满,日志清理
    定时任务crontab-l03***root/etc/init.d/clean-docker-log.sh103***root/etc/init.d/cleandocker.sh-脚本[[email protected]]#catclean-docker-log.sh#!/bin/shecho"====================startcleandockercontainerslogs=============......
  • JS大文件分片上传/多线程上传
    ​ 一、概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。 二、Range  用于请求头......
  • JSP原理深度刨析
    1. 我的第一个JSP程序  351.1 原理  35 在WEB-INF目录之外创建一个index.jsp文件,然后这个文件中没有任何内容。- 将上面的项目部署之后,启动服务器,打开浏览器,访问以下地址:  - http://localhost:8080/jsp/index.jsp 展现在大家面前的是一个空白。  - 实际上访问以上的......
  • vue使用qrcodejs2生成二维码且底部带文字描述,支持下载(日常记录)
    使用qrcodejs2生成二维码的方法:/***二维码生成*@paramcontent生成二维码内容*@paramdesc二维码底部描述*@paramqrcodeDom挂在dom*@returns{*|HTMLDivElement}*/exportfunctiongeneratorQrcode(content,desc,qrcodeDom=null){constqrcodeCo......
  • 多线程或监听器@Autowired注入null空指针
    //问题:在多线程中使用@Autowired注入IUserService时,userService使用时为null,获取不到bean//原因:newthread不在spring容器中,也就无法获得spring中的bean对象;@AutowiredprivateIUserServiceuserService;//解决:手动获取bean对象privateIUserServiceuserService=AppCo......
  • 序列化Java对象重命名字段,@JSONField、@JsonProperty、@SerializedName
    @JSONField主要用于返回出参转换这个注解分别可以注解在实体类的属性、setter和getter方法上publicclassTest{/*注解在属性上的时候可以设置一些序列化、格式化的属性@JSONField(serialize=false)---->序列化的时候忽略这个属性@JSO......
  • vue监听浏览器窗口大小变化,做对应的操作
    页面初始化mounted的时候,通过document.body.clientWidth和document.body.clientHeight获取到浏览器的宽和高,然后通过window.onresize来监听浏览器窗口的变化,在这里来改变我们的变量宽和高即可。(created()的时候不行,因为此时document还没有生成)<template><sectionclass="p-1......
  • AngularJS directive入门例子
    这是《AngularJS》这本书里面提供的一个例子: JS代码:varexpanderModule=angular.module('expanderModule',[])expanderModule.directive('expander',function(){return{restrict:'EA',replace:true,transclude:true......