ResizeObserver API使用示例详解

目录
  • API介绍
  • 浏览器兼容性
  • 用法
  • 总结

API介绍

当我们需要知道一个元素的大小变化或者屏幕横竖屏时,我们需要监听window.resize事件或者window.orientationchange方法。由于reize事件会在一秒内触发将近60次,所以很容易在改变窗口大小时导致性能问题。换句话说,window.resize事件通常是浪费的,因为它会监听每个元素的大小变化(只有window对象才有resize事件),而不是具体到某个元素的变化。如果我们只想监听某个元素的变化的话,这种操作就很浪费性能了。

而ResizeObserver API就可以帮助我们:监听一个DOM节点的变化,这种变化包括但不仅限于:

  • 某个节点的出现和隐藏
  • 某个节点的大小变化

ResizeObserver API是一个新的JavaScript API,与IntersectionObserver API非常相似,它们都允许我们去监听某个元素的变化。

实际上,ResizeObserver API使用了观察者模式,也就是我们常说的发布-订阅模式。发布-订阅模式是JavaScript中典型的设计模式,在很多地方都有使用到。如Nodejs的Event模块,Vue的父子组件通信等等。对发布-订阅模式不熟悉的同学可以看看《JavaScript设计模式与开发实践》这本书,对Vue的通信感兴趣的可以看看Vue官网啦。

所以呢,我个人认为,ResizeObserver API的出现是用于替代window.resize方法糟糕的性能的。(不喜亲喷: ()

浏览器兼容性

虽然可以用来替代resize事件。但是它,很新,新到只有部分浏览器支持。

但是不要怂呀,如果想使用它,可以使用其polyfill。最低可以兼容到IE8以上的浏览器啦。所以以后在开发过程中如果想使用resize事件监听DOM的大小变化时,何不尝试一下ResizeObserver API呢?

用法

使用ResizeObserver API非常简单。ResizeObserver是个构造函数。在使用new关键字调用构造函数,返回实例对象时,需要传入一个回调函数,这个回调用于监听实例对象某个DOM节点的变化。如

      const myObserver = new ResizeObserver(entries => {
        entries.forEach(entry => {
          console.log('大小位置', entry.contentRect)
          console.log('监听的DOM', entry.target)
        })
      })
      myObserver.observe(document.body)

以上,调用实例对象的observe方法,监听整个body节点的变化,当改变窗口大小或者某个DOM节点出现或隐藏时时,就会触发回调。

触发回调后的第一个参数是一个ResizeObserverEntry对象。这里的entry.target是DOM节点本身,而entry.contentRect是一个对象,包含了节点的位置属性,如width, height, left, right, bottom, left, x, y等。

width:指元素本身的宽度,不包含padding,border值

height:指元素本身的高度,不包含padding,border值

top:指padidng-top的值

left:指padding-left的值

right:指left + width的值

bottom: 值top + height的值

x:大小与top相同

y:大小与left相同,不知道具体是指什么

明白了contentRect之后,就可以在使用这个api的时候针对不同场景获取不同的值进行业务的开发。

接着,如果想在监听多个DOM节点的变化,直接在一个实例对象上调用多次observe方法就好了。如

const myObserver = new ResizeObserver(entries => {
// 注意,entres是个数组,数组项为每个需要监听的DOM节点
   entries.forEach(entry => {
     console.log('大小位置 contentRect', entry.contentRect)
     console.log('监听的DOM target', entry.target)
   })
})
myObserver.observe(document.body)
myObserver.observe(document.querySelector('#app'))

然后,实例对象myObserver方法除了有observe方法之外,还有disconnect方法和unobserve方法。

unobserve方法,顾名思义了,就是取消监听某个DOM节点。比如说想在两秒后取消监听document.body,那么这样做就好了

window.setTimeout(() => {
   myObserver.unobserve(document.body)   // 需要接收一个参数
}, 2000)

disconnect方法呢,就是取消对所有节点的监听。比如说想在四秒后取消监听所有节点,那么

window.setTimeout(() => {
   myObserver.disconnect()    // 此时就不会再监听document.body,和#app节点了
}, 4000)

最后,在使用ResizeObserver API的时候,在每次触发元素的大小变化时,会在1s内触发回调蛮多次的。如果想进一步优化性能,可以加上throttle节流函数处理

// throttle需要自行引入哈
const myObserver = new ResizeObserver(throttle(entries => {
  entries.forEach(entry => {
    console.log('大小位置 contentRect', entry.contentRect)
    console.log('监听的DOM target', entry.target)
  })
}), 500)

这样子就能做到每个500ms触发一次回调啦。是不是很劲(粤语)

总结

好的,关于ResizeObserver API的介绍就到这里了,如果想要一个更加具体的例子,可以参考

JavaScript API ResizeObserver使用示例

https://github.com/que-etc/resize-observer-polyfill

更多关于ResizeObserver API使用的资料请关注我们其它相关文章!

(0)

相关推荐

  • JavaScript API ResizeObserver使用示例

    目录 写在前面 API介绍 浏览器兼容性 用法 unobserve() disconnect() 写在前面 今天在看同事代码的时候看见这个API,出于好奇就去了解了一下. 这是一个实验中的功能 此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀.由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变.——来自MDN的提醒 API介绍 众所周知window.resize事件能帮我们监听窗口大小的变化.但是reize事件会在一

  • JavaScript嵌入百度地图API的最详细方法

    先看效果图 一.申请成为百度开发者,获得使用地图API接口的权限,获取(AK)码. 1.打开百度地图开放平台 打开网址:http://lbsyun.baidu.com/ 找到首页导航栏的 开发文档 2.然后找到 开发文档 下面的 Web开发 中的 JavaScript API 并打开 打开之后找到 开发指南 并打开,然后找到账号和获取密钥并打开 3.然后进行申请账号 和 申请成为百度开发者 的操作 这过程中需要邮箱进行验证 创建账号完成之后 打开 获取服务密钥(AK) 应用类型选择 浏览器端 4

  • JS如何使用剪贴板操作Clipboard API

    一.Document.execCommand() 方法 Document.execCommand()是操作剪贴板的传统方法,各种浏览器都支持. 它支持复制.剪切和粘贴这三个操作. document.execCommand('copy')(复制) document.execCommand('cut')(剪切) document.execCommand('paste')(粘贴) (1)复制操作 复制时,先选中文本,然后调用document.execCommand('copy'),选中的文本就会进入剪

  • JavaScript接入百度地图API的方法步骤

    目录 一.百度地图API接入 二.在HTML中使用百度地图API 1.在html中引入百度地图js文件 2.在网页中定义一个DIV用于显示地图 3.在网页中显示地图 4.添加可选控件 5.定位功能 6.添加地图标记 7.给地图标记添加点击事件 8.添加信息窗口 9.路径规划 10.正逆地址解析 一.百度地图API接入 1.搜索百度地图开发平台 2.注册百度账号 3.登陆并申请成为开发者 4.在百度地图开发平台的首页选择控制台,在控制台中创建应用 创建好应用以后就能在控制台我的应用中看到这个应用,

  • ResizeObserver API使用示例详解

    目录 API介绍 浏览器兼容性 用法 总结 API介绍 当我们需要知道一个元素的大小变化或者屏幕横竖屏时,我们需要监听window.resize事件或者window.orientationchange方法.由于reize事件会在一秒内触发将近60次,所以很容易在改变窗口大小时导致性能问题.换句话说,window.resize事件通常是浪费的,因为它会监听每个元素的大小变化(只有window对象才有resize事件),而不是具体到某个元素的变化.如果我们只想监听某个元素的变化的话,这种操作就很浪费

  • Gin与Mysql实现简单Restful风格API实战示例详解

    目录 It works main.go 编译运行 数据库 CURD 增删改查 增 查 查询列表 Query 查询单条记录 QueryRow 改 删 组织代码 封装模型方法 Handler函数 组织项目 数据库处理 数据model封装 handler 路由 分组路由 app入口 总结 我们已经了解了Golang的Gin框架.对于Webservice服务,restful风格几乎一统天下.Gin也天然的支持restful.下面就使用gin写一个简单的服务,麻雀虽小,五脏俱全.我们先以一个单文件开始,然

  • Java8新特性时间日期库DateTime API及示例详解

    Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和SimpleDateFormat等API来处理日期相关操作,这篇文章你一定不要错过.来刷新你的知识库吧! 背景 Java对日期.日历及时间的处理一直以来都饱受诟病,比如java.util.Date和java.util.Calendar类易用性差,不支持时区,非线程安全:还有用于格式化日期的类DateFormat也是非线程安全的等问题. J

  • ResizeObserver 监视 DOM大小变化示例详解

    目录 引言 使用 entry 其它 API 兼容与 polyfill 引言 ResizeObserver 用于监听元素的大小尺寸变化,常见用于监听自适应大小的元素变化引起的宽高变化时处理应宽高变化而需要 JS 做特定处理的场景. 说下我自己使用中遇到的三个场景: Tabs 组件的头部区域在超过宽度/高度时需要展示出超出滚动按钮 组件中存在超出隐藏的场景,如多个标签超出一行后将剩余标签进行压缩等 Table 组件横向滚动如果存在某几列数据需要固定展示的情况下需要根据宽度来计算是否需要出现滚动条和滚

  • javascrip高级前端开发常用的几个API示例详解

    目录 MutationObserver API 特点 IntersectionObserver API 举个例子 图片懒加载 无限滚动 getComputedStyle() API 与style的异同 getBoundingClientRect API 应用场景 1.获取 dom 元素相对于网页左上角定位的距离 2.判断元素是否在可视区域内 MutationObserver MutationObserver 是一个可以监听 DOM 结构变化的接口. 当 DOM 对象树发生任何变动时,Mutati

  • Composition API思想封装NProgress示例详解

    目录 正文 安装和基本使用 自己实现一个 正文 最近在用vue3封装一套后台管理模版,自然会用到NProgress.如果你没有用过,你可以看一下instagram,youtube这些网站,它们都有一个顶部加载条,这也是现在最流行的网页加载条. 于是我发现了@vueuse/integrations中的useNProgress,我们先看一下Anthony Fu大神如何去封装的,然后咱们再去试着自己实现一下. 安装和基本使用 npm i nprogress @vueuse/integrations 基

  • Java8新特性Optional类及新时间日期API示例详解

    目录 Optional类 以前对null的处理 Optional类介绍 Optional的基本使用 Optional的常用方法 新时间日期API 旧版日期时间的问题 新日期时间API介绍 日期时间的常见操作 日期时间的修改和比较 格式化和解析操作 Instant类 计算日期时间差 时间校正器 日期时间的时区 JDK新的日期和时间API的优势 Optional类 面试官:Optional类了解过吗? 这个Optional类主要是解决空指针的问题. 以前对null的处理 @Test public v

  • vue整合项目中百度API示例详解

    目录 官网介绍 申请密钥 官方示例 项目实战 创建地图 获取经纬度 创建Map实例 两个坐标点之间的距离 查询地点信息 Vue项目中整合百度API获取地理位置的方法 组件中使用 vue-baidu-map 百度地图官方vue组件 官网介绍 百度地图 JavaScript API 是一套由 JavaScript 语言编写的应用程序接口 可帮助您在网站中,构建功能丰富交互性强的地图应用 支持PC端和移动端,基于浏览器的地图应用开发,且支持HTML5特性的地图开发 官网传送门 百度地图JavaScri

  • vue组合式API浅显入门示例详解

    目录 正文 组合式API setup 变量声明 目前比起选项式API的优点 生命周期 正文 在react推出了hook之后,vue也在vue3里面添加了组合式API,鉴于这个时间间隔,我有理由认为组合式api和hook还是有一些关系的.不过在我具体的使用中,我并没发现这两个方法太多的相同点,不过鉴于vue自动发布之后就与react之间那剪不断理还乱的量子力学关系,估计会有很多人会问及这俩之间的异同.我还没到能分辨出异同的地步,就简单的介绍一下vue的组合式API吧. 组合式API 在vue3.0

  • Vue2如何支持composition API示例详解

    目录 前言 如何使用 原理解析 响应式( ref reactive 的实现) 总结 前言 自从 Vue3 发布之后,composition API 这个词走入写 Vue 同学的视野之中,相信大家也一直听到 composition API 比之前的 options API 有多好多强,如今由于 @vue/composition-api 插件的发布,Vue2 的同学也可以上车咯,接下来我们主要以响应式的 ref 和 reactive 来深入分析一下,这个插件是怎么实现此功能的. 如何使用 // 入口

随机推荐