web-ui-pack
Version:
Web package with UI elements
54 lines (53 loc) • 1.26 kB
JavaScript
function hasFixedPos(el) {
const p = el.style.position;
const n = "fixed";
return p === n || (!p && window.getComputedStyle(el).position === n);
}
export default function findScrollParent(el) {
const p = el.parentElement;
if (!p) {
return null;
}
if (p.scrollTop > 0 || p.scrollLeft > 0) {
return p;
}
const orig = p.onscroll;
p.onscroll = (e) => {
e.stopImmediatePropagation();
};
let prev = p.scrollTop;
p.scrollTop += 10;
if (prev !== p.scrollTop) {
p.scrollTop = prev;
setTimeout(() => (p.onscroll = orig), 1);
return p;
}
prev = p.scrollLeft;
p.scrollLeft += 10;
if (prev !== p.scrollLeft) {
p.scrollLeft = prev;
setTimeout(() => (p.onscroll = orig), 1);
return p;
}
p.onscroll = orig;
if (hasFixedPos(p)) {
return null;
}
return findScrollParent(p);
}
export function findScrollParentAll(el) {
let l = el;
const arr = [];
while (1) {
l = findScrollParent(l);
if (l) {
arr.push(l);
if (hasFixedPos(l)) {
break;
}
}
else
break;
}
return arr.length ? arr : null;
}