@kangc/v-md-editor
Version:
A markdown editor built on Vue
39 lines (31 loc) • 1.09 kB
JavaScript
import { getScrollTop, scrollTo } from './scroll-top';
export function smooth({ currentScrollTop, scrollToTop, scrollFn, percent = 10, onScrollEnd }) {
const scrollWay = scrollToTop > currentScrollTop ? 'down' : 'up';
const step = (scrollToTop - currentScrollTop) * (percent / 100);
let id;
const scroll = () => {
currentScrollTop += step;
if (
(scrollWay === 'down' && currentScrollTop >= scrollToTop) ||
(scrollWay === 'up' && currentScrollTop <= scrollToTop)
) {
scrollFn(scrollToTop);
window.cancelAnimationFrame(id);
if (onScrollEnd) window.requestAnimationFrame(onScrollEnd);
} else {
scrollFn(currentScrollTop);
window.requestAnimationFrame(scroll);
}
};
window.requestAnimationFrame(scroll);
}
export default function smoothScroll({ scrollTarget, scrollToTop, percent = 10, onScrollEnd }) {
const currentScrollTop = getScrollTop(scrollTarget);
smooth({
currentScrollTop,
scrollToTop,
scrollFn: (scrollTop) => scrollTo(scrollTarget, scrollTop),
percent,
onScrollEnd,
});
}