Intersection Observer API(交叉观察器)实现触底加载

前端如何用观察者设计模式实现页面滚动到底部请求下一页数据 阅读详情

1.Intersection Observer API简介

提供了一种异步检测目标元素与祖先元素或视口(可统称为根元素)相交情况变化的方法。简单来讲就是用来判断目标元素是否出现在视口中,然后进行一些特殊处理。
常见使用场景:图片懒加载,列表触底加载,内容无限滚动,目标元素进入视口进行动画播放等。

2.为什么要使用该API

因为在如今网页开发的过程中,常常需要判断某个元素是否进入了"视口"(viewport),即用户能不能看到它。面对这种相交检测的任务时,过去我们通常会使getBoundingClientRect()等方法来获取相关元素的位置信息,并且还会用到事件监听。
然而事件监听和调用getBoundingClientRect()等 API 都是运行在主线程,因此频繁触发、调用会造成性能问题,而且这种检测方法使用起来比较繁琐。
因此官方就提出了Intersection Observer API,由于方法是异步的,不影响主线程的执行效率。

3.使用方法

1.实例化对象

var observer = new IntersectionObserver(callback, options);
callback:检测目标元素的回调函数
options:根元素配置项
该函数的返回值: 一个新的IntersectionObserver对像。

2.开始检测目标元素

let target = document.querySelector(“#target”); //目标元素
observer.observe(target); //开始监听该目标元素

4.触底加载示例

<template>
  <div class="container" id="container">
    <div class="item" v-for="(item, index) in dataSource" :key="index">{{ index }}-{{ item }}</div>
    <div id="footer">底部</div>
  </div>
</template>

<script setup lang="ts">
  import { onMounted, ref } from 'vue'
  // 初始值
  const dataSource = ref([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
  // 根元素配置项
  let options = {
    root: document.querySelector('#container'), //根元素
    rootMargin: '0px', //传值形式类似于css的margin 传一个值则四个边都为0
    threshold: 0 //触发条件 表示目标元素刚进入根元素时触发
  }
  //io 为 IntersectionObserver对象 - 由IntersectionObserver()构造器创建
  const initial = () => {
    var io = new IntersectionObserver(entries => {
      //entries 为 IntersectionObserverEntry对像数组
      entries.forEach(item => {
        //item 为 IntersectionObserverEntry对像
        // isIntersecting是一个Boolean值,判断目标元素当前是否可见
        if (item.isIntersecting) {
          //目标元素 可见时 进行相关操作
          console.log((item.target as any).innerText, '可见', '加载数据')
          setTimeout(() => {
            getData()
          }, 1000)
          // io.unobserve(item.target) //停止监听该div DOM节点
        } else {
          // 目标元素不可见时进行相关操作
          console.log((item.target as any).innerText, '不可见')
        }
      })
    }, options) //不传options参数就会默认根元素为浏览器视口
    const footer = document.querySelector('#footer') as Element
    io.observe(footer) // 监听 DOM节点
  }
  const getData = () => {
    // 加载数据:真实场景下为接口请求数据
    dataSource.value = [...dataSource.value, ...dataSource.value] as any
  }
  onMounted(async () => {
    initial()
  })
</script>

<style scoped>
  .read-the-docs {
    color: #888;
  }
  * {
    margin: 0;
    padding: 0;
  }
  .container {
    width: 500px;
    height: 400px;
    border: 1px solid #e5e5e5;
    overflow: auto;
  }
  .container > div {
    margin: 5px auto;
    width: 100px;
    height: 100px;
    outline: 1px solid red;
  }
</style>

5.参考文章

MDN Intersection Observer API
大白话详解Intersection Observer API
详解 Intersection Observer API ( 交叉观察器 )

三个项目: 项目1:利用IntersectionObserver实现懒加载图片 项目2:瀑布流布局的上拉刷新加载图片功能 项目1:利用IntersectionObserver实现懒加载图片 项目2:瀑布流布局的上拉刷新加载图片功能(含loading) 项目3:利用IntersectionObserver实现视频在当前视口显示不完全时停止播放视频的功能 立即下载

相关推荐

自适应IIR格型滤波器的Matlab实现

概述 在现有的众多抑制窄带干扰的信号处理手段中,时域自适应陷波干扰抑制技术具有实现简单、抗干扰性能好等优点。IIR陷波器按照结构可以分为直接型和格型两种。相比自适应直接型IIR陷波器,自适应格型IIR陷波器不仅可以准确地控制滤波器的陷波频率,也可以准确地调整陷波器的带宽。 传递函数 二阶自适应IIR格型陷波器的传递函数H(z)为: 其中α与陷波带宽有关,β与陷波频率有关;对应的结构如下图所示: Matlab算法实现 ...

剑藏锋的博客 2803

使用 IntersectionObserver 实现触底加载元素的功能

Intersection Observer 是一种用于异步监测目标元素与其祖先元素或视窗之间交叉状态的API。它提供了一种高效的方式来检测元素是否可见或与视窗发生交叉,并在发生交叉时触发回调函数。借助 Intersection Observer,我们可以轻松实现一些常见的功能,如懒加载图片、无限滚动加载和元素可见性检测等。Intersection Observer 是一个强大的API,它提供了一种高效和精确的方式来监测元素与视窗之间的交叉状态。

常备不懈 1250

【软碟通 | UltraISO】刻录光盘教程(制作U盘启动盘)

前言 今天老师说办公室的电脑有点卡,让我给重新安装一个 Windows 7 系统。于是就用软碟通(UltraISO)在 U 盘上刻录了一个 Windows 7 镜像,然后给老师重装了系统。顺便把制作 U 盘启动盘的教程也分享给大家。 软件 UltraISO v9.7.1.3519:点击跳转(密码:dd2k) 教程 将 U 盘插到电脑上,然后鼠标右击选择格式化(制作启动盘必须格式化) 点击文件-打开 选择下载好的系统镜像(如:Windows 7) 点击启动-写入硬盘映像 选择硬盘

XavierJ的博客 2万+

IntersectionObserver的使用

是一个现代浏览器提供的 API,用于监听元素与其祖先元素或顶层文档视窗(viewport)交叉的情况,即元素是否进入或离开视窗。它通常用于实现懒加载图片、监听滚动事件、触发动画效果等场景,可以显著提高性能和用户体验。

老电影故事的博客 1562

Llama模型结构拆解:为什么MLP模块要这样设计?从参数配置到计算流程全解析

本文深入解析了Llama模型MLP模块的设计精髓。通过拆解其三线性层结构、门控机制与SwiGLU激活函数,揭示了并行计算如何提升效率,并详细阐述了intermediate_size参数配置背后的经验权衡与计算考量,帮助读者透彻理解这一核心组件的设计逻辑与工程实现。

mac99的博客 529

杰理AC695N芯片跑iic接口的oled驱动分享

本文介绍了一个基于IIC接口的0.96寸OLED显示屏驱动程序,适用于SSD1306控制器。驱动采用软件模拟IIC方式,支持字符、数字、字符串、汉字和图片显示,测试平台为杰理AC695N系列芯片。硬件参数包括128×64分辨率,IIC接口(地址0x78),使用IO_PORTA_02(SDA)和IO_PORTA_03(SCL)引脚。驱动包含OLED主文件(oled.c/h)、软件IIC实现(soft_iic.c/h)和字体/图片数据文件(oledfont.h/bmp.h),可通过修改soft_iic.h中的引

qq_42014563的博客 883

Intersection Observer

例如,可以懒加载图片,在滚动时加载更多内容,触发动画效果,跟踪广告显示和隐藏等等。Intersection Observer(可见性观察器)是一个现代的浏览器API,用于异步地观察一个元素是否进入或退出另一个元素(或视口)的可见区域。使用Intersection Observer可以很方便地实现元素的懒加载、无限滚动、滚动动画等功能,而无需繁琐的事件监听和计算逻辑。同时,Intersection Observer还可以在性能方面提供优势,因为它通过异步执行回调来处理观察到的变化,而不会阻塞主线程。

weixin_62992614的博客 464

【Unity的HDRP渲染管线下用Steam VR串流结合使用遇到的各种问题_SteamVR 插件和Pico串流助手】

当你启用"Mock Runtime"选项后,Unity将模拟一个虚拟的OpenXR运行时环境,并提供一些虚拟的设备和功能,让你能够进行开发和调试。在Unity中,SteamVR插件是一个由Valve提供的Unity插件,它允许开发者在Unity项目中集成SteamVR功能,以便支持SteamVR设备。OpenXR是一个跨平台的虚拟和增强现实(VR/AR)开发接口,它为开发者提供了一个统一的接口,用于访问不同VR/AR硬件设备和平台的功能。这个选项是用于模拟OpenXR运行时环境的功能。

暴走约伯的博客 2800

使用 js 原生 API IntersectionObserver实现内容触底加载

使用IntersectionObserver,在react hook 框架下实现下拉列表的无限滚动加载。

landiyaaa的博客 879

基于深度学习的AI生成式人脸图像鉴别

AIGC(AI内容生成)技术的快速发展确实为创作者提供了高效生产力工具,但同时也引发了一些问题和挑战。这些技术可以生成以假乱真的图像、视频换脸等,给不法分子提供了滥用的机会。其中,一些不法分子可能利用AIGC技术制造虚假新闻、违反版权、绕过活体身份验证、散布谣言和诽谤他人、进行敲诈勒索等非法活动,以谋取不当利益。这些行为给社会造成了严重的负面影响,破坏了信息的真实性和可信度。因此,我们需要认识到AIGC技术的潜在风险,并采取相应的措施来应对。

mingo_敏 4498

fanuc机器人I/O分配

FANUC机器人在和其他外部设备进行通讯时,需要对信号进行配置。 在机器人处于UOP自动分配状态时,系统会自动检索已配对设备,并分配相应的机架号。 当我们需要手动对信号进行分配时,可参考以下机架号进行配置。 不同的通讯协议对应的机架号不同,外部通讯协议常用的机架号参考下表: 序号 机架号 通讯类型 1 0 Process I/O 2 1-15

haier123888的博客 1万+

IntersectionObserver监听器、ajax获取数据、解构赋值

没有的结构解构出来是undefined,但是可以通过等号赋值默认值。

lawfy的博客 264

极智嘉嵌入式面试题及参考答案

IIC(Inter-Integrated Circuit)即集成电路总线,是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它仅使用两根线,即串行数据线 SDA 和串行时钟线 SCL,就能实现多个设备之间的通信,具有简单、高效、占用资源少等优点,广泛应用于各种嵌入式系统中。

大模型大数据攻城狮的专栏 922

图片懒加载之React + Intersection Observer API - 交叉观察器实现懒加载

判断元素是否进入视口从而来实现懒加载,因为用到了scroll的监听事件,因此频繁触发、调用可能会造成性能问题。创建一个IntersectionObserver.observe对象,当其监听到目标元素的可见部分(的比例)超过了一个或多个阈值(threshold)时,会执行指定的回调函数。被创建,则无法更改其配置,所以一个给定的观察者对象只能用来监听可见区域的特定变化值;,因为判断元素是否可见的本质就是看目标元素是否与根元素或视口产生了交叉。对象被创建时,其被配置为监听根中一段给定比例的可见区域。

2202_75616310的博客 1819

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

‌Intersection Observer

‌‌ 是一种用于‌。

m0_51429350的博客 635

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JS | 图片懒加载之交叉观察器IntersectionObserver API 手把手教学

IntersectionObserver是一种浏览器提供的API,用于监测元素与其祖先元素或视窗的交叉状态。‌ 它通过异步观察目标元素是否可见,来判断目标元素与视窗或其祖先元素的交叉比例,因此也被称为“交叉观察器”。IntersectionObserver的核心功能是判断元素是否进入、离开或部分可见于视窗,这通常用于实现如懒加载、无限滚动等功能‌

青春木鱼的博客 1957

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

详解 Intersection Observer API ( 交叉观察器 )

提供了一种方法可以监听目标元素是否展示到视口(viewport)图片懒加载滚动动画…上述的需求,以往一般监听scroll事件,利用方法获取目标元素的位置信息。由于监听scroll事件,不断地触发回流,对性能有一定的影响,不过可以通过函数节流解决,但是方法对性能造成的影响无法有效优化的。!!!所以,浏览器为了解决上述难题,推出了,由于方法是异步的,不影响主线程的执行效率。

一只路过的小码农 4206

【今天你更博学了么】一个神奇的交叉观察 API Intersection Observer

前言 前端开发肯定离不开判断一个元素是否能被用户看见,然后再基于此进行一些交互。 过去,要检测一个元素是否可见或者两个元素是否相交并不容易,很多解决办法不可靠或性能很差。然而,随着互联网的发展,这种需求却与日俱增,比如,下面这些情况都需要用到相交检测: 图片懒加载——当图片滚动到可见时才进行加载 内容无限滚动——也就是用户滚动到接近内容底部时直接加载更多,而无需用户操作翻页,给用户一种网页可以无限滚动的错觉 检测广告的曝光情况——为了计算广告收益,需要知道广告元素的曝光情况 在用户看见某个区域时执行任务

m0_48721669的博客 1002

Vue 元素动画缓入效果

Vue 元素动画缓入效果。

qq_41429765的博客 891

IntersectionObserver API实现场景

1. 图片懒加载——当图片滚动到可见时才进行加载 2. 内容无限滚动——也就是用户滚动到接近内容底部时直接加载更多,而无需用户操作翻页,给用户一种网页可以无限滚动的错觉 3. 检测广告的曝光情况——为了计算广告收益,需要知道广告元素的曝光情况 4. 在用户看见某个区域时执行任务或播放动画.....................

喜欢做一些demo,和分享遇到的 BUG 645

vueUse工具库之useIntersectionObserver和useScroll的底层实现原理

图片懒加载原理、scrollTop、offsetTop、clientTop、abc、a、b、getBoundingClientRect、intersectionObserver

weixin_51431277的博客 835

Intersection 节点出现在视口内

` var io = new IntersectionObserver(callback, option); 上面代码中,IntersectionObserver是浏览器原生提供的构造函数,接受两个参数:callback是可见性变化时的回调函数,option是配置对象(该参数可选)。 // 开始观察 io.observe(document.getElementById(‘example’)); // 停止观察 io.unobserve(element); // 关闭观察器 io.disconnect();

weixin_38222276的博客 400

Vue 组件,页面向下滚动元素在视口下方时的动画效果

【代码】 Vue 组件,页面向下滚动元素在视口下方时的动画效果。

m0_47626239的博客 839

IntersectionObserver API实现虚拟列表滚动

前言。

csdn_poxiao的博客 646

vue2通过scrollIntoView实现页面滚动过渡动画

页面div 绑定 @scroll="scrollEvent" 方法,

Yourlittlecutie的博客 1282

懒加载之intersection observer

聊聊intersection observer 二话不说先上链接 先说说为什么最近在看这个 最近在做性能优化。每一个工程师代码量积累到一定程度之后总有一天会遇到这个问题,那就是性能问题。而我在写了快一年半的前端之后,也自然而然遇到了性能问题。其实性能问题之前就有遇到,只不过当时工程量比较小,觉得应该要等到成熟一点再考虑这个事情(事实证明这个思路是正确的)。而性能优化真的是个大话题,关于性能优化其实我有非常多的心得,虽然现在还是处于摸索阶段。 针对业务场景自然而然想到去用intersection observ

procstu的博客 546
上一篇: vue响应式原理
下一篇: Webpack构建流程
大兵的猫
博客等级 码龄7年 364粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大兵的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值