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);
相关文章
|
6月前
|
前端开发 JavaScript Java
B/S方向
B/S方向
42 4
|
前端开发 网络安全
未来方向发展–极区
未来方向发展–极区
77 1
|
机器学习/深度学习 人工智能 自然语言处理
或许是一个新的算法方向?
或许是一个新的算法方向?
90 0
3. 模型的方向问题
3. 模型的方向问题
105 0
|
SQL 分布式计算 资源调度
未来发展方向|学习笔记
快速学习未来发展方向
|
安全 定位技术 双11
2011,它改变了潮水的方向
本文8600多字,是今年笔记写作的开始,这篇勉强算是“文”,目前来看更像是素材杂乱无章的堆砌,接下来,邀请您一起来完善它,留言区吐槽或建议、提供素材,也可以邮件我jiaxinwen360@163.com 。9月会有2012年,10月是2013年…我希望用半年多的时间先把过去几年互联网发生的故事做个梳理。 借用雷军的一句话,协迫自己再重新写起来: “每段历史都有可能被遗忘,因为大家有太多新的东西要关注了”——雷军
199 0
|
SQL 存储 人工智能
扎心!天天写代码,方向真的对吗?
每个人的时间都是有限的,在有限的时间里选择一项值得投入的技术会变得尤为重要。
扎心!天天写代码,方向真的对吗?
|
Spring
提升性能的方向
提升性能的时间方法,空间方法,本质方法。
1180 0