|
19 | 19 | */ |
20 | 20 | var _elements = []; |
21 | 21 |
|
22 | | - /** |
| 22 | + /** |
23 | 23 | * EventListener |
24 | 24 | */ |
25 | 25 | var _events = []; |
26 | 26 |
|
| 27 | + // scroll positions to calc the delta variable in _position function |
| 28 | + var _scrollTop = null; |
| 29 | + var _scrollLeft = null; |
| 30 | + |
27 | 31 | /** |
28 | 32 | * options |
29 | 33 | */ |
|
125 | 129 | } |
126 | 130 | }; |
127 | 131 |
|
| 132 | + function _between (n, pos, delta) { |
| 133 | + if (delta > 0) { |
| 134 | + if (pos < n && n < (pos + delta)) { |
| 135 | + return true; |
| 136 | + } |
| 137 | + } else { |
| 138 | + if (pos > n && n > (pos + delta)) { |
| 139 | + return true; |
| 140 | + } |
| 141 | + } |
| 142 | + |
| 143 | + return false; |
| 144 | + }; |
| 145 | + |
128 | 146 | /** |
129 | 147 | * Check a single element position and return the correct event name |
130 | 148 | * |
|
149 | 167 | // to get the width of viewport WITHOUT scrollbar |
150 | 168 | var width = document.body.clientWidth || document.documentElement.clientWidth; |
151 | 169 |
|
| 170 | + var topDelta = document.body.scrollTop - _scrollTop; |
| 171 | + var leftDelta = document.body.scrollLeft - _scrollLeft; |
| 172 | + |
152 | 173 | // check `in` event |
153 | 174 | if (elementEvents.indexOf('in') > -1) { |
154 | 175 | if (top >= 0 && left >= 0 && bottom <= height && right <= width) { |
|
172 | 193 |
|
173 | 194 | // check `top` event |
174 | 195 | if (elementEvents.indexOf('top') > -1) { |
175 | | - if (top == 0) { |
| 196 | + if (top == 0 || _between(0, top, topDelta)) { |
176 | 197 | trigger = trigger && true; |
177 | 198 | } else { |
178 | 199 | trigger = false; |
|
181 | 202 |
|
182 | 203 | // check `left` event |
183 | 204 | if (elementEvents.indexOf('left') > -1) { |
184 | | - if (left == 0) { |
| 205 | + if (left == 0 || _between(0, left, leftDelta)) { |
185 | 206 | trigger = trigger && true; |
186 | 207 | } else { |
187 | 208 | trigger = false; |
|
190 | 211 |
|
191 | 212 | // check `right` event |
192 | 213 | if (elementEvents.indexOf('right') > -1) { |
193 | | - if (right == width) { |
| 214 | + if (right == width || _between(width, right, leftDelta)) { |
194 | 215 | trigger = trigger && true; |
195 | 216 | } else { |
196 | 217 | trigger = false; |
|
199 | 220 |
|
200 | 221 | // check `bottom` event |
201 | 222 | if (elementEvents.indexOf('bottom') > -1) { |
202 | | - if (bottom == height) { |
| 223 | + if (bottom == height || _between(height, bottom, topDelta)) { |
203 | 224 | trigger = trigger && true; |
204 | 225 | } else { |
205 | 226 | trigger = false; |
|
208 | 229 |
|
209 | 230 | // check `middle` event |
210 | 231 | if (elementEvents.indexOf('middle') > -1) { |
211 | | - if (top + (elementHeight / 2) == (height / 2)) { |
| 232 | + if (top + (elementHeight / 2) == (height / 2) || _between((height / 2), top + (elementHeight / 2), topDelta)) { |
212 | 233 | trigger = trigger && true; |
213 | 234 | } else { |
214 | 235 | trigger = false; |
|
217 | 238 |
|
218 | 239 | // check `center` event |
219 | 240 | if (elementEvents.indexOf('center') > -1) { |
220 | | - if (left + (elementWidth / 2) == (width / 2)) { |
| 241 | + if (left + (elementWidth / 2) == (width / 2) || _between((width / 2), left + (elementWidth / 2), leftDelta)) { |
221 | 242 | trigger = trigger && true; |
222 | 243 | } else { |
223 | 244 | trigger = false; |
|
241 | 262 | for (var i = 0; i < elements.length; i++) { |
242 | 263 | _position.call(this, elements[i].element, elements[i].event); |
243 | 264 | }; |
| 265 | + |
| 266 | + _scrollTop = document.body.scrollTop; |
| 267 | + _scrollLeft = document.body.scrollLeft; |
244 | 268 | }; |
245 | 269 |
|
246 | 270 | /** |
|
299 | 323 | * Start the module |
300 | 324 | */ |
301 | 325 | function _init () { |
| 326 | + _scrollTop = document.body.scrollTop; |
| 327 | + _scrollLeft = document.body.scrollLeft; |
| 328 | + |
302 | 329 | _populate.call(this); |
303 | 330 |
|
304 | 331 | if (_options.triggerOnInit == true) { |
|
0 commit comments