首页 > 其他分享 >实现懒加载

实现懒加载

时间:2023-06-13 10:00:48浏览次数:49  
标签:实现 list elem let images 数据 加载

原文合集地址如下,有需要的朋友可以关注

本文地址

合集地址

什么是懒加载

只在数据或内容即将进入视口或即将需要的时候才加载。 实现懒加载的好处有:

  1. 提高页面加载速度和响应速度。只加载当前用户需要或将要浏览到的数据,避免一次性加载大量不必要的数据。
  2. 节省用户流量。只加载用户浏览到的数据,避免加载用户未浏览的数据,特别是对于移动端用户来说可以节省流量。
  3. 优化用户体验。避免一次性加载大量数据导致页面卡顿,appear突然出现,样式渲染跳跃等影响用户体验的问题。 实现懒加载的弊端有:
  4. 首屏加载会较慢,而一些关键数据又需要首屏加载,需要权衡。
  5. 需要监听浏览器事件并判断元素是否进入视口,稍微增加了开发难度。
  6. 如果数据较多,需要加载的内容较长,用户体验还是会受到影响。懒加载并非银弹,还需要结合其他优化手段。
  7. 不利于 SEO。搜索引擎爬虫抓取不到实际内容,抓取到的可能是 loading 占位图等,影响网页Indexed和排名。 所以,懒加载是一种非常 useful 的技术,可以极大提高用户体验和网页性能,但也有一定的弊端,需要权衡选择。一般来说,对于加载的数据较多,页面性能和流量较为关注的场景,懒加载是一个不错的方案。但如果对 SEO 优化要求较高,或者加载的数据较少,也可以不使用懒加载。

实现图片懒加载

页面需要大量展示图片时可以考虑使用懒加载。实现步骤如下:

  1. 为图片添加默认的 loading 图片源和真实的 data-src 属性:
<img src="loading.gif" data-src="real-img.jpg" />
  1. 获取所有图片元素:
const images = document.querySelectorAll('img');
  1. 监听页面滚动事件:
window.addEventListener('scroll', loadImages);
  1. 定义 loadImages 函数来加载图片:
function loadImages() {
  for (let i = 0; i < images.length; i++) {
    // 获取图片源和位置信息
    let imgSrc = images[i].dataset.src;
    let imgRect = images[i].getBoundingClientRect();
    
    if (imgRect.top < window.innerHeight && imgRect.left < window.innerWidth
     && imgRect.right > 0 && imgRect.bottom > 0) {  
      // 图片进入视口,加载真实图片源
      images[i].src = imgSrc;  
      images[i].addEventListener('load', () => { 
        images[i].style.opacity = 1;  // 淡入效果
      });
    } 
  }
}
  1. 页面初始化时调用一次 loadImages,防止某些图片已进入视口但未加载:
loadImages();
  1. 为避免加载较大图片导致页面卡顿,可以考虑在图片加载完成后设置淡入效果:
images[i].addEventListener('load', () => { 
  images[i].style.opacity = 1;  
});

列表懒加载

这里提供一个核心代码,根据自己项目加入即可

// 比如使用我有这样一个
// 定义页码和加载条数
const pageSize = 10;   
let currentPage = 1;  

// list 代表拥有滚动条的元素, 看你代码如何定义,可以是网页窗口 window、div元素、ul列表等等
// 需要先获取list 元素,再监听列表中的元素进入视口事件,判断元素位置并加载数据
list.addEventListener('scroll', () => {
  Array.from(list.children).forEach(elem => {
    let top = elem.offsetTop;
    let height = elem.clientHeight;
    if (top > 0 && top < window.innerHeight) {  
      // 元素进入视口,加载数据
      fetchData(currentPage);
      currentPage++;
    }
  });
}); 
定义 fetchData() 方法根据页码加载数据,并更新元素内容:
function fetchData(page) {
  // 发起请求,加载第page页的数据,此处省略调用接口的代码,根据自己代码结构加入即可
  ...
  ...
  // 更新列表中符合页码的元素内容
  Array.from(list.children).forEach(elem => {
    if (elem.dataset.page === page) {  
      elem.innerHTML = ... // 加载的数据内容
    }
  });
} 
// 初始化加载第一页数据,并为每个列表元素添加 data-page 属性:
fetchData(1);
Array.from(list.children).forEach((elem, index) => {
  elem.dataset.page = index % 10 + 1;  // 每10个元素为一页
});

列表滚动加载

如果是加载列表数据的话,这里提供一个实现滚动加载列表数据的代码

// 1. 定义页面大小、每页加载条数和当前页码:
const pageSize = 10;     // 每页10条数据 
const listHeight = 400;  // 比如列表容器高度400px 
let currentPage = 1;     // 当前页码
let scrollTop = 0;  // 上一次滚动条位置 

//  2. 绑定滚动事件,判断滚动方向并加载数据:
list.addEventListener('scroll', () => {
  let scrollHeight = list.scrollHeight;  // 滚动内容高度
  let clientHeight = list.clientHeight;  // 视口高度
  let scrollDirection = scrollTop - list.scrollTop; 
  // 向下滚动
  if (scrollDirection > 0 && scrollHeight - clientHeight - list.scrollTop <= pageSize * 3) {
    // 滚动到底部,加载下一页
    currentPage++;
    fetchData(currentPage); 
  } 
  
  // 向上滚动 
  if (scrollDirection < 0 && list.scrollTop <= pageSize * 3) {
    // 滚动到顶部,加载上一页
    currentPage--; 
    fetchData(currentPage);
  }
  
  scrollTop = list.scrollTop;  // 更新滚动条位置
}); 
// 定义 fetchData() 方法,根据页码加载数据:
function fetchData(page) {
  // 发起请求,加载第page页的数据
  ...
  
  // 将新加载的数据添加到列表尾部
  list.append(...); 
}
// 初始化获取第一页数据
fetchData(1)

标签:实现,list,elem,let,images,数据,加载
From: https://blog.51cto.com/u_14196886/6467275

相关文章

  • JAVA非递归生成无限级菜单树的较简代码实现。(非泛用型工具包,仅总结逻辑)
    这是一个根据列表生成一个树状结构的较简单实现。搜了搜看起来好像没多少人总结过这种实现。写上来整理一下自己的思路,请大家用用看看,应该用起来问题不大?反正我没遇到BUG。实现的时间复杂度为O(N),空间复杂度应该还是O(N)吧。不过GPT说O(1)可能是因为java的对象实现hash链表是引用而不是......
  • 驱动开发:内核LoadLibrary实现DLL注入
    远程线程注入是最常用的一种注入技术,在应用层注入是通过CreateRemoteThread这个函数实现的,该函数通过创建线程并调用LoadLibrary动态载入指定的DLL来实现注入,而在内核层同样存在一个类似的内核函数RtlCreateUserThread,但需要注意的是此函数未被公开,RtlCreateUserThread其实是对N......
  • ASP.NET Core 6框架揭秘实例演示[37]:重定向的N种实现方式
    在HTTP的语义中,重定向一般指的是服务端通过返回一个状态码为3XX的响应促使客户端像另一个地址再次发起请求,本章将此称为“客户端重定向“。既然有客户端重定向,自然就有服务端重定向,本章所谓的服务端重定向指的是在服务端通过改变请求路径将请求导向另一个终结点。ASP.NET下的重定......
  • Servlet p1 Servlet的实现
    Servlet的实现基本介绍​ Servlet是Server与Applet的缩写,是服务端小程序的总思。使用Java语言编写的服务器端程序,可以像生成动态的WEB页,Servlet主要运行在服务器端,并由服务器调用执行,是一种按照Servlet标准来开发的类。是SUN公司提供的一门用于开发动态Web资源的技术。(言外之意:......
  • python 中使用zip实现矩阵转置
     001、[root@PC1test04]#lsa.txttest.py[root@PC1test04]#cata.txt##测试数据010203040506070809101112131415161718192021222324252627282930[root@PC1test04]#cattest.py##测试程序#!/usr/bin/envpython#-*......
  • Ubuntu-20.04.6-server安装MySQL实现远程连接
    Ubuntu-20.04.6-server安装MySQL,修改密码安装MySQL一、查看是否安装数据库mysql--version二、更新系统中的所有软件包和存储库sudoaptupdate三、安装Mysql最新版(我这里已经安装好了)sudoaptinstallmysql-server四、安装成功后,mysql--version查看版本五、查......
  • java实现一个接口多个实现类,并且依次调用指定方法
    接口packagecn.daenx.yhchatsdk.mytest;publicinterfaceMyInterface{/***返回-1,后面的实现类将不再执行*返回0,后面的实现类继续执行**@return*/IntegerdoSomething();}实现类实现类1packagecn.daenx.yhchatsdk.mytest;......
  • 通过python实现相机的立体匹配
    相机的立体匹配是一种通过双目相机拍摄同一场景的左、右两幅视点图像,运用立体匹配算法获取视差图,进而获取深度图的技术。这种技术可以用于三维重建、机器人视觉、虚拟现实等领域。本文将介绍如何使用Python实现相机的立体匹配。首先,我们需要安装OpenCV库。在命令行中输入以下命令:接......
  • Vue3基本功能实现
    vue3介绍#Vue3的变化#1.性能的提升 打包大小减少41%初次渲染快55%,更新渲染快133%内存减少54%#2.源码的升级 使用Proxy代替defineProperty实现响应式重写虚拟DOM的实现和Tree-Shaking#3.拥抱TypeScript Vue3可以更好的支持TypeScript......
  • 探索后疫情时代Airbnb实现逆周期增长的四大策略
    ​01.发挥P2P优势,打造差异化的“旅居生活体验”P2P(Peer-to-Peer)是一种点对点的网络模式,即用户之间可以直接进行交流和交易,无需通过中介或第三方机构。早期Airbnb对P2P的利用仅局限在空置房间的供应上,初期目标客户定位为只追求便宜价格的沙发客,这一客户群体不要求过多的舒适的住......