web-ui-pack
Version:
Web package with UI elements
65 lines (64 loc) • 2.77 kB
JavaScript
import { findScrollParentAll } from "./findScrollParent";
import { getBoundingInternalRect } from "./styleHelpers";
import viewportSize from "./viewportSize";
export default function isIntoView(el, options) {
const scrollParents = options?.scrollParents || findScrollParentAll(el) || [document.body];
let child = options?.elRect ?? el.getBoundingClientRect();
if (options?.offset) {
child = {
top: child.top - options.offset[0],
left: child.left - (options.offset[3] ?? options.offset[1]),
right: child.right + options.offset[1],
bottom: child.bottom + (options.offset[2] ?? options.offset[0]),
};
}
const vp = viewportSize();
const r = {
hiddenX: false,
hiddenY: false,
partialHiddenX: false,
partialHiddenY: false,
visible: true,
hidden: false,
partialVisible: false,
};
for (let i = 0; i < scrollParents.length; ++i) {
let isVisY = false;
let isVisX = false;
const elRect = scrollParents[i].getBoundingClientRect();
const p = (() => {
if (!p._saved) {
const s = getComputedStyle(scrollParents[i]);
isVisY = s.overflowY === "visible";
isVisX = s.overflowX === "visible";
p._saved = getBoundingInternalRect(scrollParents[i], { computedStyle: s, elRect });
}
return p._saved;
});
const isHiddenY = ((child.top > vp.vh || child.bottom < 0) && document.documentElement) ||
((p().top >= child.bottom || p().bottom <= child.top) && !isVisY && scrollParents[i]);
const isHiddenX = ((child.left > vp.vw || child.right < 0) && document.documentElement) ||
((p().left >= child.right || p().right <= child.left) && !isVisX && scrollParents[i]);
if (isHiddenY) {
r.hiddenY = isHiddenY;
}
else if (!r.hiddenY) {
r.partialHiddenY =
((child.top < 0 || child.bottom > vp.vh) && document.documentElement) ||
((child.top < p().top || child.bottom > p().bottom) && !isVisY && scrollParents[i]);
}
if (isHiddenX) {
r.hiddenX = isHiddenX;
}
else if (!r.hiddenX) {
r.partialHiddenX =
((child.left < 0 || child.right > vp.vw) && document.documentElement) ||
((child.left < p().left || child.right > p().right) && !isVisX && scrollParents[i]);
}
child = elRect;
}
r.hidden = r.hiddenX || r.hiddenY;
r.visible = !r.hidden && !r.partialHiddenX && !r.partialHiddenY;
r.partialVisible = !r.hidden && (r.partialHiddenX || r.partialHiddenY);
return r;
}