首页 > 其他分享 >js 对DOM观察大小改变的处理通知方法。ResizeObserver的应用。

js 对DOM观察大小改变的处理通知方法。ResizeObserver的应用。

时间:2022-11-01 14:45:03浏览次数:69  
标签:target DOM js resizeObserver 宽度 let ResizeObserver

环境

代码示例使用了VUE3的setup的语法糖。

代码


// 这里使用弱引用
// key是DOM实例
// value是溢出的结果,true标识溢出,false标识没有溢出。
const overflowResultMap = reactive(new WeakMap());

const handlerSizeChange = (target) => {
  console.log("handlerSizeChange",target);

  // dom的总内容的宽度,包含被剪切的元素的宽度。参阅引用4文档
  let scrollWidth = target.scrollWidth
  // dom的可视区域。参阅引用4文档
  let clientWidth = target.clientWidth

  // 当内容宽度和总宽度不一样,则设置为已经溢出了。
  if(scrollWidth > clientWidth){
    // 当内容的总宽度大于可视区域的宽度,说明这个元素溢出了。可以根据这个进行判断一些场景的处理方法。
    overflowResultMap.set(target, true)
  }else{
    overflowResultMap.set(target, false)
  }
  
}


// 获取菜单的根DOM实例
let rootMenu = ref()

onMounted(()=>{

  ApiPromise.then(()=>{
     // 这里当api接口返回,页面渲染完成,这里的进行判断下是否初始加载页面已经符合这个条件了
    // 因为如果你的页面使用了min-width属性限制最小宽度了,当页面已经处于最小宽度以内,ResizeObserver监听的回调不会被触发执行。
    nextTick(()=>{
      // 初始状态进行判断下
      handlerSizeChange(rootMenu.value)
    })
  })

})

let resizeObserver = new ResizeObserver((entries, observer) => {
  entries.forEach(entry => {
    let target = entry.target
    console.log("ResizeObserver",target);
    handlerSizeChange(target)
  })
})

// 这里再对应的位置进行观察dom和取消观察。
onMounted(()=>{
  resizeObserver.observe(rootMenu.value, {
    box: 'border-box'
  })
})
onUnmounted(()=>{
  resizeObserver.unobserve(rootMenu.value)

  // 断开连接会把resizeObserver实例观察的多个DOM都给断开观察,切记。
  resizeObserver.disconnect()
})

参阅

  1. https://developer.mozilla.org/zh-CN/docs/Web/API/IntersectionObserver
  2. https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API
  3. https://developer.mozilla.org/zh-CN/docs/Web/API/ResizeObserver/ResizeObserver
  4. 判断DOM是否溢出可视窗口,出现滚动条的判断几个属性,offsetWidth,clientWidth,scrollWidth

标签:target,DOM,js,resizeObserver,宽度,let,ResizeObserver
From: https://www.cnblogs.com/XingXiaoMeng/p/16847634.html

相关文章

  • js显示视频和弹幕
    HTML:<!DOCTYPEhtml><htmllang="en"><head>  <metacharset="UTF-8">  <metahttp-equiv="X-UA-Compatible"content="IE=edge">  <metaname="view......
  • js多种方法取数组的最后一个元素
    1.pop()方法,删除数组最后一个并返回该元素利用这个方法可以取到数组的最后一个,同理shift()可以取到数组的第一个(shift()删除数组第一个并返回该元素vararr=[1,2,3];......
  • PowerShell 获取虎扑步行街热榜json数据
    代码(curl"https://bbs.hupu.com/all-gambia").ParsedHtml.getElementsByClassName('t-info')|%{$texts=$_.getElementsByTagName('span')@{url=......
  • 探索使用 ViewContainerRef 的 Angular DOM 操控技术
    探索使用ViewContainerRef的AngularDOM操控技术​​https://indepth.dev/posts/1052/exploring-angular-dom-manipulation-techniques-using-viewcontainerref​​每当......
  • (转)js正则表达式验证大全
    js正则表达式验证大全(转)/判断输入内容是否为空    functionIsNull(){       varstr=document.getElementById('str').value.trim();       if(s......
  • js判断数据类型
    ES5中,js中数据类型:number、string、boolean、undefined、null、objectjs中获取数据类型常用的四种方式实例:vara=123,b=true,c="123",d=undefi......
  • dom4j操作XML时转换对象时提示:对实体
    分享知识传递快乐 收到一个报文,需要将报文转成实体类。但报文中有几个URL。在转换的时DocumentHelper.parseText(xmlStr)抛出异常,返回org.dom4j.DocumentException:E......
  • Jsch远程执行shell脚本命令
    分享知识传递快乐JSch是JavaSecureChannel的缩写。JSch是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成......
  • AJAX基础+Axios快速入门+JSON使用+综合案例
    目录1、AJAX1.1概述1.1.1作用1.1.2同步和异步1.2快速入门1.2.1服务端实现1.2.2客户端实现1.3案例1.3.1需求1.3.2分析1.3.2后端实现1.3.3前端实现2、Axios异步......
  • Unity反序列天气API的JSON
    心知天气:https://www.seniverse.com/JSON:{"results":[{"location":{"id":"C23NB62W20TF","name":"西雅图","country":......