66 lines
1.7 KiB
TypeScript
66 lines
1.7 KiB
TypeScript
import { tween } from './animate.js'
|
|
|
|
export function getCssValue(el: HTMLElement | null, property: string): number {
|
|
const val = el?.ownerDocument?.defaultView?.getComputedStyle(el, null)?.[
|
|
property as any
|
|
]
|
|
const num = Number.parseInt(val as string, 10)
|
|
return Number.isNaN(num) ? 0 : num
|
|
}
|
|
|
|
export function getScrollTop(
|
|
target: Document | HTMLElement = document
|
|
): number {
|
|
if (target === document || !target) {
|
|
return (
|
|
window.pageYOffset ||
|
|
document.documentElement.scrollTop ||
|
|
document.body.scrollTop ||
|
|
0
|
|
)
|
|
} else {
|
|
return (target as HTMLElement).scrollTop
|
|
}
|
|
}
|
|
|
|
export function setScrollTop(
|
|
target: Document | HTMLElement = document,
|
|
scrollTop = 0
|
|
): void {
|
|
if (typeof target === 'number') {
|
|
scrollTop = target
|
|
target = document
|
|
document.documentElement.scrollTop = scrollTop
|
|
document.body.scrollTop = scrollTop
|
|
} else {
|
|
if (target === document) {
|
|
document.body.scrollTop = scrollTop || 0
|
|
document.documentElement.scrollTop = scrollTop || 0
|
|
} else {
|
|
;(target as HTMLElement).scrollTop = scrollTop || 0
|
|
}
|
|
}
|
|
}
|
|
|
|
export function scrollTo(
|
|
target: Document | HTMLElement,
|
|
top: number,
|
|
time = 300
|
|
): void {
|
|
if (target !== document) {
|
|
const currentTop = getScrollTop(target)
|
|
const step = Math.ceil(time / 16)
|
|
let currentStep = 0
|
|
const change = top - currentTop
|
|
const timer = setInterval(() => {
|
|
currentStep++
|
|
if (currentStep >= step) {
|
|
timer && clearInterval(timer)
|
|
}
|
|
setScrollTop(target, tween(currentStep, currentTop, change, step))
|
|
}, 1000 / 60)
|
|
} else {
|
|
window.scrollTo({ top, behavior: 'smooth' })
|
|
}
|
|
}
|