mirror of
https://gitee.com/vant-contrib/vant.git
synced 2025-05-12 01:58:58 +08:00
50 lines
1.1 KiB
TypeScript
50 lines
1.1 KiB
TypeScript
import { ref, Ref, onMounted } from 'vue';
|
|
import { inBrowser } from '../utils';
|
|
|
|
type ScrollElement = HTMLElement | Window;
|
|
|
|
const overflowScrollReg = /scroll|auto|overlay/i;
|
|
const defaultRoot = inBrowser ? window : undefined;
|
|
|
|
function isElement(node: Element) {
|
|
const ELEMENT_NODE_TYPE = 1;
|
|
return (
|
|
node.tagName !== 'HTML' &&
|
|
node.tagName !== 'BODY' &&
|
|
node.nodeType === ELEMENT_NODE_TYPE
|
|
);
|
|
}
|
|
|
|
// https://github.com/vant-ui/vant/issues/3823
|
|
export function getScrollParent(
|
|
el: Element,
|
|
root: ScrollElement | undefined = defaultRoot
|
|
) {
|
|
let node = el;
|
|
|
|
while (node && node !== root && isElement(node)) {
|
|
const { overflowY } = window.getComputedStyle(node);
|
|
if (overflowScrollReg.test(overflowY)) {
|
|
return node;
|
|
}
|
|
node = node.parentNode as Element;
|
|
}
|
|
|
|
return root;
|
|
}
|
|
|
|
export function useScrollParent(
|
|
el: Ref<Element | undefined>,
|
|
root: ScrollElement | undefined = defaultRoot
|
|
) {
|
|
const scrollParent = ref<Element | Window>();
|
|
|
|
onMounted(() => {
|
|
if (el.value) {
|
|
scrollParent.value = getScrollParent(el.value, root);
|
|
}
|
|
});
|
|
|
|
return scrollParent;
|
|
}
|