JS实现图片懒加载(lazyload)过程详解
本文详解JS图片懒加载原理,通过延迟加载可视区域外的图片提升页面性能。提供原生JS与jQuery两种实现方式,并深入解析如何利用节流和去抖函数优化滚动事件,避免高频触发导致的性能问题。
懒加载的意义与原理
针对包含大量图片的网页,采用懒加载技术能显著提升页面加载速度,从而改善用户的浏览体验。
懒加载的意义(为什么要使用懒加载)
图片是影响页面加载速度的主要因素,普通图片体积可达几MB,而代码通常仅几十KB。当页面图片过多时,加载时间可能长达数秒,导致用户流失。
因此,对于图片密集的页面,为了加速加载,通常策略是暂不加载未出现在可视区域的图片,待用户滚动至可视区域时再进行加载。这能大幅提升页面性能并优化用户体验。
原理
将页面中img标签的src属性指向一张小尺寸图片或设为空,同时定义data-src属性(可自定义命名,此处采用data-src)指向真实图片地址。src需指向默认图片,否则src为空时会向服务器发送无效请求,可指向loading占位图。
注:图片需指定宽高
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" />
页面载入时,先将可视区域内img标签的data-src属性值赋给src,随后监听滚动事件,加载用户即将看到的图片,从而实现懒加载效果。
懒加载代码实现与性能优化
代码
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
img {
display: block;
margin-bottom: 50px;
width: 400px;
height: 400px;
}
</style>
</head>
<body>
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="default.jpg" data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt="">
<img src="default.jpg" data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt="">
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="default.jpg" data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt="">
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
</body>
JavaScript
<script>
var num = document.getElementsByTagName('img').length;
var img = document.getElementsByTagName("img");
var n = 0; //存储图片加载到的位置,避免每次都从第一张图片开始遍历
lazyload(); //页面载入完毕加载可是区域内的图片
window.onscroll = lazyload;
function lazyload() { //监听页面滚动事件
var seeHeight = document.documentElement.clientHeight; //可见区域高度
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //滚动条距离顶部高度
for (var i = n; i < num; i++) {
if (img[i].offsetTop < seeHeight + scrollTop) {
if (img[i].getAttribute("src") == "default.jpg") {
img[i].src = img[i].getAttribute("data-src");
}
n = i + 1;
}
}
}
</script>
jQuery
<script>
var n = 0,
imgNum = $("img").length,
img = $('img');
lazyload();
$(window).scroll(lazyload);
function lazyload(event) {
for (var i = n; i < imgNum; i++) {
if (img.eq(i).offset().top < parseInt($(window).height()) + parseInt($(window).scrollTop())) {
if (img.eq(i).attr("src") == "default.jpg") {
var src = img.eq(i).attr("data-src");
img.eq(i).attr("src", src);
n = i + 1;
}
}
}
}
</script>
使用节流函数进行性能优化
若直接将函数绑定在scroll事件上,页面滚动时函数会被高频触发,严重影响浏览器性能。
为实现限制触发频率以优化性能,需引入特定处理机制。
节流函数:仅允许一个函数在N秒内执行一次。以下是一个简单的节流函数实现:
// 简单的节流函数
//fun 要执行的函数
//delay 延迟
//time 在time时间内必须执行一次
function throttle (fun, delay, time) {
let timeout
let startTime = new Date()
return function () {
let context = this
let args = Array.prototype.slice.call(arguments)
let curTime = new Date()
clearTimeout(timeout)
if (curTime - startTime >= time) {
// 如果达到了规定的触发时间间隔,触发 handler
fun.apply(context, args)
startTime = curTime
} else {
// 没达到触发间隔,重新设定定时器
timeout = setTimeout(function () {
fun.apply(context, args)
}, delay)
}
}
};
// 实际想绑定在 scroll 事件上的 handler
function lazyload(event) {}
// 采用了节流函数
window.addEventListener('scroll',throttle(lazyload,500,1000));
使用去抖函数进行性能优化
去抖相比节流稍简单,它让函数延迟执行,而节流比去抖多了一个在一定时间内必须执行一次的保证。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
为什么JS调用reload后页面没有立即更新
2026-11-05 13:38:29
crypto-js 加密结果与 Java/Python 后端不一致怎么解决
2026-11-05 12:09:48
js文件缓存导致代码不更新怎么强制刷新
2026-11-04 22:30:24
JS逆向调试技巧:编写Hook脚本监控加密函数输入输出
2026-11-04 10:42:46
Babylon.js 性能优化技巧:实例化网格与遮挡剔除
2026-11-03 23:43:22








