IntersectionObserver 实用方向

简介: 使用 IntersectionObserver API 来替换实现一些老版本的逻辑。例如:图片懒加载、滑动到底部加载更多。

上一篇文章讲了在 js 中如何实现图片懒加载,这一篇则讲解,如何实现滑动到底部加载更多。
跟图片懒加载一样,滑动到底部加载更多,一般传统方式是监听 scroll 事件,现在有更简单的方式为 IntersectionObserver

传统方式(scroll)

通过监听滚动容器的 scroll 事件,每次滑动后,判断是否已经滑动到了底部,如果已经滑动到了底部,则触发加载事件。

let timer = -1 // 函数防抖
let $scroll = document.querySelector('#scroll') // 滑动的容器

// 为滑动的容器添加 scroll 事件
$scroll.addEventListener('scroll', function () {
  clearTimeout(timer)
  timer = setTimeout(() => {
    // 滚动所在容器的可视高度
    let height = $scroll.getBoundingClientRect().height
    let top = $scroll.scrollTop // 滚动的距离
    let scrollHeight = $scroll.scrollHeight // 滚动容器的实际高度
    if (scrollHeight - top - height <= 60) {
      // 处于滑动临界值内,处理加载更多
      loadmore() // 加载更多
    }
  }, 150) // 避免过于频繁,防抖
})

跟图片懒加载一样,由于频繁的触发 scroll 的性能影响问题,使用 IntersectionObserver 能够解决这个问题。

IntersectionObserver

要使用 IntersectionObserver 来判断是否滑动到底部,我们就需要在列表的底部,添加一个元素用来占位,同时我们可以给这个元素加一个提示,这样我们既能通过代码判断是否滑动到底部,同时又给出了友好的提示。

let $loadmoreTip = document.querySelector('.loadmore-tip')
// 构建观察器
let observer = new IntersectionObserver((entries) => {
  for (let entry of entries) {
    /*
     * 检测节点是否可见,可以通过 isIntersecting 验证,布尔值
     * 如果目标元素与交叉区域观察者对象(intersection observer)的根相交,返回 true
     * 此时描述了变换到交叉时的状态; 
     * 如果返回 false, 那么可以由此判断,变换是从交叉状态到非交叉状态.
     * 同时也可以根据 intersectionRatio 验证
     * intersectionRatio:目标元素的可见比例
     * 即 intersectionRect 占 boundingClientRect 的比例
     * 完全可见时为1,完全不可见时小于等于0
     * 如果不可见,就返回:
     *   if (entry.intersectionRatio <= 0) return;
     */
    if (entry.isIntersecting === true) { // 检测节点是否可见
      // 处于交叉可见状态
      loadmore()
    }
  }
}, { threshold: 0.6 });

// 往观察器列表注册观察元素
observer.observe($loadmoreTip);
相关文章
|
JSON JavaScript 数据格式
Vue中 引入使用 vue-json-editor
Vue中 引入使用 vue-json-editor
2002 0
Vue中 引入使用 vue-json-editor
|
开发工具 git
git clone TimeOut 无法下载 git 设置代理
git clone TimeOut 无法下载 git 设置代理
321 0
|
算法 程序员 编译器
美丽的代码:规范go应用代码注释
【6月更文挑战第30天】本文介绍注释应与代码同步,避免误导,且关键点解释。使用LLVM构建编译器示例展示Go语言规范。注释虽有局限,但在解释复杂逻辑、业务规则时仍有其价值。程序员需平衡注释与代码的关系,创造更优的代码。
1218 0
美丽的代码:规范go应用代码注释
|
存储 人工智能 Java
如何用Java找出两个List中的重复元素,读这一篇就够了
在Java编程中,我们经常需要找出两个列表(List)中的重复元素。在本文中,我们将探讨三种方法来实现这一目标。
|
SQL 前端开发 Java
通过使用Mybatis插件来实现数据的分页功能
通过使用Mybatis插件来实现数据的分页功能
|
小程序 UED 开发者
小程序开发必备功能的吐血整理【个人中心界面样式大全】
小程序开发必备功能的吐血整理【个人中心界面样式大全】
1368 1
小程序开发必备功能的吐血整理【个人中心界面样式大全】
|
关系型数据库 MySQL 数据库
Docker实现MySQL主从复制
Docker实现MySQL主从复制
219 0
|
XML SQL Java
mybatis xml文件热加载实现
本文博主给大家带来一篇 mybatis xml 文件热加载的实现教程,自博主从事开发工作使用 Mybatis 以来,如果需要修改 xml 文件的内容,通常都需要重启项目,因为不重启的话,修改是不生效的,Mybatis 仅仅会在项目初始化的时候将 xml 文件加载进内存。
680 1
mybatis xml文件热加载实现
|
缓存 JavaScript CDN
关于vite打包优化,你了解多少
关于vite打包优化,你了解多少
|
JSON 编解码 前端开发
阿里低代码引擎和生态建设实战及思考
阿里低代码引擎和生态建设实战及思考
3874 0
阿里低代码引擎和生态建设实战及思考