信息发布→ 登录 注册 退出

J*aScript实现图片懒加载的三种方式_j*ascript性能优化

发布时间:2025-11-20

点击量:
答案:J*aScript实现图片懒加载有三种方式:1. 使用getBoundingClientRect结合scroll事件和防抖检测元素位置;2. 使用Intersection Observer API异步监听元素进入视口,性能更优;3. 通过scroll事件结合offsetTop判断图片是否可见,需注意布局变化影响。推荐优先使用Intersection Observer。

javascript实现图片懒加载的三种方式_javascript性能优化

图片懒加载是一种提升网页性能的常用技术,尤其在包含大量图片的页面中效果显著。它通过延迟加载非首屏图片,减少初始请求资源大小,加快页面渲染速度,优化用户体验。以下是 J*aScript 实现图片懒加载的三种常见方式。

1. 使用 getBoundingClientRect 判断元素是否进入视口

这种方式通过定时检测图片元素与浏览器视口的位置关系,判断其是否出现在可视区域内,从而决定是否加载真实图片。

实现思路:

  • 将图片的真实地址存放在 data-src 属性中,src 先为空或占位图。
  • 监听页面的 scroll 事件(可配合防抖优化性能)。
  • 遍历所有未加载的图片,使用 getBoundingClientRect() 获取其位置信息。
  • 如果图片的 top 值小于可视区域高度,则开始加载图片。

示例代码:

网趣网上购物系统HTML静态版 网趣网上购物系统HTML静态版

网趣购物系统静态版支持网站一键静态生成,采用动态进度条模式生成静态,生成过程更加清晰明确,商品管理上增加淘宝数据包导入功能,与淘宝数据同步更新!采用领先的AJAX+XML相融技术,速度更快更高效!系统进行了大量的实用性更新,如优化核心算法、增加商品图片批量上传、谷歌地图浏览插入等,静态版独特的生成算法技术使静态生成过程可随意掌控,从而可以大大减轻服务器的负担,结合多种强大的SEO优化方式于一体,使

网趣网上购物系统HTML静态版 0 查看详情 网趣网上购物系统HTML静态版
const images = document.querySelectorAll('img[data-src]');

function loadImage() {
  images.forEach(img => {
    const rect = img.getBoundingClientRect();
    if (rect.top < window.innerHeight && !img.src) {
      img.src = img.dataset.src;
    }
  });
}

// 防抖处理
let timer;
window.addEventListener('scroll', () => {
  if (timer) clearTimeout(timer);
  timer = setTimeout(loadImage, 100);
});

// 初始化调用一次
loadImage();

2. 使用 Intersection Observer API(推荐)

这是现代浏览器推荐的方式,无需手动计算位置,性能更优,代码更简洁。

Intersection Observer 可以异步监听目标元素与视口的交叉状态,当图片进入视口时触发回调。

  • 创建一个观察器实例,设置回调函数。
  • 将每张待加载图片作为目标传入观察器。
  • 一旦图片进入视口,加载真实图片并停止观察。

示例代码:

const images = document.querySelectorAll('img[data-src]');

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      observer.unobserve(img); // 加载后取消监听
    }
  });
});

images.forEach(img => observer.observe(img));

优点:无需频繁监听 scroll,由浏览器优化调度,性能更好。

3. 使用 scroll + offsetTop 判断位置

这是一种较传统的方法,通过比较图片距离页面顶部的偏移量和当前滚动位置来判断是否可见。

  • 获取图片的 offsetTop(相对于文档顶部的位置)。
  • 结合 window.innerHeightwindow.pageYOffset 计算是否进入视口。
  • 同样建议加防抖避免频繁触发。

示例代码:

const images = document.querySelectorAll('img[data-src]');

function checkVisible() {
  const windowHeight = window.innerHeight;
  const scrollTop = window.pageYOffset;

  images.forEach(img => {
    if (!img.src && img.offsetTop <= windowHeight + scrollTop) {
      img.src = img.dataset.src;
    }
  });
}

window.addEventListener('scroll', debounce(checkVisible, 150));

function debounce(func, delay) {
  let timeout;
  return function() {
    const context = this, args = arguments;
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(context, args), delay);
  };
}

注意:offsetTop 不会实时更新布局变化,若页面结构动态变化需谨慎使用。

基本上就这些。三种方式中,Intersection Observer 是最推荐的现代方案,兼容性良好(IE 不支持,需考虑 polyfill)。前两种适合大多数场景,第三种适合低版本环境兼容。选择合适的方法能有效提升页面加载速度和用户体验。

以上就是J*aScript实现图片懒加载的三种方式_j*ascript性能优化的详细内容,更多请关注其它相关文章!


相关文章: Python多版本共存与虚拟环境管理深度指南  Win11怎么开启省电模式_Win11电池节电模式自动开启  谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】  单12V-2&#215;6实现为RTX 5090供电750W!甚至都没敢跑分  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  mysql备份恢复性能优化_mysql备份恢复性能优化方法  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果  MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略  精准捕获:如何在页面中监听除特定元素外的所有点击事件  Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  优化HTML表单样式:解决输入框焦点跳动与元素间距问题  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  高德地图怎么看全景照片_高德地图全景照片浏览教程  将HTML Canvas内容转换为可上传的图像文件(File对象)  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  Go语言实现持久化与原子性文件存储的教程  VS Code远程开发时如何处理文件权限问题  Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  HTML长属性值处理:表单action路径优化与代码规范应对  J*aScript 字符串标签转换:使用正则表达式高效替换  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  c++如何实现单例设计模式_c++线程安全的单例模式写法  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧  文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】  KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程  mcjs网页版在线存档 mcjs云存档登录入口  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  整合Supabase认证与Django模型:跨模式迁移的解决方案  SteamMachine定价或为699美元 大家想入手吗?  海棠账号登录入口_登录海棠账户同步阅读记录  qq音乐在线播放入口_qq音乐电脑版登录链接  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  Go语言JSON解析深度指南:动态访问与结构体映射实践  C++如何比较两个字符串_C++ string compare函数与操作符对比  2026春节假期时间安排 2026春节假日查询  知音漫客官网漫画下载_知音漫客网页版阅读记录  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  高德地图公交到站提醒失败如何解决 高德提醒权限设置  必由学官方网站入口 必由学学生教师共用登录通道 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!