2008-11-20 13 views
12

Estoy tratando de hacer posicionamiento en JavaScript. Estoy usando una función de posición acumulada basada en classic quirksmode function que suma offsetTop y offsetLeft para cada offsetParent hasta el nodo superior.¿Qué haría que offsetParent sea nulo?

Sin embargo, me encuentro con un problema donde el elemento que me interesa no tiene offsetParent en Firefox. En IE offsetParent existe, pero offsetTop y offsetLeft todos suman hasta 0, por lo que tiene el mismo problema en vigor que en Firefox.

¿Qué causaría que un elemento que es claramente visible y utilizable en la pantalla no tenga un offsetParent? O, más prácticamente, ¿cómo puedo encontrar la posición de este elemento para colocar un menú desplegable debajo?

Editar: He aquí cómo reproducir un caso particular de este (no resuelto por la respuesta aceptada actualmente):

  1. Abra la home page of Stack Overflow.
  2. ejecute el código siguiente en la consola del navegador web (por ejemplo 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 
    

¿Por qué es el offsetParent de ese elemento null?

+1

Por favor, publique código de muestra. –

+1

Un ejemplo del mundo real que muestra el elemento defectuoso ayudaría ... – PhiLho

+0

En su caso, es debido a 'posición: fijo' - no hay matriz de diseño – Bergi

Respuesta

15

Si el documento no ha terminado de cargar a continuación offsetParent puede ser nulo

0

se han topado con este problema cuando el hermano justo a la izquierda del elemento está oculto:

<div id="parent"> 
    <div id="element1">some stuff</div> 
    <div id="element2" style="display: none">some hidden stuff</div> 
    <div id="element3">child whose offset we want</div> 
</div> 

me he encontrado con el caso en que el offsetParent de elemento3 es nulo aunque elemento3 sí mismo es visible, y padre es visible.

que he visto delgado es Firefox 3.6 y Chrome 5. Parece afectar también la getBoundingClientRect() función en el Element3, que es realmente molesto, ya que funciona en tantos otros casos!

11

https://developer.mozilla.org/en/DOM/element.offsetParent

offsetParent devuelve un valor nulo cuando el elemento tiene style.display establecido en "Ninguno".

+2

Por mi respuesta a continuación, he editado la página MDN para observar que hay otras situaciones para navegadores que no son FF que también causan la situación. – Phrogz

4

offsetParent devolverá nulo si aún no se ha agregado su objeto de elemento al DOM.

36

he hecho a test of 2,304 divs con combinaciones únicas de valores para position, display, y visibility, anidado dentro de combinaciones únicas de cada uno de esos valores, y ha determinado que:

un elemento de otra manera válida
que es un descendiente de <body>
no va a tener un valor offsetParent si:

  • El elemento tiene position:fixed (Webkit e IE9)
  • El elemento tiene display:none (Webkit y FF)
  • Cualquier ancestro ha display:none (Webkit y FF)

También es razonable esperar que un elemento que no tiene padre, o que no se agrega a la página en sí (no es un descendiente del <body> de la página), también tendrá offsetParent==null.

+0

¡Me salvó, gracias! – SeanKendle

Cuestiones relacionadas