懒加载的意义(为什么要使用懒加载)
对页面加载速度影响最大的就是图片,一张普通的图片可以达到几M的大小,而代码也许就只有几十KB。当页面图片很多时,页面的加载速度缓慢,几S钟内页面没有加载完成,也许会失去很多的用户。
所以,对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载, 等到滚动到可视区域后再去加载。这样子对于页面加载性能上会有很大的提升,也提高了用户体验。
原理
将页面中的img标签src指向一张小图片或者src为空,然后定义data-src(这个属性可以自定义命名,我才用data-src)属性指向真实的图片。src指向一张默认的图片,否则当src为空时也会向服务器发送一次请求。可以指向loading的地址。
当载入页面时,先把可视区域内的img标签的data-src属性值负给src,然后监听滚动事件,把用户即将看到的图片加载。这样便实现了懒加载。
懒加载的使用
1.引用< script src="http://a.tbcdn.cn/apps/baron/js/??lib/tmm/tmm.js,lib/lazyload/lazyload.js?20121015"></script>
2.对于要懒加载的图片进行如下属性设置。< img src="http://a.tbcdn.cn/mw/webapp/fav/img/grey.gif" dataimg="http://img03.taobaocdn.com/tps/i3/T1xl4_FlFaXXcLmU_5-305-317.png" />
其中src为未加载时的图片,dataimg为实际要加载的图片。
3.执行lazyload.init();
4.分tab的懒加载。判断tab把下面的图片有没加载过。根据loaded属性判断,还要对非当前tab所属的图片进行class lazy去掉。对已加载的loaded为true的图片,不加lazy属性
5.注意lazyload.init()的执行时机,如果在dom ready阶段执行,会下载所有图片,不能实现懒加载。要在winow.onload完成这个阶段去执行。
代码实例
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>懒加载实例</title>
<style type="text/css">
/*一定要有预先高度*/
img{
width: 600px;
height: 260px;
}
</style>
</head>
<body>
<div>
![](http://upload-images.jianshu.io/upload_images/6857128-38e3ae1aa6324e92.gif?imageMogr2/auto-orient/strip)
</div>
<div>
![](http://upload-images.jianshu.io/upload_images/6857128-38e3ae1aa6324e92.gif?imageMogr2/auto-orient/strip)
</div>
<div>
![](http://upload-images.jianshu.io/upload_images/6857128-38e3ae1aa6324e92.gif?imageMogr2/auto-orient/strip)
</div>
<div>
![](http://upload-images.jianshu.io/upload_images/6857128-38e3ae1aa6324e92.gif?imageMogr2/auto-orient/strip)
</div>
<div>
![](http://upload-images.jianshu.io/upload_images/6857128-38e3ae1aa6324e92.gif?imageMogr2/auto-orient/strip)
</div>
<div>
![](http://upload-images.jianshu.io/upload_images/6857128-38e3ae1aa6324e92.gif?imageMogr2/auto-orient/strip)
</div>
<div>
![](http://upload-images.jianshu.io/upload_images/6857128-38e3ae1aa6324e92.gif?imageMogr2/auto-orient/strip)
</div>
<div>
![](http://upload-images.jianshu.io/upload_images/6857128-38e3ae1aa6324e92.gif?imageMogr2/auto-orient/strip)
</div>
</body>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
var lazyload = {
init : function(opt){
var that = this,
op = {
anim: true,
extend_height:0,
selectorName:"img",
realSrcAtr:"dataimg"
};
// 合并对象,已有的{anim:true}+用户自定义对象。也就是op = op + opt
$.extend(op,opt);
// 调用lazyload.img.init(op)函数
that.img.init(op);
},
img : {
init : function(n){
var that = this,
selectorName = n.selectorName,
realSrcAtr = n.realSrcAtr,
anim = n.anim;
// console.log(n);
// 要加载的图片是不是在指定窗口内
function inViewport( el ) {
// 当前窗口的顶部
var top = window.pageYOffset,
// 当前窗口的底部
btm = window.pageYOffset + window.innerHeight,
// 元素所在整体页面内的y轴位置
elTop = $(el).offset().top;
// 判断元素,是否在当前窗口,或者当前窗口延伸400像素内
return elTop >= top && elTop - n.extend_height <= btm;
}
// 滚动事件里判断,加载图片
$(window).on('scroll', function() {
$(selectorName).each(function(index,node) {
var $this = $(this);
if(!$this.attr(realSrcAtr) || !inViewport(this)){
return;
}
act($this);
})
}).trigger('scroll');
// 展示图片
function act(_self){
// 已经加载过了,则中断后续代码
if (_self.attr('lazyImgLoaded')) return;
var img = new Image(),
original = _self.attr('dataimg');
// 图片请求完成后的事件,把dataimg指定的图片,放到src里面,浏览器显示
img.onload = function() {
_self.attr('src', original);
anim && _self.css({ opacity: .2 }).animate({ opacity: 1 }, 280);
};
// 当你设置img.src的时候,浏览器就在发送图片请求了
original && (img.src = original);
_self.attr('lazyImgLoaded', true);
}
}
}
};
/*
* selectorName,要懒加载的选择器名称
* extend_height 扩展高度
* anim 是否开启动画
* realSrcAtr 图片真正地址*/
lazyload.init({
anim:false,
selectorName:".samLazyImg"
});
</script>
</html>