2013-09-05 12 views
6

Ho una situazione in cui ho 2 o più elementi di posizione fissi su una pagina visualizzata sovrapposta l'una sull'altra (cioè, la parte superiore del secondo si trova sul fondo del primo - nessun impilamento con z-index di quegli elementi). All'interno del primo elemento di posizione fissa, c'è un elemento assolutamente posizionato che è più alto del suo genitore fisso, quindi si estende oltre il fondo di quel genitore fisso.Z-index non si comporta come previsto con posizionamento assoluto all'interno di un elemento di posizione fissa

Il problema è che il prossimo elemento di posizione fisso viene visualizzato sopra l'elemento posizionato in modo assoluto. Ho un valore z-index più alto impostato sull'elemento posizionato in modo assoluto rispetto agli elementi posizionati fissi, ma è completamente ignorato.

Per aiutare a chiarire il problema, ho messo insieme questo esempio:

HTML

<div class="fixed first"> 
    <p>This is a fixed element</p> 
    <p class="abs"> 
     I should be displayed above both fixed position elements 
    </p> 
</div> 
<div class="fixed second"> 
    <p>This is a fixed element</p> 
</div> 

CSS

.fixed { 
    font-size: 16px; 
    background: #eee; 
    border-bottom: 1px solid #ccc; 
    position: fixed; 
    height: 3em; 
    width: 100%; 
    z-index: 1; 
} 

.abs { 
    position: absolute; 
    background: #acc; 
    height: 6em; 
    top: 0; 
    left: 25%; 
    width: 50%; 
    z-index: 2; 
} 

.second { 
    top: 3.0625em; 
} 

Ecco l'esempio lavorare su JSFiddle:

http://jsfiddle.net/GS4E4/8/

Sono un po 'perplesso da questo. Qualcuno ha una spiegazione del perché questo sta accadendo e un modo per aggirarlo?

+2

[questo ha una buona spiegazione su come funziona z-index] (http://coding.smashingmagazine.com/2009/09/15/the-z-index-css-property-a-comprehensive-look/) , poiché vedrai tutti gli elementi sullo stesso livello che hanno uno z-index avranno la precedenza su quelli dello z-index del livello secondario. Con questo in mente il tuo violino di sopra funziona come previsto – Pete

+0

Ovviamente! Ho dimenticato che ogni elemento posizionato crea il proprio contesto di impilamento. Poiché ogni elemento di posizione fissa nell'esempio ha lo stesso valore z-index, l'ordine sorgente entra in gioco. Grazie per il promemoria, Pete. –

risposta

5

Come il commento di Pete allude, tutto si riduce a contesti impilabili. In questo caso, entrambi gli elementi .fixed creano i propri contesti di impilamento in virtù dell'essere position: fixed;. Il figlio del primo elemento .fixed crea un contesto di impilamento nidificato all'interno del relativo elemento principale. Poiché è annidato all'interno di un contesto di impilamento esistente, non può mai scoppiare e impilare più in alto; il suo z-index è relativo al suo genitore ora.

La specifica è in qualche modo utile con i dettagli: http://www.w3.org/TR/CSS2/visuren.html#z-index. Puoi vedere attraverso l'elenco numerato che i contesti di accatastamento dei bambini sono dipinti ultimi morti.

Quindi nel tuo caso, l'elemento .fixed.first dovrebbe avere uno z-index di 2 per il suo figlio da impilare in cima a .fixed.second.

+0

Grazie Adam! Mi ero completamente dimenticato dei singoli contesti di impilamento degli elementi genitoriali posizionati. Con questo in mente, ho aggiornato il violino con una correzione che riflette questo: http://jsfiddle.net/GS4E4/13/ –

1

Spostare .abs fuori da entrambe le div.

<div class="fixed first"> 
    <p>This is a fixed element</p> 
</div> 
<div class="fixed second"> 
    <p>This is a fixed element</p> 
</div> 
<p class="abs"> 
     I should be displayed above both fixed position elements 
    </p> 

Vedi http://jsfiddle.net/GS4E4/9/ Il modo in cui lo avete ora .abs è posizionato rispetto al .first in modo che siederà sopra .first ma non al di sopra .second, il vostro violino sta interpretando correttamente.

+0

Grazie Irwin. Capisco che è un'opzione e, in questo semplice esempio, è una cosa facile da fare.Nel contesto dell'app a cui sto lavorando su dove si presenta questo problema, tuttavia, questa è un'opzione più difficile, in quanto il layout è molto più complesso. Lo prenderò in considerazione se non ci sono altre soluzioni ragionevoli. –

Problemi correlati