1
+ <!DOCTYPE html>
2
+ < html >
3
+ < head >
4
+ < meta name ="viewport " content ="width=device-width, initial-scale=1 ">
5
+
6
+ < link href ="../reset.css " rel ="stylesheet "/>
7
+ < link href ="./style.css " rel ="stylesheet "/>
8
+
9
+ < title > MixItUp Pagination Demo - Infinite Scroll</ title >
10
+
11
+ <!--
12
+ NB: This grid's responsive behavior has been limited to 2 or 4 columns for
13
+ simplicity, but could easily be combined with the responsive pagination demo
14
+ to load in a dynamic amount of items while scrolling, as per the current
15
+ column count.
16
+ -->
17
+ </ head >
18
+ < body >
19
+ < div class ="controls ">
20
+ < button type ="button " class ="control " data-filter ="all "> All</ button >
21
+ < button type ="button " class ="control " data-filter =".green "> Green</ button >
22
+ < button type ="button " class ="control " data-filter =".blue "> Blue</ button >
23
+ < button type ="button " class ="control " data-filter =".pink "> Pink</ button >
24
+ < button type ="button " class ="control " data-filter ="none "> None</ button >
25
+
26
+ < button type ="button " class ="control " data-sort ="default:asc "> Asc</ button >
27
+ < button type ="button " class ="control " data-sort ="default:desc "> Desc</ button >
28
+ </ div >
29
+
30
+ < div class ="container ">
31
+ < div class ="mix green "> </ div >
32
+ < div class ="mix green "> </ div >
33
+ < div class ="mix blue "> </ div >
34
+ < div class ="mix pink "> </ div >
35
+ < div class ="mix green "> </ div >
36
+ < div class ="mix blue "> </ div >
37
+ < div class ="mix pink "> </ div >
38
+ < div class ="mix blue "> </ div >
39
+ < div class ="mix green "> </ div >
40
+ < div class ="mix green "> </ div >
41
+ < div class ="mix blue "> </ div >
42
+ < div class ="mix pink "> </ div >
43
+ < div class ="mix green "> </ div >
44
+ < div class ="mix blue "> </ div >
45
+ < div class ="mix pink "> </ div >
46
+ < div class ="mix blue "> </ div >
47
+ < div class ="mix green "> </ div >
48
+ < div class ="mix green "> </ div >
49
+ < div class ="mix blue "> </ div >
50
+ < div class ="mix pink "> </ div >
51
+ < div class ="mix green "> </ div >
52
+ < div class ="mix blue "> </ div >
53
+ < div class ="mix pink "> </ div >
54
+ < div class ="mix blue "> </ div >
55
+ < div class ="mix blue "> </ div >
56
+ < div class ="mix pink "> </ div >
57
+ < div class ="mix green "> </ div >
58
+ < div class ="mix blue "> </ div >
59
+ < div class ="mix pink "> </ div >
60
+ < div class ="mix blue "> </ div >
61
+ < div class ="mix green "> </ div >
62
+ < div class ="mix green "> </ div >
63
+ < div class ="mix blue "> </ div >
64
+ < div class ="mix pink "> </ div >
65
+ < div class ="mix green "> </ div >
66
+ < div class ="mix blue "> </ div >
67
+ < div class ="mix pink "> </ div >
68
+ < div class ="mix blue "> </ div >
69
+ < div class ="mix blue "> </ div >
70
+ < div class ="mix pink "> </ div >
71
+ < div class ="mix green "> </ div >
72
+ < div class ="mix blue "> </ div >
73
+ < div class ="mix pink "> </ div >
74
+ < div class ="mix blue "> </ div >
75
+ < div class ="mix green "> </ div >
76
+ < div class ="mix green "> </ div >
77
+ < div class ="mix blue "> </ div >
78
+ < div class ="mix pink "> </ div >
79
+ < div class ="mix green "> </ div >
80
+ < div class ="mix blue "> </ div >
81
+ < div class ="mix pink "> </ div >
82
+ < div class ="mix blue "> </ div >
83
+
84
+ < div class ="gap "> </ div >
85
+ < div class ="gap "> </ div >
86
+ < div class ="gap "> </ div >
87
+ </ div >
88
+
89
+ < script src ="../mixitup.min.js "> </ script >
90
+ < script src ="../../dist/mixitup-pagination.js "> </ script >
91
+
92
+ < script >
93
+ var containerEl = document . querySelector ( '.container' ) ;
94
+ var loadMoreEl = document . querySelector ( '.load-more' ) ;
95
+ var currentLimit = 16 ;
96
+ var incrementAmount = 4 ;
97
+ var canLoadMore = true ;
98
+ var scrollThreshold = 50 ;
99
+
100
+ /**
101
+ * A generic throttle function to prevent UI thrashing
102
+ * on scroll.
103
+ *
104
+ * @param {function } fn
105
+ * @param {number } interval
106
+ * @return {function }
107
+ */
108
+
109
+ function throttle ( fn , interval ) {
110
+ var timeoutId = - 1 ;
111
+ var last = - 1 ;
112
+
113
+ return function ( ) {
114
+ var self = this ;
115
+ var args = arguments ;
116
+ var now = Date . now ( ) ;
117
+ var difference = last ? now - last : Infinity ;
118
+
119
+ var later = function ( ) {
120
+ last = now ;
121
+
122
+ fn . apply ( self , args ) ;
123
+ } ;
124
+
125
+ if ( ! last || difference >= interval ) {
126
+ later ( ) ;
127
+ } else {
128
+ clearTimeout ( timeoutId ) ;
129
+
130
+ timeoutId = setTimeout ( later , interval - difference ) ;
131
+ }
132
+ } ;
133
+ }
134
+
135
+ /**
136
+ * Checks if we are within the scroll threshold on each
137
+ * scroll event, and if so, increments the page limit.
138
+ *
139
+ * @return {void }
140
+ */
141
+
142
+ function handleScroll ( ) {
143
+ if ( mixer . isMixing ( ) || ! canLoadMore ) return ;
144
+
145
+ var scrollTop = window . scrollY || window . pageYOffset || document . documentElement . scrollTop ;
146
+ var offset = scrollTop + window . innerHeight ;
147
+ var containerHeight = containerEl . offsetHeight ;
148
+
149
+ if ( offset >= containerHeight - scrollThreshold ) {
150
+ incrementPageLimit ( ) ;
151
+ }
152
+ }
153
+
154
+ /**
155
+ * Shows a set number of new targets at the bottom of
156
+ * the page by incrementing the page limit.
157
+ *
158
+ * @return {void }
159
+ */
160
+
161
+ function incrementPageLimit ( ) {
162
+ currentLimit += incrementAmount ;
163
+
164
+ mixer . paginate ( { limit : currentLimit } ) ;
165
+ }
166
+
167
+ /**
168
+ * Check whether the current matching collection of target
169
+ * elements has additional hidden elements, and set the
170
+ * `canLoadMore` flag accordingly.
171
+ *
172
+ * @param {mixitup.State } state
173
+ * @return {void }
174
+ */
175
+
176
+ function handleMixEnd ( state ) {
177
+ // At the end of each operation, we must check whether the current
178
+ // matching collection of target elements has additional hidden
179
+ // elements, and set the `canLoadMore` flag accordingly.
180
+
181
+ if ( state . activePagination . limit + incrementAmount >= state . totalMatching ) {
182
+ canLoadMore = false ;
183
+ } else {
184
+ canLoadMore = true ;
185
+ }
186
+
187
+ setTimeout ( handleScroll , 10 ) ;
188
+ }
189
+
190
+ // Instantiate mixitup
191
+
192
+ var mixer = mixitup ( containerEl , {
193
+ pagination : {
194
+ limit : currentLimit
195
+ } ,
196
+ callbacks : {
197
+ onMixEnd : handleMixEnd
198
+ }
199
+ } ) ;
200
+
201
+ // Attach a throttled scroll handler to the scroll event. Will fire
202
+ // up to a maximum of once every 50ms.
203
+
204
+ window . addEventListener ( 'scroll' , throttle ( handleScroll , 50 ) ) ;
205
+ </ script >
206
+ </ body >
207
+ </ html >
0 commit comments