JavaScript实现图片懒加载(Lazyload)


Posted in Javascript onNovember 28, 2016

懒加载的意义(为什么要使用懒加载)

对页面加载速度影响最大的就是图片,一张普通的图片可以达到几M的大小,而代码也许就只有几十KB。当页面图片很多时,页面的加载速度缓慢,几S钟内页面没有加载完成,也许会失去很多的用户。

所以,对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载, 等到滚动到可视区域后再去加载。这样子对于页面加载性能上会有很大的提升,也提高了用户体验。

原理

将页面中的img标签src指向一张小图片或者src为空,然后定义data-src(这个属性可以自定义命名,我才用data-src)属性指向真实的图片。

<img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" />

当载入页面时,先把可视区域内的img标签的data-src属性值负给src,然后监听滚动事件,把用户即将看到的图片加载。这样便实现了懒加载。

代码

在写代码前,需要了解各种高度。先看这篇文章scrollTop,offsetTop,scrollLeft,offsetLeft

<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
img {
display: block;
margin-bottom: 50px;
width: 400px;
height: 400px;
}
</style>
</head>
<body>
<img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
<img src="" 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") == "") {
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") == "") {
var src = img.eq(i).attr("data-src");
img.eq(i).attr("src", src);
n = i + 1;
}
}
}
}
</script>

如果大家感觉此文介绍的不够详细,大家可以参考下这篇文章:

以上所述是小编给大家介绍的JavaScript实现图片懒加载(Lazyload),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript学习笔记(一) 在html中使用javascript
Jun 18 Javascript
浅谈checkbox的一些操作(实战经验)
Nov 20 Javascript
浅析Javascript的自动分号插入(ASI)机制
Sep 29 Javascript
bootstrap datetimepicker2.3.11时间插件使用
Nov 19 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
Dec 02 Javascript
JS对象是否拥有某属性如何判断
Feb 03 Javascript
Vue.js实现简单动态数据处理
Feb 13 Javascript
微信小程序五星评分效果实现代码
Apr 06 Javascript
d3.js实现立体柱图的方法详解
Apr 28 Javascript
jQuery实现frame之间互通的方法
Jun 26 jQuery
js HTML5 canvas绘制图片的方法
Sep 08 Javascript
react实现点击选中的li高亮的示例代码
May 24 Javascript
最常见的左侧分类菜单栏jQuery实现代码
Nov 28 #Javascript
JS实现页面跳转参数不丢失的方法
Nov 28 #Javascript
String字符串截取的四种方式总结
Nov 28 #Javascript
localStorage实现便签小程序
Nov 28 #Javascript
JavaScript实现邮箱地址自动匹配功能代码
Nov 28 #Javascript
Jquery循环截取字符串的方法(多出的字符串处理成&quot;...&quot;)
Nov 28 #Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
Nov 28 #Javascript
You might like
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
PHP时间戳与日期之间转换的实例介绍
2013/04/19 PHP
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
Yii2前后台分离及migrate使用(七)
2016/05/04 PHP
PHP生成word文档的三种实现方式
2016/11/14 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
javascript时间自动刷新实现原理与步骤
2013/01/06 Javascript
jquery等宽输出文字插件使用介绍
2013/09/18 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
2015/04/27 Javascript
AngularJS入门教程之ng-class 指令用法
2016/08/01 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
老生常谈jacascript DOM节点获取
2017/04/17 Javascript
JavaScript数据结构学习之数组、栈与队列
2017/05/02 Javascript
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
2018/09/12 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
2019/01/29 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
Python编写屏幕截图程序方法
2015/02/18 Python
初学Python函数的笔记整理
2015/04/07 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
Python TCP通信客户端服务端代码实例
2019/11/21 Python
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
药品促销活动方案
2014/02/14 职场文书
实验室标语
2014/06/21 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
初中语文教学随笔
2015/08/15 职场文书
爱国之歌(8首)
2019/09/29 职场文书
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js