comic-plus
Version:
<p align="center"> <img width="200px" src="./logo.png"/> </p>
45 lines (44 loc) • 1.14 kB
JavaScript
import "../../../utils/config.mjs";
import "vue";
import { isWindow } from "../../../utils/typescript.mjs";
import { raf, caf } from "../../../utils/client.mjs";
function getNextScrollTop(t, b, c, d) {
const cc = c - b;
t /= d / 2;
if (t < 1) {
return cc / 2 * t * t * t + b;
}
return cc / 2 * ((t -= 2) * t * t + 2) + b;
}
function animateScrollTo(container, from, to, duration) {
const startTime = Date.now();
let handle;
const scroll = () => {
const timestamp = Date.now();
const time = timestamp - startTime;
const nst = getNextScrollTop(time > duration ? duration : time, from, to, duration);
if (isWindow(container)) {
container.scrollTo(window.pageXOffset, nst);
} else {
container.scrollTop = nst;
}
if (time < duration) {
handle = raf(scroll);
}
};
scroll();
return () => {
handle && caf(handle);
};
}
function elAnimation(el, duration) {
const time = 1e3 + (duration ?? 0);
el.classList.add("cu-anchor--animation");
setTimeout(() => {
el.classList.remove("cu-anchor--animation");
}, time);
}
export {
animateScrollTo,
elAnimation
};