Skip to content

Instantly share code, notes, and snippets.

@icavalheiro
Created October 1, 2019 23:13
Show Gist options
  • Save icavalheiro/7c0c58770bdab25f7fb82e8e6fe423f1 to your computer and use it in GitHub Desktop.
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
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