JavaScript如何实现图片懒加载_JavaScript如何监听图片进入视口
发布时间 - 2025-12-26 00:00:00 点击率:次JavaScript图片懒加载核心是监听图片是否进入视口后才加载真实资源,推荐用IntersectionObserver实现提前加载,不支持时降级为scroll+getBoundingClientRect,并需处理加载失败、布局偏移等优化。
JavaScript 实现图片懒加载,核心是监听图片是否进入视口(viewport),并在进入时才加载其真实图片资源。这能显著减少首屏请求、节省带宽、提升页面初始渲染性能。
使用 IntersectionObserver 监听图片是否进入视口
现代推荐方式是使用 IntersectionObserver A
PI,它原生支持异步监听元素与视口的交叉状态,性能好、写法简洁、无需频繁监听 scroll 或 resize。
- 将图片的真实地址(如
data-src)暂存于自定义属性中,src先设为空或占位图 - 创建 Observer 实例,配置
rootMargin(如"100px")可实现“提前加载”,让图片在真正进入视口前就开始请求 - 回调中判断
isIntersecting === true,则设置img.src = img.dataset.src,并可调用unobserve()避免重复触发
兼容性处理:不支持 IntersectionObserver 时降级为 scroll + getBoundingClientRect
对于需兼容 IE 或老版本浏览器的场景,可用传统方式模拟:
- 将所有待懒加载图片缓存到数组中,绑定
scroll和resize事件(注意节流) - 遍历图片,调用
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(如DPR、Width)动态返回适配尺寸的图片,进一步优化懒加载效果
# 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正则表达式进阶教程_复杂匹配与分组替换解析
如何用已有域名快速搭建网站?
西安专业网站制作公司有哪些,陕西省建行官方网站?

