@daysnap/utils
Version:
56 lines (54 loc) • 1.74 kB
JavaScript
// 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
};