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

相关文章

  • 拖动table标题实现改变td的大小(css+js代码)

    实现拖动表格标题来改变表格单元格的大小需要使用HTML、CSS和JavaScript进行组合实现。 HTML代码 首先,我们需要使用HTML创建一个表格,每个单元格都包含一个div元素,用于拖动边界。 <table> <thead> <tr> <th><div class="resize&quo…

    css 2023年6月10日
    00
  • CSS3下的渐变文字效果实现示例

    下面是“CSS3下的渐变文字效果实现示例”的完整攻略: 一、渐变文字效果实现的基本原理 CSS3提供了linear-gradient()和radial-gradient()两个函数,可以让我们轻松地实现渐变效果。这两个函数的基本语法如下: linear-gradient(direction, color-stop1, color-stop2, …); r…

    css 2023年6月11日
    00
  • 用纯CSS实现手风琴效果的示例代码

    请注意以下内容: 纯CSS实现手风琴效果的攻略 手风琴效果可以看做是一个菜单或导航栏中的一种常见效果,它呈现的是当前打开条目的详细内容,而其他项则收缩,常常用于展示较为复杂的内容。 使用纯CSS实现手风琴效果一般需要结合以下几个步骤: 1. HTML代码结构 实现手风琴效果需要菜单项和内容项结合起来,HTML的基本结构如下: <div class=&q…

    css 2023年6月9日
    00
  • vue 项目打包时样式及背景图片路径找不到的解决方式

    当使用vue-cli等脚手架搭建的Vue项目进行打包后,会出现样式文件或者背景图片无法正确加载的情况,这是因为在打包过程中,打包工具不会将样式文件和图片等静态资源的相对路径修改为绝对路径,而导致找不到文件的错误。该问题可以通过以下两种方式解决: 方法一:使用publicPath publicPath是webpack中用来设置资源路径的一个选项,通过设置公共路…

    css 2023年6月9日
    00
  • css 固定表头 拖动滚动条时对应表头所对应的列 ie6测试通过

    要实现CSS固定表头并支持拖动滚动条时,对应表头所对应的列可以通过一些技巧实现,以下是攻略: 一、HTML结构 首先要构建具有类似表格结构的HTML代码,其中包含固定的表头和可滚动的内容区域。可以采用如下结构实现: <div class="table-container"> <table> <thead&gt…

    css 2023年6月10日
    00
  • Fastadmin中JS的调用方法原理讲解

    针对Fastadmin中JS的调用方法的原理讲解,下面是一个完整的攻略,希望能对您有所帮助。 1. JS调用方法的原理简介 JS调用方法是指在静态页面中引入JS文件后,使用JS代码调用函数以实现交互效果和动态效果。而在Fastadmin中进行JS的调用,则需要遵循以下原则: 在Fastadmin中,JS文件的路径一般位于/public/static/js/目…

    css 2023年6月10日
    00
  • cf荣耀6年惊天大礼活动网址_cf荣耀6年惊天大礼有哪些福利

    CF荣耀6年惊天大礼活动 活动网址 活动网址为 https://cf.qq.com/webplat/info/news_version3/8049/28746/28747/28751/m22053/202105/929874.shtml 活动时间 2021年5月26日至2021年7月7日 活动内容 登录礼包:每日登录游戏,即可领取丰厚奖励 新人大礼包:新注册…

    css 2023年6月10日
    00
  • 解决margin 外边距合并问题

    解决margin外边距合并问题的方法有以下几种: 1. 使用padding 可以将容器的外边距改为内边距,这样避免了外边距的合并问题。例如: <div class="container"> <div class="box"></div> </div> <style&…

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