新闻中心

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

2025-11-05
浏览次数:
返回列表
优先推荐使用Intersection Observer API实现图片懒加载,通过监听元素是否进入视口异步加载图片,性能好且代码简洁;对于旧浏览器可降级采用scroll事件配合getBoundingClientRect或offsetTop判断位置,并结合节流或防抖优化性能。

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

图片懒加载是一种优化网页性能的常用技术,能有效减少首屏加载时间、降低服务器压力。它通过延迟加载非首屏图片,只有当用户滚动到可视区域时才加载对应图片。以下是 J*aScript 实现图片懒加载的三种常见方式。

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

这种方式通过定时检测图片元素与浏览器视口的位置关系,判断是否需要加载。

实现思路:

  • 给所有需要懒加载的图片设置 data-src 属性,存放真实图片地址。
  • 初始时 img 的 src 指向占位图或为空。
  • 监听 scroll 事件,遍历所有未加载的图片,调用 getBoundingClientRect() 获取其位置。
  • 如果图片的 top 值小于可视区域高度(且处于向下滚动),则将 data-src 赋值给 src,完成加载。

示例代码:

科威旅游管理系统 科威旅游管理系统

该软件是以php+MySQL进行开发的旅游管理网站系统。系统前端采用可视化布局,能自动适应不同尺寸屏幕,一起建站,不同设备使用,免去兼容性烦恼。系统提供列表、表格、地图三种列表显示方式,让用户以最快的速度找到所需行程,大幅提高效率。系统可设置推荐、优惠行程,可将相应行程高亮显示,对重点行程有效推广,可实现网站盈利。系统支持中文、英文,您还可以在后台添加新的语言,关键字单独列出,在后台即可快速翻译。

科威旅游管理系统 0 查看详情 科威旅游管理系统
const images = document.querySelectorAll('img[data-src]');

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

window.addEventListener('scroll', checkVisible);
checkVisible(); // 初始化检查一次

注意:scroll 事件频繁触发,建议结合防抖(debounce)优化性能。

2. 使用 Intersection Observer API(推荐)

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

实现原理:

  • 创建一个 IntersectionObserver 实例,监听目标元素是否进入视口。
  • 当元素可见时,回调函数触发,加载真实图片。
  • 加载完成后可停止监听该元素。

示例代码:

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

document.querySelectorAll('img[data-src]').forEach(img => {
  observer.observe(img);
});

Intersection Observer 是异步执行,不会阻塞页面渲染,适合大量图片场景。

3. 使用 scroll + offsetTop 配合节流

通过元素距离文档顶部的偏移量(offsetTop)与页面滚动位置比较,判断是否进入视口。

实现步骤:

  • 记录每张图片的 offsetTop 值(可缓存避免重复计算)。
  • 监听页面 scroll 事件,获取当前滚动距离(window.pageYOffset)。
  • 结合可视区域高度,判断图片是否进入视野。
  • 使用节流函数控制检测频率,防止频繁执行。

示例代码(含节流):

function throttle(fn, delay) {
  let flag = true;
  return function () {
    if (!flag) return;
    flag = false;
    setTimeout(() => {
      fn.apply(this, arguments);
      flag = true;
    }, delay);
  };
}

const imgs = document.querySelectorAll('img[data-src]');
let imageIndex = 0;

function lazyLoad() {
  const scrollTop = window.pageYOffset;
  const clientHeight = window.innerHeight;

  for (let i = imageIndex; i < imgs.length; i++) {
    if (imgs[i].offsetTop < scrollTop + clientHeight) {
      imgs[i].src = imgs[i].dataset.src;
      imageIndex++;
    }
  }
}

window.addEventListener('scroll', throttle(lazyLoad, 100));

这种方式兼容性好,适合不支持 Intersection Observer 的旧浏览器。

基本上就这些。优先推荐使用 Intersection Observer,兼顾性能和可维护性。在需要兼容老版本浏览器时,可降级使用 scroll + getBoundingClientRect 或 offsetTop 方案,并配合节流优化。图片懒加载虽小,但对用户体验提升明显。

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


# java  # 浏览器  # app  # 回调函数  # javascript  # 防抖  # 西宁做网站建设公司  # 端到  # 阳江网站推广需要多少钱  # 定西市网站建设平台  # 北仑seo信息  # 沃航文化seo自然排名  # 灵寿网站建设供应  # 福清市场推广营销效果评估  # 西城公司网站推广  # seo信息查找  # 滨州网站建设制作软件  # 如何实现  # 如何用  # 命令行  # 推荐使用  # 回调  # 管理系统  # 三种  # 加载  # 延迟加载  # 异步加载  # win  # 懒加载 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  b站怎么删除评论_b站评论管理与删除操作  sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  J*aScript异步迭代器_j*ascript异步遍历  抖音创作助手登录入口_抖音创作辅助工具官网直达  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  Golang如何使用const iota_Go iota常量计数器讲解  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置  妖精动漫免费平台 妖精动漫官网资源观看网址  如何将HTML表格多行数据保存到Google Sheets  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  12306几点到几点不能订票? | 官方最新系统维护时间全解析  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  Eclipse怎么运行工程_Eclipse工程运行配置说明  jQuery Mask 插件中实现电话号码固定前导零的教程  J*aScript DOM操作:高效清空列表元素的策略与实践  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  React中useState与局部变量:理解组件状态管理与渲染机制  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  生成rdflib自定义SPARQL函数:参数匹配与实践指南  将HTML动态表格多行数据保存到Google Sheet的教程  蛙漫2台版漫画地址 Manwa2正版网页版链接  UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  J*aScript动态修改指定div内所有a标签样式指南  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  在命令行怎么运行html项目_命令行运行html项目方法【教程】  Excel文件在线转换快速入口 Excel在线格式转换网站  Angular Material 垂直步进器:实现底部到顶部排序的教程  C++如何实现异步操作_C++11使用std::future和std::async进行异步编程  Python多线程中正确使用sigwait处理SIGALRM信号  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  12306选座怎么选到临时改签座_12306改签选座策略与步骤  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  新手怎么开始学化妆 零基础化妆入门教程  小红书网页版入口链接分享 小红书官网直接进  汽水音乐在线版入口_汽水音乐网页播放手册  最新韩小圈网页版登录入口_官网在线观看官方链接 

搜索