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 相关文章推荐
基于jquery的web页面日期格式化插件
Nov 15 Javascript
使用jQuery实现的掷色子游戏动画效果
Mar 14 Javascript
JavaScript、jQuery与Ajax的关系
Jan 24 Javascript
全面了解构造函数继承关键apply call
Jul 26 Javascript
vue获取input输入值的问题解决办法
Oct 17 Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
Dec 01 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
Dec 16 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
Oct 26 jQuery
node.js中对Event Loop事件循环的理解与应用实例分析
Feb 14 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
Jun 05 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
Jul 21 Javascript
Element InputNumber 计数器的实现示例
Aug 03 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
地球防卫队:陪着奥特曼打小怪兽的人类力量 那些经典队服
2020/03/08 日漫
php操作JSON格式数据的实现代码
2011/12/24 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
PHP中exec与system用法区别分析
2014/09/22 PHP
php中的登陆login实例代码
2016/06/20 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
javascript使用activex控件的代码
2011/01/27 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
Javascript在IE和FireFox中的不同表现简析
2012/12/03 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
Jquery操作Ajax方法小结
2015/11/29 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
2017/03/10 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
vue中使用better-scroll实现滑动效果及注意事项
2018/11/15 Javascript
python实现进程间通信简单实例
2014/07/23 Python
Python实现将一个正整数分解质因数的方法分析
2017/12/14 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
使用Python编写Prometheus监控的方法
2018/10/15 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
Python模块_PyLibTiff读取tif文件的实例
2020/01/13 Python
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
美国在线家装零售商:Build.com
2016/09/02 全球购物
大学生青年志愿者活动总结
2015/05/06 职场文书
本科毕业论文致谢词
2015/05/14 职场文书
学校教学工作总结2015
2015/05/19 职场文书
党支部考察鉴定意见
2015/06/02 职场文书
沂蒙六姐妹观后感
2015/06/08 职场文书
redis实现共同好友的思路详解
2021/05/26 Redis
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL