/** * Gets the dimensions of the element, accounting for API differences between * `window` and other DOM elements. */ // TODO Move this into WindowScroller and import from there var isWindow = function isWindow(element) { return element === window; }; var getBoundingBox = function getBoundingBox(element) { return element.getBoundingClientRect(); }; export function getDimensions(scrollElement, props) { if (!scrollElement) { return { height: props.serverHeight, width: props.serverWidth }; } else if (isWindow(scrollElement)) { var _window = window, innerHeight = _window.innerHeight, innerWidth = _window.innerWidth; return { height: typeof innerHeight === 'number' ? innerHeight : 0, width: typeof innerWidth === 'number' ? innerWidth : 0 }; } else { return getBoundingBox(scrollElement); } } /** * Gets the vertical and horizontal position of an element within its scroll container. * Elements that have been “scrolled past” return negative values. * Handles edge-case where a user is navigating back (history) from an already-scrolled page. * In this case the body’s top or left position will be a negative number and this element’s top or left will be increased (by that amount). */ export function getPositionOffset(element, container) { if (isWindow(container) && document.documentElement) { var containerElement = document.documentElement; var elementRect = getBoundingBox(element); var containerRect = getBoundingBox(containerElement); return { top: elementRect.top - containerRect.top, left: elementRect.left - containerRect.left }; } else { var scrollOffset = getScrollOffset(container); var _elementRect = getBoundingBox(element); var _containerRect = getBoundingBox(container); return { top: _elementRect.top + scrollOffset.top - _containerRect.top, left: _elementRect.left + scrollOffset.left - _containerRect.left }; } } /** * Gets the vertical and horizontal scroll amount of the element, accounting for IE compatibility * and API differences between `window` and other DOM elements. */ export function getScrollOffset(element) { if (isWindow(element) && document.documentElement) { return { top: 'scrollY' in window ? window.scrollY : document.documentElement.scrollTop, left: 'scrollX' in window ? window.scrollX : document.documentElement.scrollLeft }; } else { return { top: element.scrollTop, left: element.scrollLeft }; } }