UNPKG

web-ui-pack

Version:
65 lines (64 loc) 2.77 kB
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; }