JavaScript如何实现图片懒加载_JavaScript如何监听图片进入视口

发布时间 - 2025-12-26 00:00:00    点击率:
JavaScript图片懒加载核心是监听图片是否进入视口后才加载真实资源,推荐用IntersectionObserver实现提前加载,不支持时降级为scroll+getBoundingClientRect,并需处理加载失败、布局偏移等优化。

JavaScript 实现图片懒加载,核心是监听图片是否进入视口(viewport),并在进入时才加载其真实图片资源。这能显著减少首屏请求、节省带宽、提升页面初始渲染性能。

使用 IntersectionObserver 监听图片是否进入视口

现代推荐方式是使用 IntersectionObserver API,它原生支持异步监听元素与视口的交叉状态,性能好、写法简洁、无需频繁监听 scroll 或 resize。

  • 将图片的真实地址(如 data-src)暂存于自定义属性中,src 先设为空或占位图
  • 创建 Observer 实例,配置 rootMargin(如 "100px")可实现“提前加载”,让图片在真正进入视口前就开始请求
  • 回调中判断 isIntersecting === true,则设置 img.src = img.dataset.src,并可调用 unobserve() 避免重复触发

兼容性处理:不支持 IntersectionObserver 时降级为 scroll + getBoundingClientRect

对于需兼容 IE 或老版本浏览器的场景,可用传统方式模拟:

  • 将所有待懒加载图片缓存到数组中,绑定 scrollresize 事件(注意节流)
  • 遍历图片,调用 element.getBoundingClientRect() 获取其相对于视口的位置
  • 判断 rect.top 0(即顶部在视口下方、底部在视口上方),满足即加载
  • 加载后从缓存数组中移除该元素,避免重复检查

HTML 结构与基础 JS 示例

结构示例:

立即学习“Java免费学习笔记(深入)”;

@@##@@

简单 Observer 实现:

const lazyImages = document.querySelectorAll('img.lazy');
if ('IntersectionObserver' in window) {
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.classList.remove('lazy');
observer.unobserve(img);
}
});
}, { rootMargin: '50px' });

lazyImages.forEach(img => observer.observe(img));
}

补充细节与优化建议

实际项目中还需注意:

  • 加载失败时提供 fallback,例如监听 img.onerror 后显示默认图或错误提示
  • 配合 loading="lazy" HTML 属性(现代浏览器原生懒加载),作为兜底或简化静态资源处理
  • 若图片有宽高比要求,建议提前设置 width/height 或使用 aspect-ratio,防止加载时布局偏移(CLS)
  • 服务端可结合 Client-Hints(如 DPRWidth)动态返回适配尺寸的图片,进一步优化懒加载效果


# javascript  # java  # html  # js  # 浏览器  # 懒加载  # ssl  # win 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JavaScript中的标签模板是什么_它如何扩展字符串功能  怎么用AI帮你为初创公司进行市场定位分析?  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Linux系统命令中screen命令详解  潮流网站制作头像软件下载,适合母子的网名有哪些?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Python函数文档自动校验_规范解析【教程】  Laravel怎么在Controller之外的地方验证数据  深圳网站制作培训,深圳哪些招聘网站比较好?  实例解析Array和String方法  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  青岛网站建设如何选择本地服务器?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  如何快速辨别茅台真假?关键步骤解析  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  如何快速搭建高效服务器建站系统?  PHP 500报错的快速解决方法  EditPlus中的正则表达式实战(5)  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  太平洋网站制作公司,网络用语太平洋是什么意思?  打造顶配客厅影院,这份100寸电视推荐名单请查收  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  JS碰撞运动实现方法详解  如何用VPS主机快速搭建个人网站?  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  Laravel模型事件有哪些_Laravel Model Event生命周期详解  如何快速登录WAP自助建站平台?  教你用AI润色文章,让你的文字表达更专业  如何在景安云服务器上绑定域名并配置虚拟主机?  Laravel PHP版本要求一览_Laravel各版本环境要求对照  Laravel如何处理异常和错误?(Handler示例)  如何在阿里云服务器自主搭建网站?  如何在Ubuntu系统下快速搭建WordPress个人网站?  如何快速使用云服务器搭建个人网站?  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Linux系统命令中tree命令详解  LinuxShell函数封装方法_脚本复用设计思路【教程】  北京专业网站制作设计师招聘,北京白云观官方网站?  Python正则表达式进阶教程_复杂匹配与分组替换解析  如何用已有域名快速搭建网站?  西安专业网站制作公司有哪些,陕西省建行官方网站?