2008-11-20 13 views
12

Sto provando a fare il posizionamento in JavaScript. Sto utilizzando una funzione di posizione cumulativa basata sullo classic quirksmode function che somma offsetTop e offsetLeft per ogni offsetParent fino al nodo superiore.Che cosa renderebbe offsetParent null?

Tuttavia, sto riscontrando un problema in cui l'elemento che mi interessa non ha offsetParent in Firefox. In IE offsetParent esiste, ma offsetTop e offsetLeft tutto sommato a 0, quindi ha lo stesso problema in vigore come in Firefox.

Che cosa potrebbe causare un elemento che è chiaramente visibile e utilizzabile sullo schermo per non avere un offsetParent? O, più in pratica, come posso trovare la posizione di questo elemento al fine di posizionare un menu a discesa al di sotto di esso?

Edit: Ecco come riprodurre un caso particolare di questo (non risolto dalla risposta correntemente accettata):

  1. Aprire il home page of Stack Overflow.
  2. eseguire il seguente codice nella console del browser web (per esempio 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 
    

Perché è la offsetParent di quell'elemento null?

+1

Si prega di inviare alcuni codice di esempio. –

+1

Un esempio reale che mostra l'elemento difettoso potrebbe aiutare ... – PhiLho

+0

Nel tuo caso, è a causa di 'position: fixed' - non c'è layout parent – Bergi

risposta

15

Se il documento non è terminato il caricamento quindi offsetParent può essere nullo

0

Ho eseguito in questo problema quando il fratello appena a sinistra dell'elemento è nascosta:

<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> 

ho incontrato il caso in cui l'offsetParent di element3 è nullo anche se elemento3 è visibile e genitore è visibile.

ho visto sottile è Firefox 3.6 e Chrome 5. sembra influenzare anche la getBoundingClientRect() funzione sul element3, che è davvero fastidioso in quanto funziona in tanti altri casi!

4

offsetParent restituirà null se il tuo oggetto elemento non è stato ancora aggiunto al DOM.

36

Ho fatto a test of 2,304 divs con combinazioni uniche di valori per position, display e visibility, annidato all'interno combinazioni uniche di ciascuno di questi valori, e determinato che:

un elemento altrimenti valido
che è un discendente di <body>
non avrà un valore offsetParent se:

  • L'elemento ha position:fixed (Webkit e IE9)
  • L'elemento ha display:none (Webkit e FF)
  • Qualunque antenato ha display:none (Webkit e FF)

È anche ragionevole aspettarsi che un elemento che non ha un genitore o che non è stato aggiunto alla pagina stessa (non è un discendente dello <body> della pagina), avrà anche offsetParent==null.

+0

Mi ha salvato, grazie! – SeanKendle

Problemi correlati