diff --git a/packages/popper/src/utils/getOffsetParent.js b/packages/popper/src/utils/getOffsetParent.js index e2069c968d..69b27e9c91 100644 --- a/packages/popper/src/utils/getOffsetParent.js +++ b/packages/popper/src/utils/getOffsetParent.js @@ -15,7 +15,7 @@ export default function getOffsetParent(element) { const noOffsetParent = isIE(10) ? document.body : null; // NOTE: 1 DOM access here - let offsetParent = element.offsetParent; + let offsetParent = element.offsetParent || null; // Skip hidden elements which don't have an offsetParent while (offsetParent === noOffsetParent && element.nextElementSibling) { offsetParent = (element = element.nextElementSibling).offsetParent; diff --git a/packages/popper/tests/functional/core.js b/packages/popper/tests/functional/core.js index 92eb0834a9..d64eab2fef 100644 --- a/packages/popper/tests/functional/core.js +++ b/packages/popper/tests/functional/core.js @@ -1319,6 +1319,42 @@ const arrowSize = 5; }); }); + it('inits a popper near the reference element when it is a child of ref and the ref is relatively positioned and the ref contains svg as a first child', done => { + if (isIE10 && !positionFixed) { + pending(); + } + const ref = appendNewRef(1); + ref.style.position = 'absolute'; + ref.style.margin = '0'; + ref.style.padding = '0'; + ref.style.top = '50px'; + ref.style.left = '50px'; + ref.style.height = '100px'; + ref.style.width = '100px'; + ref.style.background = 'green'; + + ref.innerHTML = ` + + + + `; + ref.appendChild(document.createTextNode('ref')); + + const popper = appendNewPopper(2, 'popper', ref); + popper.style.margin = '0'; + popper.style.padding = '0'; + + new Popper(ref, popper, { + placement: 'bottom-start', + onCreate: data => { + expect(getRect(popper).left).toBeApprox(getRect(ref).left); + expect(getRect(popper).top).toBeApprox(getRect(ref).bottom); + data.instance.destroy(); + done(); + }, + }); + }); + it('checks that all the scrollable parents have an event listener attached', done => { jasmineWrapper.innerHTML = `