diff options
author | bobzel <zzzman@gmail.com> | 2021-03-04 20:22:00 -0500 |
---|---|---|
committer | bobzel <zzzman@gmail.com> | 2021-03-04 20:22:00 -0500 |
commit | 47e0c97b04a67b3bad1f2c789145a92ba7069f1e (patch) | |
tree | 2ebc643fb534407a8f595b2f0ab1d1e851c32a0e /src/Utils.ts | |
parent | 454f004e7249c78696fa7085fcf10c59ab8e327a (diff) |
fixed scrolling of web pages and fitwidth for web pages.
Diffstat (limited to 'src/Utils.ts')
-rw-r--r-- | src/Utils.ts | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/Utils.ts b/src/Utils.ts index b6a59118a..f22df0da2 100644 --- a/src/Utils.ts +++ b/src/Utils.ts @@ -482,20 +482,30 @@ const easeInOutQuad = (currentTime: number, start: number, change: number, durat return (-change / 2) * (newCurrentTime * (newCurrentTime - 2) - 1) + start; }; -export function smoothScroll(duration: number, element: HTMLElement, to: number, finish?: () => void) { - const start = element.scrollTop; - const change = to - start; - const startDate = new Date().getTime(); +export function smoothScroll(duration: number, element: HTMLElement | HTMLElement[], to: number, finish?: () => void, reset?: { resetGoTo: { to: number, duration: number } | undefined }) { + const elements = (element instanceof HTMLElement ? [element] : element); + let starts = elements.map(element => element.scrollTop); + let startDate = new Date().getTime(); const animateScroll = () => { const currentDate = new Date().getTime(); - const currentTime = currentDate - startDate; - element.scrollTop = easeInOutQuad(currentTime, start, change, duration); + let currentTime = currentDate - startDate; + const resetParams = reset?.resetGoTo; + if (resetParams) { + reset!.resetGoTo = undefined; + const { to: newTo, duration: newDuration } = resetParams; + to = newTo; + starts = starts.map(start => easeInOutQuad(currentTime, start, to - start, duration)); + startDate = currentDate; + duration = newDuration; + currentTime = currentDate - startDate; + } + elements.map((element, i) => element.scrollTop = easeInOutQuad(currentTime, starts[i], to - starts[i], duration)); if (currentTime < duration) { requestAnimationFrame(animateScroll); } else { - element.scrollTop = to; + elements.forEach(element => element.scrollTop = to); finish?.(); } }; |