自己写的一个lazyload图片懒加载插件
2026-04-28 06:31:02
292
分类:js插件
目前用的最多的图片懒加载插件应该是这个吧:jquery.lazyload,地址:http://plugins.jquery.com/lazyload/。不过我发现当ajax动态加载的时候需要重复实例化,当加载内容越来越多时内存消耗过大。
所以我自己写了个lazyload,解决ajax动态加载的情况的问题。
/*
* 作者:黄飞
* 时间:2017.10.14
* 说明:实现了基本的懒加载功能,向上向下滑动懒加载,单例模式避免重复实例化,封装了内部函数。
* 使用方法:
* 页面:<img class="lazyload" src="loading.gif" data-original="img.jpg">
* 实例化:new Lzyload();重新绑定:new Lzyload();
* ps:写得比较简单,只能适应于对应的环境
*/
(function ($, window) {
"use strict";
var Lazyload = function (options) {
//默认参数
var defaults = {
container: window, //触发事件载体
event: "scroll", //触发方式
data_attribute: "original", //懒加载图片原图片地址
element: "lazyload", //懒加载元素类名
effect: "fadeIn", //显示效果
threshold: 20, //提前加载距离
};
this.settings = $.extend({}, defaults, options);
this.$element = $("." + this.settings.element);
this.$window = $(window);
this.winHeight = window.innerHeight;
this.init();
this.bindEvent();
};
Lazyload.prototype = {
constructor: Lazyload,
//初始化(让已经在视野中的图片显示)
init: function () {
var me = this;
me.$element.each(function () {
var $self = $(this);
me.inView($self);
});
},
//绑定事件
bindEvent: function () {
var me = this;
//触发懒加载事件
$(me.settings.container).bind(me.settings.event, function () {
me.$element.each(function () {
var $self = $(this);
me.inView($self);
});
});
//窗口变化
$(window).resize(function () {
me.winHeight = window.innerHeight;
});
},
//在视野中
inView: function ($ele) {
var me = this;
var $self = $ele;
if (!$self.hasClass(me.settings.element)) return;
if ($self.offset().top - me.$window.scrollTop() < me.winHeight + me.settings.threshold && me.$window.scrollTop() - me.settings.threshold < $self.offset().top + $self.height()) {
me.load($self);
}
},
//加载图片
load: function ($ele) {
var me = this;
var $self = $ele;
$self.hide();
$self.attr("src", $self.attr("data-" + me.settings.data_attribute));
$self[me.settings.effect]();
$self.removeClass(me.settings.element);
},
//更新(解决了ajax加载新图片问题),可以在这里重新设置参数
updateEle: function (element) {
this.settings.element = element || this.settings.element;
this.$element = $("." + this.settings.element);
this.init();
}
}
//单例模式
var lazyload = (function (options) {
var lazy;
return function () {
if (!lazy) {
lazy = new Lazyload(options);
}
else {
lazy.updateEle();
}
}
})();
window.lazyload = lazyload;
})(jQuery, window);