-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathscroll-detect.coffee
More file actions
67 lines (52 loc) · 1.48 KB
/
scroll-detect.coffee
File metadata and controls
67 lines (52 loc) · 1.48 KB
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
define(
[
'underscore'
],
(
_
) ->
class HelperScrollMonitor
REFRESH_RATE = 100
SCROLL_SPEED_MINIMUM = 10
SCROLL_SPEED_MOMENTUM = 250
constructor: (@$el) ->
@$window = $(window)
@scrollTop = @$el.scrollTop()
@scrollCount = 0
@$el
.on('scroll', _.throttle(@_eventScrollStart, REFRESH_RATE))
.on('scroll', _.debounce(@_eventScrollEnd, REFRESH_RATE))
.trigger('scroll')
_eventScrollStart: =>
if @scrollEndTimeout?
clearTimeout(@scrollEndTimeout)
delete @scrollEndTimeout
return if @isScrolling
@scrollCount += 1
return unless @scrollCount > 2
return unless @_isScrollingFast()
@_setScrollStart()
_eventScrollEnd: =>
return unless @isScrolling
@scrollCount = 0
@scrollEndTimeout = setTimeout(
=> @_setScrollEnd()
SCROLL_SPEED_MOMENTUM
)
_isScrollingFast: ->
scrollTopPrevious = @scrollTop
scrollTopNow = @$el.scrollTop()
@scrollTop = scrollTopNow
speed = Math.abs(scrollTopNow - scrollTopPrevious)
return speed > SCROLL_SPEED_MINIMUM
_setScrollEnd: ->
@isScrolling = false
@$window
.data('is-scrolling', false)
.trigger('scroll-end')
_setScrollStart: ->
@isScrolling = true
@$window
.data('is-scrolling', true)
.trigger('scroll-start')
)