2023-12-27 02:18:19 +08:00

70 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' })
}
}