首页 > 其他分享 >使用 Intersection Observer API以及动态加载内容细节

使用 Intersection Observer API以及动态加载内容细节

时间:2024-11-29 18:57:45浏览次数:11  
标签:视口 document const Observer 重试 API newItem Intersection 加载

1 使用 Intersection Observer API

什么是 Intersection Observer?

Intersection Observer API 是现代浏览器提供的一种接口,用于检测一个元素(目标元素)是否与视口(用户可见区域)或某个特定父容器交叉。

优点
  • 不需要手动监听滚动事件,性能更优。
  • 在用户接近目标区域时触发,比滚动事件更高效。
  • 支持更复杂的触发条件设置,例如阈值(多少比例交叉时触发)。
实现方案
  1. 在页面底部放置一个标记元素(sentinel)。
  2. 使用 Intersection Observer 检测该标记元素是否进入视口。
  3. 触发加载更多内容的逻辑。
代码示例
<div id="content">
  <!-- 已加载的内容 -->
</div>
<div id="sentinel"></div> <!-- 视口底部的标记 -->
// 创建观察器
const observer = new IntersectionObserver((entries) => {
  // 检测目标元素是否可见
  if (entries[0].isIntersecting) {
    console.log('Sentinel 可见,加载更多内容');
    loadMoreContent();
  }
}, {
  root: null, // 视口作为根容器
  threshold: 0.1 // 当 10% 的 sentinel 进入视口时触发
});

// 开始观察标记元素
const sentinel = document.getElementById('sentinel');
observer.observe(sentinel);

function loadMoreContent() {
  const container = document.getElementById('content');
  for (let i = 0; i < 5; i++) {
    const newItem = document.createElement('div');
    newItem.textContent = `新内容项 ${Math.random()}`;
    newItem.className = 'content-item';
    container.appendChild(newItem);
  }
}
参数详解
  • root: 观察器的根容器,设置为 null 表示视口。
  • rootMargin: 调整触发的边距,例如 0px 0px -50px 0px 表示提前 50 像素触发。
  • threshold: 交叉比例阈值,范围为 0~1。
适用场景
  • 高性能动态加载。
  • 滚动事件监听存在性能瓶颈时。

2 懒加载图片

什么是图片懒加载?

图片懒加载指的是页面加载时不直接加载所有图片,而是等图片进入用户视口时再进行加载。这样可以优化页面性能,减少初始加载时间。

实现方案
  1. 图片元素使用占位符。
  2. 在图片元素上添加一个真实图片地址的属性(如 data-src)。
  3. 当图片进入视口时,替换 src 属性以加载真实图片。
代码示例
<div id="content">
  <img data-src="image1.jpg" alt="图片 1" class="lazy">
  <img data-src="image2.jpg" alt="图片 2" class="lazy">
</div>
const images = document.querySelectorAll('.lazy');

const observer = new IntersectionObserver((entries, observer) => {
  entries.forEach((entry) => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.getAttribute('data-src'); // 加载真实图片
      img.classList.remove('lazy'); // 移除懒加载标记
      observer.unobserve(img); // 停止观察
    }
  });
}, {
  root: null, // 视口作为根容器
  threshold: 0.1
});

// 开始观察所有懒加载图片
images.forEach((img) => observer.observe(img));
适用场景
  • 有大量图片需要动态加载时。
  • 优化首屏加载性能。

3 限制最大加载次数

为什么需要限制?
  • 防止用户无限滚动。
  • 限制服务器资源使用。
实现方案

记录已加载次数,在加载内容时检查是否超出最大限制。

代码示例
let loadCount = 0;
const maxLoadCount = 10; // 最大加载次数

function loadMoreContent() {
  if (loadCount >= maxLoadCount) {
    console.log('达到最大加载次数,不再加载');
    return;
  }

  const container = document.getElementById('content');
  for (let i = 0; i < 5; i++) {
    const newItem = document.createElement('div');
    newItem.textContent = `新内容项 ${Math.random()}`;
    container.appendChild(newItem);
  }

  loadCount++;
  console.log(`已加载次数: ${loadCount}`);
}
适用场景
  • 限制用户行为。
  • 防止无限滚动对系统性能的影响。

4 提供“返回顶部”按钮

为什么需要返回顶部按钮?

动态加载页面会让内容变长,用户需要方便地回到页面顶部。

实现方案
  1. 动态显示“返回顶部”按钮。
  2. 点击按钮时平滑滚动到顶部。
代码示例
<button id="backToTop" style="display: none;">返回顶部</button>
const backToTopButton = document.getElementById('backToTop');

// 监听滚动事件显示/隐藏按钮
window.addEventListener('scroll', () => {
  if (window.scrollY > 300) {
    backToTopButton.style.display = 'block';
  } else {
    backToTopButton.style.display = 'none';
  }
});

// 返回顶部功能
backToTopButton.addEventListener('click', () => {
  window.scrollTo({
    top: 0,
    behavior: 'smooth'
  });
});
适用场景
  • 动态内容增加时。
  • 提升用户体验。

5 增加加载失败的重试机制

为什么需要重试机制?

网络请求可能会失败(如网络不稳定),需要支持自动重试以改善用户体验。

实现方案
  1. 捕获加载失败的错误。
  2. 在失败后尝试重新加载数据。
代码示例
let retryCount = 0;
const maxRetry = 3;

async function loadMoreContent() {
  try {
    const response = await fetch('https://api.example.com/more-content');
    if (!response.ok) throw new Error('请求失败');
    
    const data = await response.json();
    const container = document.getElementById('content');
    data.items.forEach((item) => {
      const newItem = document.createElement('div');
      newItem.textContent = item.title;
      container.appendChild(newItem);
    });

    retryCount = 0; // 成功后重置重试次数
  } catch (error) {
    console.error('加载失败:', error);

    if (retryCount < maxRetry) {
      retryCount++;
      console.log(`重试第 ${retryCount} 次`);
      loadMoreContent(); // 重试加载
    } else {
      console.error('多次重试后仍失败');
    }
  }
}
适用场景
  • 网络状况不稳定的场景。
  • 后端接口偶尔失败时。

 总结

动态加载内容使用户体验更加流畅和优化:

功能点实现方式适用场景
使用 Intersection Observer替代滚动事件,性能更高页面滚动监听有性能瓶颈时
懒加载图片仅加载视口中的图片内容较多时减少初始加载时间
限制最大加载次数手动控制加载上限防止无限滚动影响用户体验或系统性能
返回顶部按钮提供快速回到顶部的功能页面内容较长时
加载失败重试捕获错误并提供自动重试网络不稳定或接口失败时

参考文档:

标签:视口,document,const,Observer,重试,API,newItem,Intersection,加载
From: https://blog.csdn.net/lixin5456985/article/details/144132338

相关文章

  • CTP API基本架构
    目录接口类通用参数API的基本结构交易托管系统接口文件接口的初始化步骤接口类Spi(如CThostFtdcTraderSpi),包含所有的响应和回报函数,用于接收综合交易平台发送或交易所发送综合交易平台转发的信息。开发者需要继承该接口类,并实现其中相应的虚函数。Api(如CThostFtdcTrad......
  • 身份证OCR 识别 API 接口的发展前景
    随着信息时代的到来,大量的身份证数据需要进行整理、存储和管理,OCR识别技术可以将身份证信息转化为结构化的电子文本,方便后续的数据管理和分析,提高工作效率。未来,随着人工智能和深度学习等技术的不断发展,身份证OCR识别技术将进一步完善和应用,为各行各业的身份验证和信息管理......
  • 深度学习-50-AI应用实战之基于mediapipe的手势识别
    文章目录1手势识别1.1手势识别技术1.2手势识别应用场景1.3手势识别基本原理2应用mediapipe2.1加载模型2.2处理图片2.2.1手势识别2.2.2人脸检测2.2.3姿态估计2.2.4表情识别2.3处理摄像头3参考附录1手势识别手势识别技术是一......
  • HTTP代理中的API提取链接解析?
    HTTP代理是网络中重要的组件,而API链接提取则是在HTTP代理中实现的一种关键功能。本文将深入探讨HTTP代理中的API链接提取,包括其工作原理、用途以及实现方法。我们将介绍API链接提取的背景和概念,详细说明其在代理服务器中的实现方式和应用场景。1、背景和概念HTTP代理充当了客......
  • 人脸识别API解锁智能生活、C++人脸识别接口软文
    在这个数字化转型的时代,科技正以前所未有的速度改变着我们的生活方式。其中,人脸识别技术作为人工智能领域的一项重要突破,已经逐渐渗透到我们生活的方方面面。翔云为广大有需求的用户提供了人脸识别接口解决方案,助力各行各业快速实现人脸比对功能。人脸识别接口基于深......
  • 什么是API接口?API接口的类型,如何调用API接口?
    当今互联网技术的发展越来越快,越来越多的网站和应用程序需要获取外部数据来提供更好的服务和用户体验,这就需要使用API接口。本文将会对API接口的概念、类型以及如何调用API接口进行简要介绍。一、什么是API接口?API(ApplicationProgrammingInterface)是应用程序开发接口的缩写,意......
  • Api流式导出大数据
    API流式导出大数据<?phpnamespaceApp\Admin\Exports;useApp\Admin\Services\Statistics\ExaminationRecordsDataService;useApp\Enums\ExaminationStatus;useGenerator;useMaatwebsite\Excel\Concerns\FromGenerator;useMaatwebsite\Excel\Concerns\......
  • HW3:使用 API 快速搭建你的第一个 AI 应用
    目录0前言1安装库2导入与设置3第1部分:文章摘要(单轮对话应用)3.1任务简介:3.2初始化: 3.3点击发送(默认温度因子为1):3.4设置温度因子为2并重新发送:3.5保存一下:3.6如何关闭demo.launch()呢?3.7 检查并打印你的结果4第2部分:角色扮演(多轮对话应用)4.1任务简介......
  • [Vue] Composition API LifeCycle Methods
    InVue3’sCompositionAPIwecancreatecallbackhooksinside setup() byadding on totheLifeCyclemethodname:import{onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted,onActivated,onDeactivated,on......
  • 鸿蒙ArkUI-X已更新适配API13啦
    ArkUI-X5.0.1Release版配套OpenHarmony5.0.1Rlease,API13,新增适配部分API13接口支持跨平台;框架能力进一步完善,支持Android应用非压缩模式,支持AndroidFragment对接跨平台。ACETools工具易用性提升,支持创建module时选择module类型、config提示优化和联动编译。组件跨平台能力......