Perché z-index non funziona?


181

Quindi, se ho capito z-indexbene, sarebbe perfetto in questa situazione:

inserisci qui la descrizione dell'immagine

Voglio posizionare l'immagine in basso (il tag / card) sotto il div sopra di esso. Quindi non puoi vedere i bordi taglienti. Come faccio a fare questo?

z-index:-1 // on the image tag/card

o

z-index:100 // on the div above

non funziona neanche. Né una combinazione di niente del genere. Come mai?

Risposte:


433

La z-indexstruttura funziona solo su elementi con un positionvalore diverso static(ad esempio position: absolute;, position: relative;o position: fixed).

C'è anche position: sticky;che è supportato in Firefox, ha il prefisso Safari, ha funzionato per un po 'nelle versioni precedenti di Chrome con un flag personalizzato ed è in fase di esame da parte di Microsoft per aggiungerlo al proprio browser Edge.

Importante
Per un posizionamento regolare, assicurarsi di includere position: relativesugli elementi in cui è stato impostato anche z-index. Altrimenti, non avrà effetto.



3
aggiungendo a questa risposta, Chrome e probabilmente altri browser al momento della stesura richiedono di dichiarare esplicitamente il funzionamento position: relativedi z-index, nonostante gli elementi si
comportino

staticgli elementi sono statici e non possono muoversi all'interno x, y or z planes. Non possono muoversi x plane (left or right)o y plane (top or bottom)piacere quando lavoriamo con position: absolute. E nemmeno possono muoversi nel z plane i.e. with z-index.
Akash

sei a conoscenza di eventuali problemi con l'utilizzo z-indexin un elemento griglia ??
Oldboy il

59

Se imposti la posizione su un valore diverso da staticma l'elemento z-indexnon sembra funzionare, è possibile che sia stato z-indeximpostato un elemento padre .

I contesti di sovrapposizione hanno una gerarchia e ogni contesto di sovrapposizione viene considerato nell'ordine di sovrapposizione del contesto di sovrapposizione del genitore.

Quindi con il seguente html

div { border: 2px solid #000; width: 100px; height: 30px; margin: 10px; position: relative; background-color: #FFF; }
#el3 { background-color: #F0F; width: 100px; height: 60px; top: -50px; }
<div id="el1" style="z-index: 5"></div>
<div id="el2" style="z-index: 3">
  <div id="el3" style="z-index: 8"></div>
</div>

Non importa quanto grande sia il z-indexdi el3sarà impostato, sarà sempre sotto il el1perché del genitore ha contesto di stratificazione inferiore. Puoi immaginare l'ordine di sovrapposizione come livelli in cui l'ordine di sovrapposizione el3è in realtà 3,8 che è inferiore a 5 .

Se vuoi controllare i contesti di impilamento degli elementi padre, puoi usare questo:

var el = document.getElementById("#yourElement"); // or use $0 in chrome;
do {
    var styles = window.getComputedStyle(el);
    console.log(styles.zIndex, el);
} while(el.parentElement && (el = el.parentElement));

C'è un ottimo articolo sugli stacking di contesti su MDN


come risolverlo?
SM Pat

3
imposta il corretto indice z degli elementi padre.
Buksy,

Adoro quella sceneggiatura
Matoeil,

31

I tuoi elementi devono avere un positionattributo. (ad es absolute. relative, fixed) o z-indexnon funzionerà.


26

In molti casi un elemento deve essere posizionato per z-indexfunzionare.

In effetti, applicare position: relativeagli elementi nella domanda probabilmente risolverebbe il problema (ma non c'è abbastanza codice fornito per saperlo con certezza).

In realtà, position: fixed, position: absolutee position: stickypermetterà anche z-index, ma quei valori cambiarne anche il layout. Con position: relativeil layout non è disturbato.

In sostanza, purché l'elemento non sia position: static(impostazione predefinita), viene considerato posizionato e z-indexfunzionerà.


Molte risposte a "Perché non funziona z-index?" le domande affermano che funziona z-index solo su elementi posizionati. A partire da CSS3, questo non è più vero.

Gli elementi che sono elementi flessibili o elementi della griglia possono essere utilizzati z-indexanche quando lo positionsono static.

Dalle specifiche:

4.3. Articolo flessibile Z-Ordering

Gli articoli Flex dipingono esattamente come i blocchi incorporati, tranne per il fatto che l'ordine di documento modificato dall'ordine viene utilizzato al posto dell'ordine di documento non elaborato e z-indexvalori diversi dalla autocreazione di un contesto di sovrapposizione, anche se lo positionè static.

5.4. Ordinazione dell'asse Z: la z-indexproprietà

L'ordine di disegno degli elementi della griglia è esattamente lo stesso dei blocchi incorporati, tranne per il fatto che l'ordine di documento modificato dall'ordine viene utilizzato al posto dell'ordine di documento non elaborato e z-indexvalori diversi dalla autocreazione di un contesto di sovrapposizione anche se lo positionè static.

Ecco una dimostrazione di come z-indexlavorare su oggetti flessibili non posizionati: https://jsfiddle.net/m0wddwxs/


3
"Gli elementi che sono elementi flessibili o elementi della griglia possono utilizzare z-index anche quando la posizione è statica." Sì, la specifica dice essenzialmente di trattare position: staticesattamente lo stesso che tratterebbe position: relativeper gli elementi flex e grid a causa della natura dinamica di quei metodi di layout. Quindi forse direi che non è più vero in CSS3 che un elemento deve essere posizionato, ma che CSS3 considera gli elementi flessibili e della griglia come se fossero posizionati, a prescindere. Solo due modi di vedere la stessa cosa, però, probabilmente.
TylerH,

@TylerH dovremmo prestare attenzione a quella parte della specifica perché dovremmo considerare statico lo stesso di relativo solo quando abbiamo a che fare con z-index e non in generale. Ad esempio, non è possibile spostare un oggetto flessibile usando sinistra / alto / basso / destro a meno che non sia esplicitamente specifico position:relative. I discendenti di oggetti flessibili con posizione assoluta non considereranno l'oggetto flessibile come il loro blocco contenitore perché l'elemento flessibile non è posizionato. ( Jsfiddle.net/0yo7utfL/2 )
Temaniti Afif

ho trovato un "bug" strano con css. per qualche motivo overflow-y: scrollimpedisce overflow-x: visibledi funzionare ... puoi per favore dare un'occhiata?
Oldboy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.