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);
相关文章
|
Linux 数据库 数据安全/隐私保护
如何使用 Docker 安装宝塔面板
Docker 是一个高效、灵活、轻量级的容器化平台,可以在单个操作系统上实现多个容器化应用的隔离和运行。而宝塔面板是一款集成了 Web 服务器、数据库和运行环境的 Linux 服务器管理面板,其功能非常强大且易于使用。在本文中,我们将介绍使用 Docker 安装宝塔面板的优势和详细命令,让您轻松搭建自己的 Web 服务。
9797 3
|
JSON 算法 fastjson
com.alibaba.fastjson转换JSONObject数据后顺序与原JSON字符串顺序不一致原因分析
Json字符串转JSONObject对象保证属性及其内部JSONObject有序(本身顺序而非需要指定排序)
4526 1
|
安全 NoSQL Java
SpringBoot接口安全:限流、重放攻击、签名机制分析
本文介绍如何在Spring Boot中实现API安全机制,涵盖签名验证、防重放攻击和限流三大核心。通过自定义注解与拦截器,结合Redis,构建轻量级、可扩展的安全防护方案,适用于B2B接口与系统集成。
1419 3
|
人工智能 编解码 搜索推荐
16个AI Logo 设计工具大盘点:技术解析、Logo格式对比与实用推荐
本文介绍了品牌标志(Logo)的重要性,并盘点了多款免费且好用的 Logo 生成工具,分析其输出尺寸、格式及适用场景,帮助无设计基础的用户选择合适工具,高效制作满足不同用途的 Logo。
1409 0
|
开发框架 前端开发 JavaScript
网页CAD中二维CAD图转三维CAD的方法
本文介绍了一种将网页CAD中的二维图纸转换成三维模型的方法,特别聚焦于通过拉伸平面图形至一定高度来实现三维效果。文中利用了mxcad和mxcad3d两个框架,前者负责读取和解析二维CAD图纸,后者则基于这些数据构建三维模型。文章详细阐述了安装配置步骤及代码实现细节,包括创建项目、安装依赖、编写HTML与JavaScript代码等,并提供了完整的示例代码。最终实现了从二维图纸自动转换并展示三维模型的功能,同时添加了交互元素以方便用户操作。
网页CAD中二维CAD图转三维CAD的方法
|
JSON Java fastjson
简单实现_实体类与Json字符串互相转换
简单实现_实体类与Json字符串互相转换
756 1
|
设计模式 Java Spring
Spring Boot使用责任链模式优化业务逻辑中的if-else代码
在开发过程中,我们经常会遇到需要根据不同的条件执行不同的逻辑的情况。传统的做法是使用if-else语句来进行条件判断,但是随着业务逻辑的复杂化,if-else语句会变得越来越臃肿,难以维护和扩展。这时候,我们可以考虑使用责任链模式来优化代码结构,使得代码更加清晰、可扩展和易于维护。
|
XML 监控 前端开发
Spring Boot中的WebFlux编程模型
Spring WebFlux 是 Spring Framework 5 引入的响应式编程模型,基于 Reactor 框架,支持非阻塞异步编程,适用于高并发和 I/O 密集型应用。本文介绍 WebFlux 的原理、优势及在 Spring Boot 中的应用,包括添加依赖、编写响应式控制器和服务层实现。WebFlux 提供高性能、快速响应和资源节省等优点,适合现代 Web 应用开发。
1815 15
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
1724 4
SpringBoot必须掌握的常用注解!
|
JSON NoSQL Redis
Redis Stack是什么,你知道吗?
Redis Stack 是 Redis 官方推出的一款新产品,扩展了 Redis OSS 的核心功能,提供完整的开发人员体验。它支持概率数据结构、可查询的 JSON 文档、跨哈希和 JSON 文档查询、时间序列数据处理等高级功能。Redis Stack 包含 Redis Stack Server、RedisInsight 和客户端 SDK,适用于构建实时应用程序。安装方式包括直接安装和 Docker 安装,使用方法与 Redis 类似,支持 JSON、Bloom Filter 等数据类型及操作命令。
2833 1

热门文章

最新文章