ngx-bootstrap
Version:
Angular Bootstrap
70 lines • 3.15 kB
JavaScript
import { findCommonOffsetParent } from './findCommonOffsetParent';
import { getFixedPositionOffsetParent } from './getFixedPositionOffsetParent';
import { getOffsetRectRelativeToArbitraryNode } from './getOffsetRectRelativeToArbitraryNode';
import { getParentNode } from './getParentNode';
import { getScrollParent } from './getScrollParent';
import { getViewportOffsetRectRelativeToArtbitraryNode } from './getViewportOffsetRectRelativeToArtbitraryNode';
import { getWindowSizes } from './getWindowSizes';
import { isFixed } from './isFixed';
import { isNumber } from './isNumeric';
export function getBoundaries(target, host, padding = 0, boundariesElement, fixedPosition = false) {
// NOTE: 1 DOM access here
let boundaries = { top: 0, left: 0 };
const offsetParent = fixedPosition ? getFixedPositionOffsetParent(target) : findCommonOffsetParent(target, host);
// Handle viewport case
if (boundariesElement === 'viewport') {
boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);
}
else {
// Handle other cases based on DOM element used as boundaries
let boundariesNode;
if (boundariesElement === 'scrollParent') {
boundariesNode = getScrollParent(getParentNode(host));
if (boundariesNode.nodeName === 'BODY') {
boundariesNode = target.ownerDocument.documentElement;
}
}
else if (boundariesElement === 'window') {
boundariesNode = target.ownerDocument.documentElement;
}
else {
boundariesNode = boundariesElement;
}
const offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);
// In case of HTML, we need a different computation
if (offsets && boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {
const { height, width } = getWindowSizes(target.ownerDocument);
if (isNumber(boundaries.top) && isNumber(offsets.top) && isNumber(offsets.marginTop)) {
boundaries.top += offsets.top - offsets.marginTop;
}
if (isNumber(boundaries.top)) {
boundaries.bottom = Number(height) + Number(offsets.top);
}
if (isNumber(boundaries.left) && isNumber(offsets.left) && isNumber(offsets.marginLeft)) {
boundaries.left += offsets.left - offsets.marginLeft;
}
if (isNumber(boundaries.top)) {
boundaries.right = Number(width) + Number(offsets.left);
}
}
else if (offsets) {
// for all the other DOM elements, this one is good
boundaries = offsets;
}
}
// Add paddings
if (isNumber(boundaries.left)) {
boundaries.left += padding;
}
if (isNumber(boundaries.top)) {
boundaries.top += padding;
}
if (isNumber(boundaries.right)) {
boundaries.right -= padding;
}
if (isNumber(boundaries.bottom)) {
boundaries.bottom -= padding;
}
return boundaries;
}
//# sourceMappingURL=getBoundaries.js.map