前端图片懒加载实现:原生JS与主流插件方案解析
针对首屏图片过多导致的渲染缓慢与带宽浪费问题,本文详解图片懒加载技术。通过替换src属性为data-xx,仅在可视区域时加载,有效提升页面性能。文中对比了原生JS实现原理,并深入分析了jQuery Lazyload与轻量级Echo.js两种主流插件的配置方法与适用场景,帮助开发者根据项目需求选择最优方案。
图片懒加载原理与必要性
在实际项目开发中,常遇到页面包含大量图片的情况,而首屏可视范围内的图片通常仅有一两张。若一次性加载所有图片,不仅会显著拖慢页面渲染速度,还会造成不必要的带宽消耗。因此,采用图片懒加载技术,即仅当图片进入可视区域时才进行加载,成为提升首屏性能的关键手段。
核心思路如下:
将页面中所有<img>标签的src属性替换为自定义属性(如data-xx)。当页面滚动至该图片进入可视区域时,通过JavaScript获取该自定义属性中的图片地址,并将其赋值给src属性,从而触发图片加载。
在实现过程中,需明确以下关键尺寸与位置属性:
- 页可见区域宽:document.body.clientWidth;
- 网页可见区域高:document.body.clientHeight;
- 网页可见区域宽(含边线):document.body.offsetWidth;
- 网页可见区域高(含边线):document.body.offsetHeight;
- 网页正文全文宽:document.body.scrollWidth;
- 网页正文全文高:document.body.scrollHeight;
- 网页被卷去的高:document.body.scrollTop;
- 网页被卷去的左:document.body.scrollLeft;
- 网页正文部分上:window.screenTop;
- 网页正文部分左:window.screenLeft;
- 屏幕分辨率的高:window.screen.height;
- 屏幕分辨率的宽:window.screen.width;
- 屏幕可用工作区高度:window.screen.availHeight;
主流插件实现方案
以下是具体的实现示例:
方案一:jQuery Lazyload方式
插件下载地址:https://github.com/helijun/helijun/blob/master/plugin/lazyLoad/jquery.lazyload.js
<section class="module-section" id="container">
<img class="lazy-load" data-original="../static/img/loveLetter/teacher/teacher1.jpg" width="640" height="480" alt="测试懒加载图片"/>
</section>
require.config({
baseUrl : "/static",
paths: {
jquery:'component/jquery/jquery-3.1.0.min'
jqueryLazyload: 'component/lazyLoad/jquery.lazyload',//图片懒加载
},
shim: {
jqueryLazyload: {
deps: ['jquery'],
exports: '$'
}
}
});
require(
[
'jquery',
'jqueryLazyload'
],
function($){
$(document).ready(function() {
$("img.lazy-load").lazyload({
effect : "fadeIn", //渐现,show(直接显示),fadeIn(淡入),slideDown(下拉)
threshold : 180, //预加载,在图片距离屏幕180px时提前载入
event: 'click', // 事件触发时才加载,click(点击),mouseover(鼠标划过),sporty(运动的),默认为scroll(滑动)
container: $("#container"), // 指定对某容器中的图片实现效果
failure_limit:2 //加载2张可见区域外的图片,lazyload默认在找到第一张不在可见区域里的图片时则不再继续加载,但当HTML容器混乱的时候可能出现可见区域内图片并没加载出来的情况
});
});
});
为提升代码可读性,属性值均添加了详细注释。需注意,预制图片属性应使用data-original,且建议预先设置图片的高宽占位,以避免布局抖动。示例中固定为640x480,若为响应式页面,高宽需动态计算。
方案二:Echo.js方式
此前在“前端知识的一些总结”博文中曾介绍过一款简单实用的轻量级图片延时加载插件echo.js。若项目未依赖jQuery,此方案是理想选择,其代码仅50行,压缩后大小约1k。开发者可直接将其集成至项目中。
插件下载地址:https://github.com/helijun/helijun/tree/master/plugin/echo
<style>
.demo img {
width: 736px;
height: 490px;
background: url(images/loading.gif) 50% no-repeat;}
</style>
<div class="demo">
<img class="lazy" src="images/blank.gif" data-echo="images/big-1.jpg">
</div>
<script src="js/echo.min.js"></script>
<script>
Echo.init({
offset: 0,//离可视区域多少像素的图片可以被加载
throttle: 0 //图片延时多少毫秒加载
});
</script>
说明:blank.gif为插件内置的背景占位图。图片必须设定宽高,也可通过外部CSS统一控制多张图片的大小。data-echo属性指向真实图片地址。
方案对比与优化建议
总结:
两种方案实现思路一致,均较为简单,区别在于jQuery Lazyload提供了更多配置属性。实际上,常用的echo.js已足够满足需求,且可轻松集成至项目公共JS中。图片懒加载是常见且实用的功能,若项目仍采用一次性全量加载,建议花费20分钟进行优化。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
为什么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








