48 lines
1.6 KiB
JavaScript
48 lines
1.6 KiB
JavaScript
|
import getBoundingClientRect from "./getBoundingClientRect.js";
|
||
|
import getNodeScroll from "./getNodeScroll.js";
|
||
|
import getNodeName from "./getNodeName.js";
|
||
|
import { isHTMLElement } from "./instanceOf.js";
|
||
|
import getWindowScrollBarX from "./getWindowScrollBarX.js";
|
||
|
import getDocumentElement from "./getDocumentElement.js";
|
||
|
import isScrollParent from "./isScrollParent.js"; // Returns the composite rect of an element relative to its offsetParent.
|
||
|
// Composite means it takes into account transforms as well as layout.
|
||
|
|
||
|
export default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
|
||
|
if (isFixed === void 0) {
|
||
|
isFixed = false;
|
||
|
}
|
||
|
|
||
|
var documentElement = getDocumentElement(offsetParent);
|
||
|
var rect = getBoundingClientRect(elementOrVirtualElement);
|
||
|
var isOffsetParentAnElement = isHTMLElement(offsetParent);
|
||
|
var scroll = {
|
||
|
scrollLeft: 0,
|
||
|
scrollTop: 0
|
||
|
};
|
||
|
var offsets = {
|
||
|
x: 0,
|
||
|
y: 0
|
||
|
};
|
||
|
|
||
|
if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
|
||
|
if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078
|
||
|
isScrollParent(documentElement)) {
|
||
|
scroll = getNodeScroll(offsetParent);
|
||
|
}
|
||
|
|
||
|
if (isHTMLElement(offsetParent)) {
|
||
|
offsets = getBoundingClientRect(offsetParent);
|
||
|
offsets.x += offsetParent.clientLeft;
|
||
|
offsets.y += offsetParent.clientTop;
|
||
|
} else if (documentElement) {
|
||
|
offsets.x = getWindowScrollBarX(documentElement);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
x: rect.left + scroll.scrollLeft - offsets.x,
|
||
|
y: rect.top + scroll.scrollTop - offsets.y,
|
||
|
width: rect.width,
|
||
|
height: rect.height
|
||
|
};
|
||
|
}
|