UNPKG

@corvu/utils

Version:

Utilities for corvu

43 lines (42 loc) 1.6 kB
// src/scroll/lib.ts var getScrollDimensions = (element, axis) => { switch (axis) { case "x": return [element.clientWidth, element.scrollLeft, element.scrollWidth]; case "y": return [element.clientHeight, element.scrollTop, element.scrollHeight]; } }; var isScrollContainer = (element, axis) => { const styles = getComputedStyle(element); const overflow = axis === "x" ? styles.overflowX : styles.overflowY; return overflow === "auto" || overflow === "scroll" || // The HTML element is a scroll container if it has overflow visible element.tagName === "HTML" && overflow === "visible"; }; var getScrollAtLocation = (location, axis, stopAt) => { const directionFactor = axis === "x" && window.getComputedStyle(location).direction === "rtl" ? -1 : 1; let currentElement = location; let availableScroll = 0; let availableScrollTop = 0; let wrapperReached = false; do { const [clientSize, scrollOffset, scrollSize] = getScrollDimensions( currentElement, axis ); const scrolled = scrollSize - clientSize - directionFactor * scrollOffset; if ((scrollOffset !== 0 || scrolled !== 0) && isScrollContainer(currentElement, axis)) { availableScroll += scrolled; availableScrollTop += scrollOffset; } if (currentElement === (stopAt ?? document.documentElement)) { wrapperReached = true; } else { currentElement = currentElement._$host ?? currentElement.parentElement; } } while (currentElement && !wrapperReached); return [availableScroll, availableScrollTop]; }; export { getScrollAtLocation };