I am trying to do positioning in JavaScript. I am using a cumulative position function based on the classic quirksmode function that sums offsetTop
and offsetLeft
for each offsetParent
until the top node.
However, I am running into an issue where the element I'm interested in has no offsetParent
in Firefox. In IE offsetParent
exists, but offsetTop
and offsetLeft
all sum up to 0, so it has the same problem in effect as in Firefox.
What would cause an element that is clearly visible and usable on the screen to not have an offsetParent
? Or, more practically, how can I find the position of this element in order to place a drop-down beneath it?
Edit: Here's how to reproduce one particular instance of this (not solved by the currently-accepted answer):
Run the following code in the Console of the web browser (e.g. Chromev21):
var e = document.querySelector('div');
console.log(e);
// <div id="notify-container"></div>
do{
var s = getComputedStyle(e);
console.log(e.tagName,s.display,s.visibility,s.position,e.offsetParent);
} while(e=e.parentElement)
// DIV block visible fixed null
// BODY block visible static null
// HTML block visible static null
Why is the offsetParent
of that element null
?
I have made a test of 2,304 divs with unique combinations of values for position
, display
, and visibility
, nested inside unique combinations of each of those values, and determined that:
an otherwise-valid element
that is a descendant of <body>
will not have an offsetParent
value if:
position:fixed
(Webkit and IE9)display:none
(Webkit and FF)display:none
(Webkit and FF)It is also reasonable to expect that an element that has no parent, or that is not added to the page itself (is not a descendant of the <body>
of the page), will also have offsetParent==null
.
If the document hasn't finished loading then offsetParent can be null
https://developer.mozilla.org/en/DOM/element.offsetParent
offsetParent returns null when the element has style.display set to "none".
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With