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

相关文章

  • CSS实现图片等比例缩小不变形的实例代码

    CSS实现图片等比例缩小不变形,可以通过设置img标签的max-width和max-height属性,来限制其最大的宽度和高度,同时自适应缩放。 以下是实现图片等比例缩小不变形的示例代码: img { max-width: 100%; height: auto; } 这段代码设置了img标签的最大宽度为100%,高度自动适应,从而实现图片等比例缩小不变形。这…

    css 2023年6月10日
    00
  • jQuery实现的自定义轮播图功能详解

    jQuery实现自定义轮播图功能详解 自定义轮播图是现代网站设计中经常出现的效果之一。通过jQuery实现轮播图功能,能够使我们更加灵活地控制其样式和交互效果。下面介绍一下实现自定义轮播图的具体步骤。 第一步:HTML结构 首先,我们需要在HTML结构中定义轮播图的内容。例如: <div class="slider"> &lt…

    css 2023年6月10日
    00
  • div里的图片距离div下边框多3个像素的解决方法

    要解决“div里的图片距离div下边框多3个像素”的问题,可以有以下几种方法: 方法一:使用负margin 可以通过给图片设置负margin来达到让图片距离下边框多出3像素的效果。具体实现如下: <div class="parent"> <img src="image.jpg"> </di…

    css 2023年6月10日
    00
  • 浅谈移动端的自适应布局问题(响应式、rem/em、Js动态)

    移动端自适应布局问题是在不同屏幕尺寸的移动设备上保持网页布局始终合适的问题。常见的解决方案包括响应式、rem/em以及Js动态。 响应式布局 响应式布局是指适配不同宽度的屏幕,使用CSS3的媒体查询(Media Query)来给不同尺寸的设备设置不同的样式。通常响应式布局可以分成三份(移动端、平板、PC端)设置不同的CSS样式。 以两列布局为例,代码如下: …

    css 2023年6月9日
    00
  • 纯CSS3实现鼠标悬停提示气泡效果

    下面是详细讲解”纯CSS3实现鼠标悬停提示气泡效果”的完整攻略: 一、简介 在Web开发中,经常需要对某些元素添加提示信息,尤其是一些带有缩略语或者关键词的标签,需要在鼠标悬停时显示具体的解释。常见的方法是通过JavaScript实现,但其需要额外的代码和操作,而纯CSS呈现这种效果更简单、更轻量级、更优雅。这种效果通常被称作”鼠标悬停提示气泡效果”。 二、…

    css 2023年6月10日
    00
  • 获取内联和链接中的样式(js代码)

    获取内联和链接中的样式可以通过DOM来完成。通常情况下,内联Style和link样式表都可以被获取。 获取内联样式可以使用element.style属性,该属性可以返回包含所有内联样式属性的对象。对象的各个属性可以使用点表示法访问,其值是CSS属性的字符串表示形式。例如: <div id="myDiv" style="ba…

    css 2023年6月10日
    00
  • 网站设计之合理架构CSS

    以下是“网站设计之合理架构CSS”的完整攻略: 网站设计之合理架构 CSS 在网站设计中,CSS 是一个非常重要的组成部分。以下是一些常见的合理架构 CSS 的方法。 使用模块化 CSS 可以使用模块化 CSS 来组织 CSS 代码,例如: 将 CSS 代码分成多个模块,每个模块负责一个特定的功能。 使用类似 BEM(块、元素、修饰符)的命名约定来命名 CS…

    css 2023年5月18日
    00
  • CSS为指定的input文本框添加背景

    为了给你更详细的讲解,以下是关于如何使用CSS为指定的input文本框添加背景的完整攻略: 1. 使用background属性添加背景 在CSS中,可以使用background属性来添加背景图像、颜色或其他背景相关属性。要为指定的input文本框添加背景,可以使用如下代码: input[type=text] { background: #f2f2f2 url…

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