29 lines
1.0 KiB
JavaScript
29 lines
1.0 KiB
JavaScript
|
export function getScrollParent(el) {
|
||
|
let includeHidden = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
||
|
while (el) {
|
||
|
if (includeHidden ? isPotentiallyScrollable(el) : hasScrollbar(el)) return el;
|
||
|
el = el.parentElement;
|
||
|
}
|
||
|
return document.scrollingElement;
|
||
|
}
|
||
|
export function getScrollParents(el, stopAt) {
|
||
|
const elements = [];
|
||
|
if (stopAt && el && !stopAt.contains(el)) return elements;
|
||
|
while (el) {
|
||
|
if (hasScrollbar(el)) elements.push(el);
|
||
|
if (el === stopAt) break;
|
||
|
el = el.parentElement;
|
||
|
}
|
||
|
return elements;
|
||
|
}
|
||
|
export function hasScrollbar(el) {
|
||
|
if (!el || el.nodeType !== Node.ELEMENT_NODE) return false;
|
||
|
const style = window.getComputedStyle(el);
|
||
|
return style.overflowY === 'scroll' || style.overflowY === 'auto' && el.scrollHeight > el.clientHeight;
|
||
|
}
|
||
|
function isPotentiallyScrollable(el) {
|
||
|
if (!el || el.nodeType !== Node.ELEMENT_NODE) return false;
|
||
|
const style = window.getComputedStyle(el);
|
||
|
return ['scroll', 'auto'].includes(style.overflowY);
|
||
|
}
|
||
|
//# sourceMappingURL=getScrollParent.mjs.map
|