docs/_vendor/popper.js/dist/popper.js
function getOffsetParent(element) {
  if (!element) {
    return document.documentElement;
  }

  const noOffsetParent = isIE(10) ? document.body : null;

  // NOTE: 1 DOM access here
  let offsetParent = element.offsetParent || null;
  // Skip hidden elements which don't have an offsetParent
  while (offsetParent === noOffsetParent && element.nextElementSibling) {
    offsetParent = (element = element.nextElementSibling).offsetParent;
  }

  const nodeName = offsetParent && offsetParent.nodeName;

  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {
    return element ? element.ownerDocument.documentElement : document.documentElement;
  }

  // .offsetParent will return the closest TH, TD or TABLE in case
  // no offsetParent is present, I hate this job...
  if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {
    return getOffsetParent(offsetParent);
  }

  return offsetParent;
}
function getOffsetParent(element) {
  if (!element) {
    return document.documentElement;
  }

  const noOffsetParent = isIE(10) ? document.body : null;

  // NOTE: 1 DOM access here
  let offsetParent = element.offsetParent || null;
  // Skip hidden elements which don't have an offsetParent
  while (offsetParent === noOffsetParent && element.nextElementSibling) {
    offsetParent = (element = element.nextElementSibling).offsetParent;
  }

  const nodeName = offsetParent && offsetParent.nodeName;

  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {
    return element ? element.ownerDocument.documentElement : document.documentElement;
  }

  // .offsetParent will return the closest TH, TD or TABLE in case
  // no offsetParent is present, I hate this job...
  if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {
    return getOffsetParent(offsetParent);
  }

  return offsetParent;
}
function getOffsetParent ( element ) { if ( ! element ) { return document . documentElement ; } const noOffsetParent = isIE ( 10 ) ? document . body : null ; // NOTE: 1 DOM access here let offsetParent = element . offsetParent || null ; // Skip hidden elements which don't have an offsetParent while ( offsetParent === noOffsetParent && element . nextElementSibling ) { offsetParent = ( element = element . nextElementSibling ) . offsetParent ; } const nodeName = offsetParent && offsetParent . nodeName ; if ( ! nodeName || nodeName === 'BODY' || nodeName === 'HTML' ) { return element ? element . ownerDocument . documentElement : document . documentElement ; } // .offsetParent will return the closest TH, TD or TABLE in case // no offsetParent is present, I hate this job... if ( [ 'TH' , 'TD' , 'TABLE' ] . indexOf ( offsetParent . nodeName ) !== - 1 && getStyleComputedProperty ( offsetParent , 'position' ) === 'static' ) { return getOffsetParent ( offsetParent ) ; } return offsetParent ; }
Returns the offset parent of the given element
@method
@memberof Popper.Utils
@argument {Element} element
@returns {Element} offset parent
Returns the offset parent of the given element