in src/scroll/smooth-scrolling-algorithm.ts [35:78]
public scrollTo(
parent: Readonly<IScrollableContainer>,
// tslint:disable-next-line
_el: HTMLElement,
referenceRect: ClientRect,
): void {
// Animation function to transition a scroll on the `parent` from the
// `original` value to the `target` value by calling `set.
const animate = (delta: number, original: number, setter: (x: number) => void) => {
if (delta === 0) {
return;
}
const target = original + delta;
const start = performance.now();
const duration = (Math.abs(target - original) / this.scrollSpeed) * 1000;
const run = (now: number) => {
const progress = Math.min((now - start) / duration, 1);
setter(this.smoothing(original, target, progress));
if (progress < 1) {
requestAnimationFrame(run);
}
};
requestAnimationFrame(run);
};
const reference = parent.element.getBoundingClientRect();
if (parent.horizontal) {
animate(
horizontalDelta(referenceRect, reference),
parent.element.scrollLeft,
x => (parent.element.scrollLeft = x),
);
}
if (parent.vertical) {
animate(
verticalDelta(referenceRect, reference),
parent.element.scrollTop,
x => (parent.element.scrollTop = x),
);
}
}