mallBackend/src/utils/dom.ts

81 lines
2.2 KiB
TypeScript
Raw Normal View History

2023-12-02 11:33:44 +08:00
import { unref, Ref } from 'vue'
import { isIOS } from './validate'
export type ScrollElement = Element | Window
// 获取元素 滚动出去的高度
export function getScrollTop(el: ScrollElement): number {
const top = 'scrollTop' in el ? el.scrollTop : el.pageYOffset
// iOS scroll bounce cause minus scrollTop
return Math.max(top, 0)
}
// 设置元素滚动出去的距离
export function setScrollTop(el: ScrollElement, value: number) {
if ('scrollTop' in el) {
el.scrollTop = value
} else {
el.scrollTo(el.scrollX, value)
}
}
// 获取根元素 滚动出去的高度
export function getRootScrollTop(): number {
return (
window.pageYOffset ||
document.documentElement.scrollTop ||
document.body.scrollTop ||
0
)
}
// 设置根元素滚动出去的距离
export function setRootScrollTop(value: number) {
setScrollTop(window, value)
setScrollTop(document.body, value)
}
// hack for iOS12 page scroll
// see: https://developers.weixin.qq.com/community/develop/doc/00044ae90742f8c82fb78fcae56800
export function resetScroll() {
if (isIOS) {
setRootScrollTop(getRootScrollTop())
}
}
// 阻止事件冒泡
export const stopPropagation = (event: Event) => event.stopPropagation()
// 阻止默认行为
export function preventDefault(event: Event, isStopPropagation?: boolean) {
/* istanbul ignore else */
if (typeof event.cancelable !== 'boolean' || event.cancelable) {
event.preventDefault()
}
if (isStopPropagation) {
stopPropagation(event)
}
}
// 判断元素是否隐藏
export function isHidden(
elementRef: HTMLElement | Ref<HTMLElement | undefined>
) {
const el = unref(elementRef)
if (!el) {
return false
}
const style = window.getComputedStyle(el)
const hidden = style.display === 'none'
// offsetParent returns null in the following situations:
// 1. The element or its parent element has the display property set to none.
// 2. The element has the position property set to fixed
const parentHidden = el.offsetParent === null && style.position !== 'fixed'
return hidden || parentHidden
}