ys_scroll.css
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
<code>.ys-scroll-wrapper{</code>
<code> </code><code>position</code><code>:</code><code>relative</code><code>;</code>
<code> </code><code>overflow</code><code>: </code><code>auto</code><code>;</code>
<code> </code><code>-webkit-overflow-scrolling: touch;</code>
<code>}</code>
<code>.ys-scroll-wrapper .ys-scroll-content{</code>
<code> </code><code>min-height</code><code>:</code><code>100%</code><code>;</code>
<code>/* loading-top */</code>
<code>.ys-scroll-wrapper .loading-</code><code>top</code> <code>{</code>
<code> </code><code>display</code><code>:</code><code>block</code><code>;</code>
<code> </code><code>width</code><code>:</code><code>100%</code><code>;</code>
<code> </code><code>height</code><code>:</code><code>40px</code><code>;</code>
<code> </code><code>line-height</code><code>: </code><code>40px</code><code>;</code>
<code> </code><code>text-align</code><code>: </code><code>center</code><code>;</code>
<code>/* loading-bottom */</code>
<code>.ys-scroll-wrapper .loading-</code><code>bottom</code> <code>{</code>
<code>.ys-scroll-wrapper .loading-end {</code>
<code> </code><code>display</code><code>:</code><code>none</code><code>;</code>
ys_scroll.js
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
<code>(</code><code>function</code><code>($){</code>
<code> </code><code>var</code> <code>defaultSettings = {</code>
<code> </code><code>hasArrivedEnd:</code><code>false</code><code>,</code><code>// 是否已經到底部</code>
<code> </code><code>pulldownCallback:</code><code>function</code><code>(){ </code><code>// 下拉回調</code>
<code> </code><code>console.log(</code><code>"pull down ... "</code><code>);</code>
<code> </code><code>},</code>
<code> </code><code>pullupCallback:</code><code>function</code><code>(){ </code><code>// 上拉回調</code>
<code> </code><code>console.log(</code><code>"pull up ... "</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>};</code>
<code> </code><code>function</code> <code>render(target,settings){</code>
<code> </code><code>var</code> <code>container = target;</code>
<code> </code><code>var</code> <code>childrenNode = $(container).children().remove();</code>
<code> </code><code>$(container).addClass(</code><code>"ys-scroll-wrapper"</code><code>);</code>
<code> </code><code>$(container).append(</code><code>"<div class='loading-top'>加載中...</div>"</code><code>);</code>
<code> </code><code>$(container).append(</code><code>"<div class='ys-scroll-content'></div>"</code><code>);</code>
<code> </code><code>$(container).append(</code><code>"<div class='loading-bottom'>加載更多...</div>"</code><code>);</code>
<code> </code><code>$(container).append(</code><code>"<div class='loading-end'>已經到底了</div>"</code><code>);</code>
<code> </code><code>$(container).find(</code><code>".ys-scroll-content"</code><code>).append(childrenNode);</code>
<code> </code><code>$(container).scrollTop(LOADING_BAR_HEIGHT);</code>
<code> </code><code>$(container).data(</code><code>"settings"</code><code>,settings);</code>
<code> </code><code>return</code> <code>container;</code>
<code> </code><code>}</code>
<code> </code><code>function</code> <code>bindEventHandlers(target,container,settings){</code>
<code> </code><code>var</code> <code>loadingTopRevertTimeout = </code><code>null</code><code>;</code>
<code> </code><code>var</code> <code>loadingTopEndTimeout = </code><code>null</code><code>;</code>
<code> </code><code>var</code> <code>loadingBottomRevertTimeout = </code><code>null</code><code>;</code>
<code> </code><code>var</code> <code>loadingBottomTimeout = </code><code>null</code><code>;</code>
<code> </code><code>var</code> <code>pulldownCallback = settings.pulldownCallback;</code>
<code> </code><code>var</code> <code>pullupCallback = settings.pullupCallback;</code>
<code> </code><code>function</code> <code>clearTimeouts(){</code>
<code> </code><code>clearTimeout(loadingTopRevertTimeout);</code>
<code> </code><code>clearTimeout(loadingTopEndTimeout);</code>
<code> </code><code>clearTimeout(loadingBottomRevertTimeout);</code>
<code> </code><code>clearTimeout(loadingBottomTimeout);</code>
<code> </code><code>function</code> <code>scrollHandler(){</code>
<code> </code><code>clearTimeouts();</code>
<code> </code><code>var</code> <code>loadingTop = </code><code>false</code><code>;</code>
<code> </code><code>if</code><code>(arriveLoadingTopStart(container)){</code>
<code> </code><code>loadingTopRevertTimeout = setTimeout(</code><code>function</code><code>(){</code>
<code> </code><code>loadingTopRevert(container);</code>
<code> </code><code>},RESPONSE_DELAY);</code>
<code> </code><code>loadingTop = </code><code>true</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>if</code><code>(arriveLoadingTopEnd(container)){</code>
<code> </code><code>clearTimeouts();</code>
<code> </code><code>loadingTopEndTimeout = setTimeout(</code><code>function</code><code>(){</code>
<code> </code><code>resetLoading(container);</code>
<code> </code><code>pulldownCallback();</code>
<code> </code><code>var</code> <code>hasArrivedEnd = $(container).data(</code><code>"settings"</code><code>).hasArrivedEnd;</code>
<code> </code><code>if</code><code>(hasArrivedEnd||loadingTop){ </code><code>// 如果已經到底了不需要額外操作</code>
<code> </code><code>return</code><code>;</code>
<code> </code><code>if</code><code>(arriveLoadingBottomStart(container)){</code>
<code> </code><code>loadingBottomRevertTimeout = setTimeout(</code><code>function</code><code>(){</code>
<code> </code><code>loadingBottomRevert(container);</code>
<code> </code><code>if</code><code>(arriveLoadingBottomEnd(container)){</code>
<code> </code><code>loadingBottomTimeout = setTimeout(</code><code>function</code><code>(){</code>
<code> </code><code>pullupCallback();</code>
<code> </code><code>},RESPONSE_DELAY)</code>
<code> </code><code>var</code> <code>hasPressed = </code><code>false</code><code>;</code>
<code> </code><code>$(container).on(</code><code>"touchstart"</code><code>,</code><code>function</code><code>(event){</code>
<code> </code><code>hasPressed = </code><code>true</code><code>;</code>
<code> </code><code>stopAnimation(container);</code>
<code> </code><code>});</code>
<code> </code><code>$(container).on(</code><code>"touchmove"</code><code>,</code><code>function</code><code>(event){</code>
<code> </code><code>var</code> <code>clientX = event.originalEvent.changedTouches[0].clientX;</code>
<code> </code><code>var</code> <code>clientY = event.originalEvent.changedTouches[0].clientY;</code>
<code> </code><code>if</code><code>(clientY<0||clientX<0){</code>
<code> </code><code>scrollHandler();</code>
<code> </code><code>$(container).on(</code><code>"touchend touchcancel"</code><code>,</code><code>function</code><code>(event){</code>
<code> </code><code>scrollHandler();</code>
<code> </code><code>hasPressed = </code><code>false</code><code>;</code>
<code> </code><code>$(container).scroll(</code><code>function</code><code>(){</code>
<code> </code><code>if</code><code>(hasPressed||reverting){</code>
<code> </code><code>var</code> <code>RESPONSE_DELAY = 800; </code><code>// 觸發延遲</code>
<code> </code><code>var</code> <code>ANIMATION_DURATION = 300; </code><code>// 動畫持續時間</code>
<code> </code><code>var</code> <code>LOADING_BAR_HEIGHT = 40; </code><code>// loading bar 高度</code>
<code> </code><code>var</code> <code>reverting = </code><code>false</code><code>; </code><code>// 動畫正在恢複</code>
<code> </code><code>function</code> <code>stopAnimation(container){</code>
<code> </code><code>$(container).stop(</code><code>true</code><code>);</code>
<code> </code><code>reverting = </code><code>false</code><code>;</code>
<code> </code><code>function</code> <code>loadingTopRevert(container){</code>
<code> </code><code>reverting = </code><code>true</code><code>;</code>
<code> </code><code>$(container).animate({</code>
<code> </code><code>"scrollTop"</code><code>:LOADING_BAR_HEIGHT+</code><code>"px"</code>
<code> </code><code>},ANIMATION_DURATION,</code><code>function</code><code>(){</code>
<code> </code><code>reverting = </code><code>false</code><code>;</code>
<code> </code><code>/* 判斷達到 Loading-top開始處 */</code>
<code> </code><code>function</code> <code>arriveLoadingTopStart(container){</code>
<code> </code><code>var</code> <code>scrollTop = $(container).scrollTop();</code>
<code> </code><code>if</code><code>(scrollTop<LOADING_BAR_HEIGHT){</code>
<code> </code><code>return</code> <code>true</code><code>;</code>
<code> </code><code>return</code> <code>false</code><code>;</code>
<code> </code><code>/* 判斷達到 Loading-top結束處 */</code>
<code> </code><code>function</code> <code>arriveLoadingTopEnd(container){</code>
<code> </code><code>if</code> <code>(scrollTop<1) {</code>
<code> </code><code>function</code> <code>loadingBottomRevert(container){</code>
<code> </code><code>var</code> <code>clientHeight = $(container).height();</code>
<code> </code><code>var</code> <code>scrollTop = $(container)[0].scrollHeight-LOADING_BAR_HEIGHT-clientHeight;</code>
<code> </code><code>"scrollTop"</code><code>:scrollTop+</code><code>"px"</code>
<code> </code><code>/* 判斷到達 Loading Bottom 開始處 */</code>
<code> </code><code>function</code> <code>arriveLoadingBottomStart(container){</code>
<code> </code><code>var</code> <code>scrollHeight = $(container)[0].scrollHeight;</code>
<code> </code><code>if</code> <code>(scrollTop + clientHeight+LOADING_BAR_HEIGHT>= scrollHeight) {</code>
<code> </code><code>/* 判斷到達 Loading Bottom 結束處 */</code>
<code> </code><code>function</code> <code>arriveLoadingBottomEnd(container){</code>
<code> </code><code>if</code> <code>(scrollTop + clientHeight+1> scrollHeight) {</code>
<code> </code><code>/* 重設 loading */</code>
<code> </code><code>function</code> <code>resetLoading(container){</code>
<code> </code><code>$(container).data(</code><code>"settings"</code><code>).hasArrivedEnd=</code><code>false</code><code>;</code>
<code> </code><code>$(container).find(</code><code>".loading-bottom"</code><code>).show();</code>
<code> </code><code>$(container).find(</code><code>".loading-end"</code><code>).hide();</code>
<code> </code><code>/* 設定loading end */</code>
<code> </code><code>function</code> <code>setLoadingEnd(container){</code>
<code> </code><code>$(container).data(</code><code>"settings"</code><code>).hasArrivedEnd=</code><code>true</code><code>;</code>
<code> </code><code>$(container).find(</code><code>".loading-bottom"</code><code>).hide();</code>
<code> </code><code>$(container).find(</code><code>".loading-end"</code><code>).show();</code>
<code> </code><code>var</code> <code>options = {</code>
<code> </code><code>ysScroll:</code><code>function</code><code>(settings) {</code>
<code> </code><code>var</code> <code>mergedSettings = {};</code>
<code> </code><code>$.extend(mergedSettings,defaultSettings,settings);</code>
<code> </code><code>$(</code><code>this</code><code>).each(</code><code>function</code><code>(){</code>
<code> </code><code>var</code> <code>container = render(</code><code>this</code><code>,settings);</code>
<code> </code><code>$(container).data(</code><code>"settings"</code><code>,settings);</code>
<code> </code><code>bindEventHandlers(</code><code>this</code><code>,container,mergedSettings);</code>
<code> </code><code>});</code>
<code> </code><code>ysScrollRefresh:</code><code>function</code><code>(){</code>
<code> </code><code>if</code><code>(arriveLoadingTopStart(</code><code>this</code><code>)){</code>
<code> </code><code>loadingTopRevert(</code><code>this</code><code>);</code>
<code> </code><code>if</code><code>(arriveLoadingBottomStart(</code><code>this</code><code>)){</code>
<code> </code><code>loadingBottomRevert(</code><code>this</code><code>);</code>
<code> </code><code>ysScrollLoadEnd:</code><code>function</code><code>(){</code>
<code> </code><code>setLoadingEnd(</code><code>this</code><code>);</code>
<code> </code><code>$.fn.extend(options);</code>
<code>})(jQuery);</code>
測試頁面 scroll.html
<code><!DOCTYPE html></code>
<code><!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]--></code>
<code><!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]--></code>
<code><!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]--></code>
<code><!--[if gt IE 8]><!--></code> <code><</code><code>html</code> <code>class</code><code>=</code><code>"no-js"</code><code>> </code><code><!--<![endif]--></code>
<code><</code><code>head</code><code>></code>
<code> </code><code><</code><code>meta</code> <code>charset</code><code>=</code><code>"utf-8"</code><code>></code>
<code> </code><code><</code><code>meta</code> <code>http-equiv</code><code>=</code><code>"X-UA-Compatible"</code> <code>content</code><code>=</code><code>"IE=edge,chrome=1"</code><code>></code>
<code> </code><code><</code><code>title</code><code>></</code><code>title</code><code>></code>
<code> </code><code><</code><code>meta</code> <code>name</code><code>=</code><code>"description"</code> <code>content</code><code>=</code><code>""</code><code>></code>
<code> </code><code><</code><code>meta</code> <code>name</code><code>=</code><code>"viewport"</code> <code>content</code><code>=</code><code>"width=device-width, initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"</code><code>></code>
<code> </code><code><</code><code>meta</code> <code>name</code><code>=</code><code>"format-detection"</code> <code>content</code><code>=</code><code>"telephone=no"</code><code>></code>
<code> </code><code><</code><code>link</code> <code>href</code><code>=</code><code>"css/common/ys_scroll.css"</code> <code>rel</code><code>=</code><code>"stylesheet"</code><code>></code>
<code> </code><code><</code><code>style</code><code>></code>
<code> </code><code>html,body,.container{</code>
<code> </code><code>height:100%;</code>
<code> </code><code>margin:0;</code>
<code> </code><code>padding:0;</code>
<code> </code><code></</code><code>style</code><code>></code>
<code></</code><code>head</code><code>></code>
<code><</code><code>body</code><code>></code>
<code><</code><code>div</code> <code>class</code><code>=</code><code>"container"</code><code>></code>
<code> </code><code><</code><code>ul</code><code>></code>
<code> </code><code><</code><code>li</code><code>>這是測試資料...</</code><code>li</code><code>></code>
<code> </code><code></</code><code>ul</code><code>></code>
<code></</code><code>div</code><code>></code>
<code><</code><code>script</code> <code>src</code><code>=</code><code>"dist/js/jquery-1.11.3.min.js"</code><code>></</code><code>script</code><code>></code>
<code><</code><code>script</code> <code>src</code><code>=</code><code>"js/common/ys_scroll.js"</code><code>></</code><code>script</code><code>></code>
<code><</code><code>script</code><code>></code>
<code> </code><code>var dataHtml = $(".container ul").html();</code>
<code> </code><code>$(".container ").ysScroll({</code>
<code> </code><code>pulldownCallback:function(){ // 下拉回調</code>
<code> </code><code>console.log("pull down ... ");</code>
<code> </code><code>$(".container ul").html(dataHtml);</code>
<code> </code><code>$(".container ").ysScrollRefresh();</code>
<code> </code><code>pullupCallback:function(){ // 上拉回調</code>
<code> </code><code>console.log("pull up ... ");</code>
<code> </code><code>$(".container ul").append(dataHtml);</code>
<code> </code><code>});</code>
<code></</code><code>script</code><code>></code>
<code></</code><code>body</code><code>></code>
<code></</code><code>html</code><code>></code>
注:容器使用前要給其設定一個固定的高度。當觸發pulldownCallback,pullupCallback回調後一定要使用$(".container").ysScrollRefresh();重置容器。
本文轉自 antlove 51CTO部落格,原文連結:http://blog.51cto.com/antlove/1844427