实现懒加载

简介: 懒加载是一种非常 useful 的技术,可以极大提高用户体验和网页性能,但也有一定的弊端,需要权衡选择。一般来说,对于加载的数据较多,页面性能和流量较为关注的场景,懒加载是一个不错的方案。但如果对 SEO 优化要求较高,或者加载的数据较少,也可以不使用懒加载

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

本文地址

合集地址

什么是懒加载

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

  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)
目录
相关文章
|
Web App开发 Linux
只需五步,在Linux安装chrome及chromedriver(CentOS)
只需五步,在Linux安装chrome及chromedriver(CentOS)
6960 1
|
API 计算机视觉 开发者
【Python】已解决:(pip安装PIL库报错) ERROR: Could not find a version that satisfies the requirement PIL (from v
【Python】已解决:(pip安装PIL库报错) ERROR: Could not find a version that satisfies the requirement PIL (from v
2926 0
|
存储 缓存 NoSQL
深入理解分布式缓存——使用Spring Boot+Redis实现分布式缓存解决方案
在微服务飞速发展的今天,在高并发的分布式的系统中,缓存是提升系统性能的重要手段。没有缓存对后端请求的拦截,大量的请求将直接落到系统的底层数据库。系统是很难撑住高并发的冲击,下面就以Redis为例来聊聊分布式系统中关于缓存的设计以及过程中遇到的一些问题。
11301 58
深入理解分布式缓存——使用Spring Boot+Redis实现分布式缓存解决方案
|
存储 缓存 NoSQL
分布式缓存Redis击穿、雪崩、穿透面试题+SpringCache解决方案
分布式缓存Redis击穿、雪崩、穿透面试题+SpringCache解决方案
604 0
|
21天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34909 57
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
15天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
14507 44
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
3天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
|
11天前
|
人工智能 JavaScript Ubuntu
低成本搭建AIP自动化写作系统:Hermes保姆级使用教程,长文和逐步实操贴图
我带着怀疑的态度,深度使用了几天,聚焦微信公众号AIP自动化写作场景,写出来的几篇文章,几乎没有什么修改,至少合乎我本人的意愿,而且排版风格,也越来越完善,同样是起码过得了我自己这一关。 这个其实OpenClaw早可以实现了,但是目前我觉得最大的区别是,Hermes会自主总结提炼,并更新你的写作技能。 相信就冲这一点,就值得一试。 这篇帖子主要就Hermes部署使用,作一个非常详细的介绍,几乎一步一贴图。 关于Hermes,无论你赞成哪种声音,我希望都是你自己动手行动过,发自内心的选择!
2865 28
|
1月前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
45834 160
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw

热门文章

最新文章