-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdataLazy.js
175 lines (154 loc) · 5.43 KB
/
dataLazy.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/**
* JS圖片延遲加載
* @constructor {DataLazyLoad}
* @param {options} 對象傳參
* @time 2014-1-10
*/
/*
* 延遲加載的原理:滾動時:待加載的資源相對於遊覽器頂端的距離 - threshold <= 可視區域相對於瀏覽器頂端的距離 true 就加載
* 否則的話 不加載
*/
function DataLazyLoad(options){
this.config = {
container : window, //容器 默認為window
threshold : 0, // 離多少像素渲染圖片
event : 'scroll', // 默認為scroll(滾動)
effect : 'fadeIn', // 默認為fadeIn 也可以為fadeIn, slideDown 等 jQuery 自帶的效果
effectspeed : 1000, // 時間
suffix : 'img', // img屬性 默認以data-img 也可以自定義後綴
skip_invisible : true // 如果img標籤為隱藏的 那麼不強制加載
};
this.cache = {};
this.init(options);
}
DataLazyLoad.prototype = {
init: function(options){
this.config = $.extend(this.config, options || {});
var self = this,
_config = self.config,
_cache = self.cache;
// 滾動時(或者其他事件) 觸發事件
$(_config.container).unbind(_config.event);
$(_config.container).bind(_config.event,function(){
self._update();
});
//進入到頁面用戶沒有拖動滾動條,在頁面可視區域的圖片應該顯示出來,不應該讓用戶滾動頁面才顯示。
self._update();
},
/*
* 加載對應的圖片
*/
_eachImg: function(item) {
var self = this,
_config = self.config,
_cache = self.cache;
if($(item).attr('isload') == 'false') {
var dataImg = $(item).attr('data-'+_config.suffix),
src = $(item).attr('src');
$(item).hide();
$(item).attr('src',dataImg);
$(item).attr('data-'+_config.suffix,'');
$(item)[_config.effect](_config.effectspeed);
$(item).attr('isload','true');
}
},
_update:function(){
var self = this,
_config = self.config,
_cache = self.cache;
if(_config.container === window) {
$('img').each(function(index,item){
// 如果圖片隱藏的 那麼不強制加載
if(_config.skip_invisible && !$('img').is(":visible")) {
return;
}
if (self._abovethetop(item) ||
self._leftofbegin(item)) {
// 什麼都不處理
} else if (self._belowthefold(item) &&
self._belowthefold(item)) {
self._eachImg(item);
}
})
}else {
$('img',$(_config.container)).each(function(index,item){
// 如果圖片隱藏的 那麼不強制加載
if(_config.skip_invisible && !$('img').is(":visible")) {
return;
}
if (self._abovethetop(item) ||
self._leftofbegin(item)) {
} else if (self._belowthefold(item) &&
self._rightoffold(item)) {
self._eachImg(item);
}
})
}
},
/*
* 往下滾動時 判斷待加載的元素是否在可視區域內
* @return {Boolean}
*/
_belowthefold: function(elem){
var self = this,
_config = self.config;
var fold;
if(_config.container === window) {
fold = $(window).height() + $(window).scrollTop();
}else {
fold = $(_config.container).offset().top + $(_config.container).height();
}
return fold >= $(elem).offset().top - _config.threshold;
},
/*
* 往右滾動時 判斷待加載的元素是否在可視區域內
* @return {Boolean}
*/
_rightoffold: function(elem){
var self = this,
_config = self.config;
var fold;
if(_config.container === window) {
fold = $(window).width() + $(window).scrollLeft();
}else {
fold = $(_config.container).offset().left + $(_config.container).width();
}
return fold >= $(elem).offset().left - _config.threshold;
},
/*
* 往上滾動
* @return {Boolean}
*/
_abovethetop: function(elem){
var self = this,
_config = self.config;
var fold;
if(_config.container === window) {
fold = $(window).scrollTop();
}else {
fold = $(_config.container).offset().top;
}
return fold >= $(elem).offset().top + _config.threshold + $(elem).height();
},
/*
* 往左滾動
* @return {Boolean}
*/
_leftofbegin: function(elem) {
var self = this,
_config = self.config;
var fold;
if (_config.container === window) {
fold = $(window).scrollLeft();
} else {
fold = $(_config.container).offset().left;
}
return fold >= $(elem).offset().left + _config.threshold + $(elem).width();
}
};
// 初始化的方式
$(function(){
var datalazy = new DataLazyLoad({
container: '#demo'
});
});