一文详解前端进阶之IntersectionObserver

yizhihongxing

一文详解前端进阶之IntersectionObserver

前言

在前端开发中,我们经常需要对一些元素的可见性进行监听,并在元素出现或消失时做出相应的处理。传统的方法通常是通过监听页面滚动事件来判断元素是否进入或离开视口,这种方式存在一些问题,例如需要频繁的计算和检测,这会影响性能和用户体验。

为了解决这些问题,W3C推出了IntersectionObserver API。本文将详细讲解IntersectionObserver的使用方法以及一些注意点。

IntersectionObserver API

IntersectionObserver 是 W3C 官方推出的一个基于观察者设计模式的 API。它可以用来异步地观察目标元素与其父级或根元素在交叉的程度,从而判断目标元素的可见性。

创建 IntersectionObserver 实例

我们可以通过创建 IntersectionObserver 实例来监听目标元素的变化。创建实例时需传入一个函数作为回调函数,在目标元素进入或离开视图窗口时会被调用,调用时会传回一个参数 entries,它是一个数组,包含了被观察元素的相关信息,所以我们可以在回调函数中取出 entries 数组中的第一个元素来获取当前的观察目标的信息。

其基本格式为:

const observer = new IntersectionObserver(entries => {
  // 当被监听元素进入或离开视图窗口时,回调函数会被调用
  const entry = entries[0];
  if (entry.intersectionRatio > 0) {
    // 目标元素进入视图窗口
  } else {
    // 目标元素离开视图窗口
  }
});

监听目标元素

在创建 Observer 实例后,我们需要通过调用 observe 方法来指定要监听的目标元素。当指定的元素变化时,Observer 的回调函数会被立即触发。

observer.observe(document.querySelector('#target'));

停止监听

如果要停止监听目标元素,可以调用 disconnect 方法:

observer.disconnect();

IntersectionObserver 的应用场景

图片懒加载

图片懒加载是 IntersectionObserver 的一个经典应用场景。我们可以使用 IntersectionObserver 来判断图片是否进入视图窗口,当图片进入窗口时再加载图片资源。

<img src="placeholder.jpg" data-src="image.jpg" class="lazyload" alt="image">
// 预加载的图片都用 lazyload 类标记
const images = document.querySelectorAll('.lazyload');
const observer = new IntersectionObserver(entries => {
  entries.forEach(entry => {
    // 如果图片进入视口,则将 data-src 中的图片路径赋值给 src
    if (entry.isIntersecting) {
      const image = entry.target;
      const src = image.dataset.src;
      image.src = src;
      observer.unobserve(image); // 停止监听已加载的图片
    }
  });
});
images.forEach(image => {
  observer.observe(image);
});

无限滚动

无限滚动也是 IntersectionObserver 的一个应用场景。当用户向下滚动时,我们可以根据 scrollTop 或页面开头和结尾的距离计算出当前展示的可视区域,当这个区域内的内容快要滚出视图时,即将滚动到区域底部时,再请求展示新的内容。

/* 用于撑起页面高度的占位元素 */
.infinite-scroll-loading {
    height: 50px;
}
<ul id="list">
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  ...
  <li class="infinite-scroll-loading"></li>
</ul>
const list = document.querySelector('#list');
const loading = list.querySelector('.infinite-scroll-loading');
const observer = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting && !isLoading) {
      // 请求新的数据
      fetchData().then(data => {
        isLoading = false;
        if (data.length === 0) {
          observer.unobserve(loading);
        }
      });
      isLoading = true;
    }
  });
});
observer.observe(loading);

总结

本文详细讲解了 IntersectionObserver 的基本用法及其应用场景。使用 IntersectionObserver 可以有效地提高性能和用户体验,特别是在处理大量的可视元素时更为明显。此外,IntersectionObserver 还有一些高级用法,例如多元素监听、throttle 和 debounce,如果有兴趣可以继续了解。

参考

  • Intersection Observer API: https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API

示例说明

示例一是图片懒加载的应用场景,当图片进入视口时再加载图片资源。示例二是无限滚动的应用场景,当用户滚动页面到底部时再请求展示新的内容。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文详解前端进阶之IntersectionObserver - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 网页设计中的 serif 和 sans-serif字体应用

    当我们进行网页设计时,选择字体是一个非常重要的环节。其中,serif 和 sans-serif 是常用的字体分类。下面是在网页设计中如何使用这两种字体的攻略。 什么是 serif 和 sans-serif 字体 serif 和 sans-serif 是字体的一种分类,是由英文字母的末尾是否有小突起决定的。 serif 字体:末尾有小突起的字体,例如常见的 T…

    css 2023年6月10日
    00
  • 使用webpack5从0到1搭建一个react项目的实现步骤

    下面是使用webpack5从0到1搭建一个react项目的实现步骤: 步骤1:安装依赖 首先需要安装webpack和webpack-cli的最新版本,使用下面的代码: npm install webpack webpack-cli –save-dev 然后需要安装react和react-dom,输入下面的代码: npm install react reac…

    css 2023年6月9日
    00
  • css3中仿放大镜效果的几种方式原理解析

    针对“css3中仿放大镜效果的几种方式原理解析”这个话题,我可以分享一些完整的攻略,帮助你更好地了解。 实现原理 CSS3中实现放大镜效果一般有两种常用方式: 使用transform属性进行缩放:利用transform属性中的scale()函数,将需要放大的区域缩小至原始尺寸的比例,再为放大镜创建一个相同的区域进行放大。放大效果的实现依靠了scale()函数…

    css 2023年6月10日
    00
  • VSCODE怎么安装CSS Peek插件快速查看CSS定义?

    VSCODE怎么安装CSS Peek插件快速查看CSS定义? 在前端开发中,经常需要查看CSS样式定义,但是在大型项目中,CSS文件可能会非常庞大,查找起来非常麻烦。为了提高开发效率,可以使用VSCode的CSS Peek插件来快速查看CSS定义。本攻略将详细讲解VSCODE怎么安装CSS Peek插件快速查看CSS定义,包括插件安装、使用方法和示例说明。 …

    css 2023年5月18日
    00
  • html知识点实践经验总结

    HTML知识点实践经验总结 简介 HTML(英文全名:Hyper Text Markup Language),意为超文本标记语言,是用于创建 Web 页面的编程语言。 在本文中,我将分享我对 HTML 知识点的实践经验,帮助初学者更好地理解 HTML,从而更好地掌握 Web 开发。 基础知识 标签 HTML 中的每个元素都是由标签定义的。标签可用于设置元素的…

    css 2023年6月10日
    00
  • css属性让网页文字实现竖排的几种方法

    下面我来详细讲解一下”CSS属性让网页文字实现竖排的几种方法”的完整攻略。 什么是竖排文字? 竖排文字(Vertical writing)就是将文字竖直排列的一种写作方式,又称为竖排版或纵排版。 实现竖排文字的CSS属性 CSS提供了一些属性来实现竖排文字,下面就来详细介绍一下: writing-mode属性 writing-mode属性控制文本的书写模式。…

    css 2023年6月9日
    00
  • html工作中表格<tbody>标签的使用技巧

    当我们需要在Web页面中展示一些数据时,通常会使用表格(table)进行展示,而<tbody>标签则是定义表格的主体部分。下面是关于<tbody>标签使用技巧的攻略。 1. 什么是<tbody>标签 <tbody>标签用于定义表格的主体部分,通常在<table>标签内部使用。<tbody&gt…

    css 2023年6月10日
    00
  • matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)

    下面是详细讲解“matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)”的完整攻略。 1. 设置颜色 通过修改plot()函数的color参数,可以设置折线的颜色。具体用法如下: import matplotlib.pyplot as plt x = [1, 2, 3, 4, 5] y = [2, 4, 6, 8, 10] plt.plot(x…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部