新闻中心
J*aScript实现图片懒加载的三种方式_j*ascript优化
优先推荐使用Intersection Observer API实现图片懒加载,通过监听元素是否进入视口异步加载图片,性能好且代码简洁;对于旧浏览器可降级采用scroll事件配合getBoundingClientRect或offsetTop判断位置,并结合节流或防抖优化性能。

图片懒加载是一种优化网页性能的常用技术,能有效减少首屏加载时间、降低服务器压力。它通过延迟加载非首屏图片,只有当用户滚动到可视区域时才加载对应图片。以下是 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;
retu
rn 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改签选座策略与步骤
天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】
新手怎么开始学化妆 零基础化妆入门教程
小红书网页版入口链接分享 小红书官网直接进
汽水音乐在线版入口_汽水音乐网页播放手册
最新韩小圈网页版登录入口_官网在线观看官方链接


2025-11-05
浏览次数:次
返回列表
rn 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));