当前位置: 首页 > news >正文

IntersectionObserver接口介绍

IntersectionObserver API 是浏览器提供的一个用于异步观察目标元素其祖先元素或视口(Viewport)交叉状态(即是否进入或离开视口)的接口。在 IntersectionObserver 出现之前,开发者通常需要通过监听 scroll 事件或使用 getBoundingClientRect 方法来判断元素是否进入视口。

IntersectionObserver 的基本用法

(1) 创建观察器

通过 new IntersectionObserver() 创建一个观察器实例。

const observer = new IntersectionObserver(callback, options);
  • callback
    当目标元素的交叉状态发生变化时触发的回调函数。

  • options
    配置对象,用于指定观察器的行为(可选)。

(2) 观察目标元素

通过 observer.observe() 开始观察目标元素。

const target = document.querySelector('.target');
observer.observe(target);

(3) 停止观察

通过 observer.unobserve() 停止观察目标元素。

observer.unobserve(target);

IntersectionObserver 的回调函数

回调函数会在以下情况下触发:

  1. 目标元素进入或离开视口。

  2. 目标元素的交叉比例(intersection ratio)发生变化。

回调函数接收两个参数:

  • entries:一个 IntersectionObserverEntry 对象的数组,每个对象描述了一个目标元素的交叉状态

  • observer:观察器实例本身。

IntersectionObserverEntry 对象的属性

IntersectionObserver 的配置选项

options 是一个可选对象,可以包含以下属性:

const options = {
  root: null, // 视口
  rootMargin: '0px', // 无边距
  threshold: [0, 0.5, 1], // 交叉比例为 0%、50%、100% 时触发回调
};

const observer = new IntersectionObserver(callback, options);

 使用场景

(1) 图片懒加载

当图片进入视口时,动态加载图片。

const images = document.querySelectorAll('img[data-src]');

const observer = new IntersectionObserver((entries) => {
  entries.forEach((entry) => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src; // 加载图片
      observer.unobserve(img); // 停止观察
    }
  });
});

images.forEach((img) => observer.observe(img));
(2) 无限滚动

当用户滚动到页面底部时,加载更多内容。

const sentinel = document.querySelector('#sentinel');

const observer = new IntersectionObserver((entries) => {
  if (entries[0].isIntersecting) {
    loadMoreContent(); // 加载更多内容
  }
});

observer.observe(sentinel);
(3) 广告曝光统计

当广告进入视口时,记录曝光次数。

const ad = document.querySelector('.ad');

const observer = new IntersectionObserver((entries) => {
  if (entries[0].isIntersecting) {
    logAdImpression(); // 记录广告曝光
    observer.unobserve(ad); // 停止观察
  }
});

observer.observe(ad);

相关文章:

  • 2025年2月平价旗舰手机性能对比
  • 大白话html第十三章HTML学习全文总结
  • 进程间通信(下)
  • Spring Boot 3 整合 MinIO 实现分布式文件存储
  • 算法 背包问题
  • 系统思考—组织诊断
  • Java EE 进阶:Spring MVC(2)
  • postgrel
  • Java学习--MySQL
  • leetcode日记(85)验证二叉搜索树
  • STM32 I2C驱动开发全解析:从理论到实战 | 零基础入门STM32第五十步
  • 蓝桥杯历年真题题解
  • 布朗运动(Brownian Motion):随机世界的舞者
  • C语言学习笔记-进阶(7)字符串函数3
  • 二分查找寻找旋转排序数组最小值边界条件处理
  • 【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 过滤器:实现请求的预处理与后处理
  • 【GPT入门】第8课 大语言模型的自洽性
  • Mybatis Generator 使用手册
  • YCL4级python青少年人工智能水平测试复习资料
  • Java实现Consul/Nacos根据GPU型号、显存余量执行负载均衡
  • 网站建设审批程序/怎么把自己的产品推广出去
  • 网站建设创业计划书模板范文/何鹏seo
  • 做网站用空间好还是服务器好/网站排名优化外包公司
  • 搜索引擎搜索/黄冈网站推广优化找哪家
  • 网站建设基本流程视频/河南优化网站
  • 网站后台登陆路径/品牌公关公司