用IntersectionObserver实现无限滚动和图片懒加载

之前H5中实现列表滚动到底部加载下一页数据,需要监听滚动事件,获取页面滚动的垂直距离、页面的总高度,处理浏览器兼容,计算是否滚动到底部,做节流等,这一套处理下来非常的麻烦。现如今随着技术的进步,浏览器推出了多种 观察器 ,让我们可以更便捷、高效的收集页面与元素的信息。比如 监听元素与视窗交叉状态 的观察器:IntersectionObserver(交叉观察器) 就可以实现无限滚动和图片懒加载。

在MDN文档上可以看IntersectionObserver的详细介绍Intersection Observer API

实现无限滚动

实现一个无限滚动的步骤如下:

  • 创建 IntersectionObserver 实例,并指定观察的目标元素,通常是页面底部的加载中占位符元素
  • 在回调函数中,判断目标元素是否进入视窗。
  • 若目标元素进入视窗,触发数据加载的操作,并更新页面内容。
js 复制代码
// 回调
// entries为一个 IntersectionObserverEntry 对象的数组,
// 每个被触发的阈值,都或多或少与指定阈值有偏差。
const cb = (entries) => {
    entries.forEach((entry) => {
        // isIntersecting是一个Boolean值,判断目标元素当前是否可见,
        // 返回一个布尔值,下列两种操作均会触发callback:
        // 1. 如果目标元素出现在可视区,返回true。
        // 2. 如果从可视区消失,返回false
        if (entry.isIntersecting) {
          getList({ page, pageSize ... }) // 触发数据加载操作
        }
    })
}

// 创建观察实例
const observer = new IntersectionObserver(cb)

// 获取占位符元素
const loading = document.querySelector('.loading')
// 观察加载中占位符元素
observer.observe(loading)

IntersectionObserver 实现无限滚动,可以平滑的加载体验,避免频繁的触发滚动事件,只在需要底部的加载中占位符元素出现时才进行相应列表请求,减少了无效的请求消耗。

实现懒加载

思路是在不可视区域内的图片资源延迟加载,在元素进入视窗时进行加载。

js 复制代码
const imgs = [...document.querySelectorAll('img')]

const cb = (entries) => {
    entries.forEach(item => {
        // isIntersecting是一个Boolean值,判断目标元素当前是否可见
        if (item.isIntersecting) {
            item.target.src = item.target.dataset.src
            // 图片加载后即停止监听该元素
            observer.unobserve(item.target)
        }
    })
}
const options = {
    root: document.querySelector('.root'),
    threshold: 0
}

const observer = new IntersectionObserver(cb, options)

// observe遍历监听所有img节点
imgs.forEach(img => observer.observe(img))

仅作记录项目经历,参考文章地址:

用IntersectionObserver实现无限滚动和图片懒加载

相关推荐
摸鱼的春哥19 分钟前
Agent教程15:认识LangChain(中),状态机思维
前端·javascript·后端
明月_清风24 分钟前
告别遮挡:用 scroll-padding 实现优雅的锚点跳转
前端·javascript
明月_清风27 分钟前
原生 JS 侧边栏缩放:从 DOM 监听到底层优化
前端·javascript
炫饭第一名14 小时前
速通Canvas指北🦮——基础入门篇
前端·javascript·程序员
进击的尘埃16 小时前
Vue3 响应式原理:从 Proxy 到依赖收集,手撸一个迷你 reactivity
javascript
willow16 小时前
JavaScript数据类型整理1
javascript
LeeYaMaster16 小时前
20个例子掌握RxJS——第十一章实现 WebSocket 消息节流
javascript·angular.js
UIUV17 小时前
RAG技术学习笔记(含实操解析)
javascript·langchain·llm
颜酱18 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
FansUnion19 小时前
我如何用 Next.js + Supabase + Cloudflare R2 搭建壁纸销售平台——月成本接近 $0
javascript