@nex-ui/react
Version:
🎉 A beautiful, modern, and reliable React component library.
44 lines (40 loc) • 1.64 kB
JavaScript
;
var utils = require('@nex-ui/utils');
var dom = require('./dom.cjs');
function _getOffsetParent(element) {
// istanbul ignore if
if (!dom.isHTMLElement(element)) {
return null;
}
return element.offsetParent;
}
/**
* A positioned ancestor might be:
* - a containing block for absolutely-positioned elements
* - an element with a different effective zoom value (that is, the product of all zoom scales of its parents) from this element
* - td, th, table in case the element itself is static positioned.
*
* https://drafts.csswg.org/cssom-view/#dom-htmlelement-offsetparent
*/ const getOffsetParent = (element)=>{
const win = utils.ownerWindow(element);
if (dom.isSVGElement(element)) {
// SVG element hasn't offsetParent, find the nearest Element
let svgOffsetParent = element.parentElement;
while(svgOffsetParent && !dom.isRootElement(svgOffsetParent)){
if (dom.isElement(svgOffsetParent) && !dom.isStaticPositioned(svgOffsetParent)) {
return svgOffsetParent;
}
svgOffsetParent = svgOffsetParent.parentElement;
}
return win;
}
let offsetParent = _getOffsetParent(element);
while(offsetParent && dom.isTableElement(offsetParent) && dom.isStaticPositioned(offsetParent)){
offsetParent = _getOffsetParent(offsetParent);
}
if (offsetParent && dom.isRootElement(offsetParent) && dom.isStaticPositioned(offsetParent) && !dom.isContainingBlock(offsetParent)) {
return win;
}
return offsetParent || win;
};
exports.getOffsetParent = getOffsetParent;