@vuesax-alpha/nightly
Version:
A Component Library for Vue 3
40 lines (37 loc) • 1.56 kB
JavaScript
import { createCoords } from '../../utils/index.mjs';
import { isHTMLElement, getDocumentElement, getNodeName, isOverflowElement, getNodeScroll } from '../../utils/dom.mjs';
import { getBoundingClientRect } from '../utils/get-bounding-client-rect.mjs';
import { getScale } from './get-scale.mjs';
function convertOffsetParentRelativeRectToViewportRelativeRect({
rect,
offsetParent,
strategy
}) {
const isOffsetParentAnElement = isHTMLElement(offsetParent);
const documentElement = getDocumentElement(offsetParent);
if (offsetParent === documentElement) {
return rect;
}
let scroll = { scrollLeft: 0, scrollTop: 0 };
let scale = createCoords(1);
const offsets = createCoords(0);
if (isOffsetParentAnElement || !isOffsetParentAnElement && strategy !== "fixed") {
if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) {
scroll = getNodeScroll(offsetParent);
}
if (isHTMLElement(offsetParent)) {
const offsetRect = getBoundingClientRect(offsetParent);
scale = getScale(offsetParent);
offsets.x = offsetRect.x + offsetParent.clientLeft;
offsets.y = offsetRect.y + offsetParent.clientTop;
}
}
return {
width: rect.width * scale.x,
height: rect.height * scale.y,
x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x,
y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y
};
}
export { convertOffsetParentRelativeRectToViewportRelativeRect };
//# sourceMappingURL=convert-offset-parent-relative-rect-to-viewport-relative-rect.mjs.map