UNPKG

@daysnap/utils

Version:
56 lines (54 loc) 1.74 kB
// src/mousewheel.ts function getAverage(elements, number) { let sum = 0; const lastElements = elements.slice(Math.max(elements.length - number, 1)); for (let i = 0; i < lastElements.length; i++) { sum = sum + lastElements[i]; } return Math.ceil(sum / number); } function mousewheel(scrolling, options) { const { scrollingSpeed = 700, scrollDelay = 50 } = Object.assign({}, options); let scrollings = []; let prevTime = Date.now(); let lastAnimation = 0; function isMoving() { const timeNow = (/* @__PURE__ */ new Date()).getTime(); if (timeNow - lastAnimation < scrollDelay + scrollingSpeed) { return true; } return false; } const listener = (e) => { const curTime = Date.now(); const delta = e.wheelDelta || -e.deltaY || -e.detail; const horizontalDetection = typeof e.wheelDeltaX !== "undefined" || typeof e.deltaX !== "undefined"; const isScrollingVertically = Math.abs(e.wheelDeltaX) < Math.abs(e.wheelDelta) || Math.abs(e.deltaX) < Math.abs(e.deltaY) || !horizontalDetection; if (scrollings.length > 149) { scrollings.shift(); } scrollings.push(Math.abs(delta)); const timeDiff = curTime - prevTime; prevTime = curTime; if (timeDiff > 200) { scrollings = []; } if (!isMoving()) { const averageEnd = getAverage(scrollings, 10); const averageMiddle = getAverage(scrollings, 70); const isAccelerating = averageEnd >= averageMiddle; if (isAccelerating && isScrollingVertically) { scrolling({ direction: delta < 0 ? "up" : "down", delta }); lastAnimation = Date.now(); } return false; } }; return { listener }; } export { mousewheel };