57 lines
1.8 KiB
Plaintext
57 lines
1.8 KiB
Plaintext
class Follower
|
|
(el) ->
|
|
@follower = el
|
|
@last-scroll-top = window.scroll-y
|
|
@initial-follower-top = @follower.get-bounding-client-rect!.top
|
|
@page-top = 48
|
|
|
|
follow: ->
|
|
window-height = window.inner-height
|
|
follower-height = @follower.offset-height
|
|
|
|
scroll-top = window.scroll-y
|
|
scroll-bottom = scroll-top + window-height
|
|
|
|
follower-top = @follower.get-bounding-client-rect!.top + scroll-top
|
|
follower-bottom = follower-top + follower-height
|
|
|
|
height-delta = Math.abs window-height - follower-height
|
|
scroll-delta = @last-scroll-top - scroll-top
|
|
|
|
is-scrolling-down = (scroll-top > @last-scroll-top)
|
|
is-window-larger = (window-height > follower-height)
|
|
|
|
console.log @initial-follower-top
|
|
|
|
if (is-window-larger && scroll-top > @initial-follower-top) || (!is-window-larger && scroll-top > @initial-follower-top + height-delta)
|
|
@follower.class-list.add \fixed
|
|
else if !is-scrolling-down && scroll-top + @page-top <= @initial-follower-top
|
|
@follower.class-list.remove \fixed
|
|
@follower.style.top = 0
|
|
return
|
|
|
|
drag-bottom-down = (follower-bottom <= scroll-bottom && is-scrolling-down)
|
|
drag-top-up = (follower-top >= scroll-top + @page-top && !is-scrolling-down)
|
|
|
|
if drag-bottom-down
|
|
console.log \down
|
|
@follower.style.top = if is-window-larger then 0 else -height-delta + \px
|
|
else if drag-top-up
|
|
console.log \up
|
|
@follower.style.top = @page-top + \px
|
|
else if @follower.class-list.contains \fixed
|
|
console.log \-
|
|
current-top = parse-int @follower.style.top, 10
|
|
|
|
min-top = -height-delta
|
|
scrolled-top = current-top + scroll-delta
|
|
|
|
is-page-at-bottom = (scroll-top + window-height >= document.body.offset-height)
|
|
new-top = if is-page-at-bottom then min-top else scrolled-top
|
|
|
|
@follower.style.top = new-top + \px
|
|
|
|
@last-scroll-top = scroll-top
|
|
|
|
module.exports = Follower
|