Created
October 1, 2019 23:13
-
-
Save icavalheiro/7c0c58770bdab25f7fb82e8e6fe423f1 to your computer and use it in GitHub Desktop.
detects vertical scroll movement on a page/element, works on mobile and desktop
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function getTouch(event) { | |
if (event.touches) return event.touches[0] | |
return event; | |
} | |
function addSwipeListener(element, callback, startCallback, finishCallback) { | |
let y; | |
let handleTouchStart = (event) => { | |
y = getTouch(event).clientY; | |
if (startCallback) startCallback(); | |
} | |
let handleTouchMove = (event) => { | |
if (!y) return; | |
let newY = getTouch(event).clientY; | |
let delta = y - newY; | |
y = newY; | |
if (delta != 0) callback(delta); | |
} | |
let handleTouchEnd = () => { | |
y = undefined; | |
if (finishCallback) finishCallback(); | |
} | |
element.addEventListener('touchstart', handleTouchStart, false); | |
element.addEventListener('mousedown', handleTouchStart, false); | |
element.addEventListener('touchmove', handleTouchMove, false); | |
element.addEventListener('mousemove', handleTouchMove, false); | |
element.addEventListener('touchend', handleTouchEnd, false); | |
document.addEventListener('mouseup', handleTouchEnd, false); | |
} | |
export default function onScroll(element, callback){ | |
let currentDelta = 0; | |
let ignoreScroll = false; | |
let call = () => { | |
if(currentDelta > 0) | |
callback(100); | |
else | |
callback(-100); | |
currentDelta = 0; | |
} | |
let tryCall = (val = 99) => { | |
if(currentDelta > val || currentDelta < -val){ | |
call(); | |
return true; | |
} else { | |
return false; | |
} | |
} | |
addSwipeListener(element, (delta) => { | |
if(ignoreScroll){ | |
return; | |
} | |
currentDelta += delta; | |
if(tryCall()){ | |
ignoreScroll = true; | |
} | |
}, null, () => { | |
if(!ignoreScroll){ | |
tryCall(40); | |
} | |
ignoreScroll = false; | |
}); | |
element.addEventListener('wheel', e => callback(e.deltaY)); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment