78 lines
2.5 KiB
JavaScript
78 lines
2.5 KiB
JavaScript
/**
|
||
* 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
|
||
};
|
||
}
|
||
} |