目前,主要的购物网站都采用了这种加载方式。今天在
一个网友的站里发现
一个图片延迟加载的
插件,很好用,
在这里介绍一下。
先介绍一下
图片延迟加载原理。我们需要先将
图片的真实地址保存在
一个自定义的
属性中(
属性名任你发挥吧,这里我用的是lazy-src),而
图片的src
属性中用
一个占位
图片来替代,这个占位
图片当然是越小越好,它基本上只干活、不露面。
@H_
502_6@
<img src="images/placeholder.png" lazy-src="images/realimg.jpg" alt="" />
<!-- 如果浏览器禁用了js,我们也不能不让网页
显示图片撒,所以最好是
加上下面一句备用
代码 -->
<noscript><img src="images/realimg.jpg" alt="" /></noscript>
图片延迟加载
插件代码 (function( $ ){
$.fn.imglazyload = function( options ){
var o = $.extend({
attr : 'lazy-src',
container : window,
event : 'scroll',
fadeIn : false,
threshold : 0,
vertical : true
},options ),
event = o.event,
vertical = o.vertical,
container = $( o.container ),
threshold = o.threshold,
// 将jQuery对象转换成DOM数组便于操作
elems = $.makeArray( $(this) ),
d
ataname = 'imglazyload_offset',
OFFSET = vertical ? 'top' : 'left',
SCROLL = vertical ? 'scrollTop' : 'scrollLeft',
winSize = vertical ? container.height() : container.width(),
scrollCoord = container[ SCROLL ](),
docSize = winSize + scrollCoord;
// 延迟加载的触发器
var trigger = {
init : function( coord ){
return coord >= scrollCoord &&
coord <= ( docSize + threshold );
},
scroll : function( coord ){
var scrollCoord = container[ SCROLL ]();
return coord >= scrollCoord &&
coord <= ( winSize + scrollCoord + threshold );
},
resize : function( coord ){
var scrollCoord = container[ SCROLL ](),
winSize = vertical ?
container.height() :
container.width();
return coord >= scrollCoord &&
coord <= ( winSize + scrollCoord + threshold );
}
};
var loader = function( triggerElem,event ){
var i = 0,
isCustom = false,
isTrigger,coord,elem,$elem,lazySrc;
//
自定义事件只要触发即可,无需再判断
if( event ){
if( event !== 'scroll' && event !== 'resize' ){
isCustom = true;
}
}
else{
event = 'init';
}
for( ; i < elems.length; i++ ){
isTrigger = false;
elem = elems[i];
$elem = $( elem );
lazySrc = $elem.attr( o.attr );
if( !lazySrc || elem.src === lazySrc ){
continue;
}
// 先从缓存
获取offset值,缓存中没有才
获取计算值,
// 将计算值缓存,避免重复
获取引起的reflow
coord = $elem.data( d
ataname );
if( coord === undefined ){
coord = $elem.offset()[ OFFSET ];
$elem.data( d
ataname,coord );
}
isTrigger = isCustom || trigger[ event ]( coord );
if( isTrigger ){
// 加载
图片 elem.src = lazySrc;
if( o.fadeIn ){
$elem.hide().fadeIn();
}
// 移除缓存
$elem.removeData( d
ataname );
// 从DOM数组中移除该DOM
elems.splice( i--,1 );
}
}
// 所有的
图片加载完后卸载触发事件
if( !elems.length ){
if( triggerElem ){
triggerElem.unbind( event,fire );
}
else{
container.unbind( o.event,fire );
}
$( window ).unbind( 'resize',fire );
elems = null;
}
};
var fire = function( e ){
loader( $(this),e.type );
};
// 绑定事件
container = event === 'scroll' ? container : $( this );
container.bind( event,fire );
$( window ).bind( 'resize',fire );
// 初始化
loader();
return this;
};
})( jQuery );
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。