Intersection Observer 是什么

admin2024-07-02  37

Intersection Observer API 是用于异步监测目标元素与祖先元素或视窗(viewport)之间交集的变化的 API。它提供了一种有效且性能较高的方法,用于在滚动和动态尺寸调整等情况下检测元素是否可见或者在可见区域内的程度。

示例:使用 Intersection Observer 实现图片懒加载

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Intersection Observer Demo</title>
  <style>
    .image {
      width: 100%;
      height: 300px; /* 为了演示效果,设置一个固定的高度 */
      background: #ccc; /* 为了演示效果,设置一个灰色背景 */
      margin-bottom: 20px;
    }
  </style>
</head>
<body>
  <div class="container">
    <div class="image" data-src="image1.jpg"></div>
    <div class="image" data-src="image2.jpg"></div>
    <div class="image" data-src="image3.jpg"></div>
    <div class="image" data-src="image4.jpg"></div>
    <div class="image" data-src="image5.jpg"></div>
  </div>

  <script>
    // 目标元素的观察者回调函数
    const observerCallback = (entries, observer) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          const image = entry.target;
          const imageUrl = image.getAttribute('data-src');
          if (imageUrl) {
            image.style.backgroundImage = `url(${imageUrl})`;
            image.removeAttribute('data-src');
            observer.unobserve(image);
          }
        }
      });
    };

    // 创建一个观察者实例并启动观察
    const observer = new IntersectionObserver(observerCallback, {
      root: null, // viewport 作为根
      threshold: 0.5 // 50% 可见度时触发回调
    });

    document.querySelectorAll('.image').forEach(image => {
      observer.observe(image);
    });
  </script>
</body>
</html>

解释:

  1. HTML 结构:在容器 .container 内部有多个具有 .image 类的 div 元素,每个元素都有 data-src 属性用于存储图片的 URL。

  2. CSS 样式:设置了一个 .image 类,包含了固定的高度和灰色背景,以便在加载图片前显示。

  3. JavaScript

    • 创建了一个 observerCallback 函数,用于处理观察到的每个元素的交集变化。
    • 创建了 IntersectionObserver 实例 observer,并通过 observe 方法观察每个 .image 元素。
    • 当某个 .image 元素进入视窗(可见度超过 50%)时,通过 data-src 属性加载图片,并停止观察该元素。

这是一个简单的示例,展示了如何使用 Intersection Observer API 来实现图片懒加载。你可以根据实际需求进一步扩展和优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!