29 lines
795 B
JavaScript
29 lines
795 B
JavaScript
|
function getParentNode(node) {
|
||
|
// document type
|
||
|
if (node.nodeType === 9) {
|
||
|
return null;
|
||
|
}
|
||
|
return node.parentNode;
|
||
|
}
|
||
|
export function getScrollParent(node) {
|
||
|
if (node === null)
|
||
|
return null;
|
||
|
const parentNode = getParentNode(node);
|
||
|
if (parentNode === null) {
|
||
|
return null;
|
||
|
}
|
||
|
// Document
|
||
|
if (parentNode.nodeType === 9) {
|
||
|
return document.documentElement;
|
||
|
}
|
||
|
// Element
|
||
|
if (parentNode.nodeType === 1) {
|
||
|
// Firefox want us to check `-x` and `-y` variations as well
|
||
|
const { overflow, overflowX, overflowY } = getComputedStyle(parentNode);
|
||
|
if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
|
||
|
return parentNode;
|
||
|
}
|
||
|
}
|
||
|
return getScrollParent(parentNode);
|
||
|
}
|