La plupart des réponses sont erronées; certains travaillent, mais pas pour la raison qu'ils disent. Voici quelques explications.
Voici comment z-index devrait fonctionner selon the spec:
- vous pouvez donner une valeur
z-index
à tout élément; si vous ne le faites pas, la valeur par défaut auto
- éléments positionnés (qui est, avec des éléments d'un
position
attribut différent de la valeur par défaut static
) avec un z-index
différent de auto
créer un nouveau contexte d'empilement . Les contextes d'empilement sont les «unités» de chevauchement; un contexte d'empilement est soit complètement au-dessus de l'autre (c'est-à-dire que chaque élément du premier est au-dessus de tout élément du second), soit complètement au-dessous.
- Dans le même contexte d'empilement, le niveau de pile des éléments est comparé. Les éléments ayant une valeur explicite
z-index
ont cette valeur au niveau de la pile, les autres éléments héritent de leurs parents. L'élément avec le niveau de pile supérieur est affiché en haut. Lorsque deux éléments ont le même niveau de pile, généralement celui qui est plus tard dans l'arborescence DOM est peint en haut. (Règles plus complexes appliquent si elles ont un attribut position
différent.)
En d'autres termes, lorsque deux éléments ont z-index
ensemble, afin de décider qui affichera sur le dessus, vous devez vérifier si elles en ont positionné les parents qui ont également z-index
ensemble. Si ce n'est pas le cas, ou si les parents sont communs, celui qui a le plus grand z-index gagne. S'ils le font, vous devez comparer les parents, et le z-index
des enfants est hors de propos.
Ainsi, le z-index
décide comment l'élément est placé par rapport aux autres enfants de son « parent empilage » (l'ancêtre le plus proche avec un z-index
ensemble et un position
de relative
, absolute
ou fixed
), mais il n'a pas d'importance lorsque l'on compare à d'autres éléments; c'est le z-index
du parent de l'empilage (ou éventuellement le z-index
du parent empilable du parent de l'empilage, et cetera) qui compte. Dans un document typique où vous utilisez z-index
seulement sur quelques éléments comme les menus déroulants et les popups, dont aucun ne contient l'autre, le parent empileur de tous les éléments qui ont un z-index
est le document entier, et vous pouvez habituellement sortir avec la pensée du z-index
en tant que commande globale au niveau du document.
La différence fondamentale avec IE6/7 est que les éléments positionnés démarrent de nouveaux contextes d'empilement, qu'ils aient z-index
ou non. Puisque les éléments auxquels vous attribuez instinctivement des valeurs z-index
sont généralement positionnés de façon absolue et ont un parent relativement proche ou un ancêtre proche, cela signifie que vos éléments z-index
ne seront pas comparés du tout, mais que leurs ancêtres positionnés seront - et depuis ceux qui n'ont pas d'index z, l'ordre des documents prévaudra. Pour contourner le problème, vous devez trouver les ancêtres qui sont effectivement comparés et leur attribuer un index z pour restaurer l'ordre souhaité (qui sera généralement l'ordre inverse des documents). Habituellement, cela est fait par javascript - pour un menu déroulant, vous pouvez parcourir les conteneurs de menu ou les éléments de menu parent, et leur attribuer un z-index
de 1000, 999, 998 et ainsi de suite. Une autre méthode: quand un menu déroulant ou une liste déroulante devient visible, trouvez tous ses ancêtres relativement positionnés, et donnez-leur une classe on-top
qui a un z-index très élevé; quand il redevient invisible, supprimez les classes.
Ironiquement, cela fonctionne très bien dans IE8 – Chris