一文详解前端进阶之IntersectionObserver

一文详解前端进阶之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日

相关文章

  • Vue动画事件详解及过渡动画实例

    Vue动画事件详解及过渡动画实例 一、引言 Vue.js 是一个流行的JavaScript框架,该框架不仅可以创建单页面应用程序(SPA),还可以帮助Web开发人员快速创建动画效果。本篇文章将介绍Vue.js的动画事件以及过渡动画的实现方法,并提供了两个完整的过渡动画示例。 二、Vue.js的动画事件 在Vue.js中,可以使用以下动画事件来创建动画效果: …

    css 2023年6月10日
    00
  • 探索webpack模块及webpack3新特性

    探索webpack模块及webpack3新特性 Webpack 是什么? Webpack 是一个前端工具,用于打包(package) JavaScript 模块文件。 Webpack 有以下优点: 可以处理模块化代码和包含其他文件类型的文件 可以将代码按照优化级别分离打包,使应用加载更快 可以添加各种插件,增强功能 可以使用 webpack-dev-serv…

    css 2023年6月9日
    00
  • 用CSS背景属性代替图片SRC

    使用CSS背景属性代替图片SRC是一个优化网页性能的方案,它可以减少图片的请求次数,提高页面的加载速度。下面是使用CSS背景属性代替图片SRC的完整攻略: 1. 首先选择需要代替的图片 在网站开发中,我们通常需要使用一些图片为网站增加美观度和表现力。我们可以根据实际需求选择需要代替的图片,比如导航栏背景、轮播图、按钮背景等。 2. 将图片转换为base64编…

    css 2023年6月9日
    00
  • CSS3之transition实现下划线的示例代码

    下面我将为您提供关于“CSS3之transition实现下划线的示例代码”的完整攻略: 一、transition基本概念 在学习transition之前,先简述一下transition的基本概念:transition是CSS的一个属性,用于指定一个元素在属性变化时的“过渡”。例如,当一个元素的宽度从200px变为300px时,通过transition将会过渡…

    css 2023年6月9日
    00
  • javascript基本数据类型和转换

    JavaScript基本数据类型和转换 JavaScript是一种弱类型语言,数据类型是JavaScript编程中非常重要的一个概念。在JavaScript中,有基本数据类型和复杂数据类型。接下来将会详细地讲解基本数据类型和它们之间的转换。 基本数据类型 JavaScript中有6种基本数据类型:字符串(string)、数值(number)、布尔值(bool…

    css 2023年6月9日
    00
  • 办公中常用的Word及Excel小方法全集 小秘诀112招全介绍

    简介 本篇攻略将会介绍112个办公中常用的Word和Excel小方法,涵盖了平时工作中会用到的绝大部分技巧和技巧。此攻略将会按照类型分别介绍如下: Word 格式调整类 快捷键类 排版类 参考文献类 省时技巧类 Excel 常用操作类 快捷键类 省事技巧类 接下来将会一一介绍各种小技巧。 Word 1. 格式调整类 1.1 快速调整行距 在Word中当你想要…

    css 2023年6月9日
    00
  • CSS网页布局时常犯的几种小错误小结

    针对“CSS网页布局时常犯的几种小错误小结”,以下是完整攻略: 标题 什么是CSS网页布局? Web布局是构建Web页面的过程,它涉及到将HTML元素放置在页面上,并确定它们的大小、位置和排列方式等。 CSS是样式表语言,它被用来描述Web页面的布局和外观。在设计网页布局时要使用正确的CSS属性,并避免常见的错误。 常见的CSS网页布局错误 1. 不正确地使…

    css 2023年6月10日
    00
  • li样式不显示使用overflow:hidden导致Li前面点、圈等样式不见

    这个问题通常出现在给<ul>或者<ol>元素设置了一个宽度,然后想在其中的<li>元素中显示特定的样式,但是发现点、圈等样式不显示出来,只显示了一个空白。 其中原因是,当<li>元素的宽度超出了<ul>或<ol>元素的宽度时,<li>元素会溢出,而溢出的部分不会显示任何样式,…

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