La mayoría de las respuestas aquí están equivocados; algo de trabajo, pero no por la razón que dicen. Aquí hay alguna explicación.
Esta es la forma en z-index debe trabajar de acuerdo a the spec:
- le puede dar un valor
z-index
a cualquier elemento; si no lo hace, el valor predeterminado es auto
- elementos posicionados (es decir, los elementos con un
position
atribuyen distinto del predeterminado static
) con un z-index
diferente de auto
crear un contexto nuevo apilamiento. Los contextos de apilamiento son las "unidades" de superposición; un contexto de apilamiento está completamente por encima del otro (es decir, cada elemento de la primera está por encima de cualquier elemento de la segunda) o está completamente debajo de él.
- dentro del mismo contexto de apilamiento, el nivel pila de los elementos se compara. Los elementos con un valor explícito
z-index
tienen ese valor como un nivel de pila, otros elementos heredan de sus padres. El elemento con el nivel de pila más alto se muestra en la parte superior. Cuando dos elementos tienen el mismo nivel de pila, generalmente el que está más tarde en el árbol DOM está pintado en la parte superior. (Reglas más complicadas aplicar si tienen un atributo diferente position
.)
En otras palabras, cuando dos elementos tienen z-index
conjunto, a fin de decidir que se mostrará en la parte superior, es necesario comprobar si tienen alguna posicionado padres que también tienen z-index
conjunto. Si no lo hacen, o si los padres son comunes, gana el que tiene un mayor índice z. Si lo hacen, debe comparar a los padres, y el z-index
de los niños es irrelevante.
Así que la z-index
decide cómo se coloca el elemento de comparación con otros niños de su "padre" de apilamiento (el antepasado más cercano con un conjunto z-index
y una position
de relative
, absolute
o fixed
), pero eso no importa cuando se comparan a otros elementos; es de los padres de apilamiento z-index
(o posiblemente la z-index
de matriz de apilamiento de los padres de apilamiento, etcétera) que cuenta. En un típico documento en el que utiliza z-index
sólo en algunos elementos como los menús y ventanas emergentes desplegables, ninguno de los cuales contiene el otro, el padre de apilamiento de todos los elementos que tienen un z-index
es todo el documento, y por lo general puede conseguir lejos con el pensamiento del z-index
como un pedido global a nivel de documento.
La diferencia fundamental con IE6/7 es que los elementos posicionados iniciar nuevos contextos de apilamiento, si tienen z-index
conjunto o no. Dado que los elementos que le instintivamente asignar valores a z-index
suelen posición absoluta y tienen un padre en posición relativa o cercano antepasado, esto significará que sus elementos z-index
-ed no se pueden comparar en absoluto, en lugar de sus antepasados posicionados hará - y desde aquellos que no tienen un conjunto z-index, prevalecerá el orden del documento.
Como solución alternativa, debe averiguar qué antepasados se comparan realmente y asignarles un índice z para restaurar el orden que desee (que generalmente será el orden inverso de los documentos). Por lo general, esto se hace mediante javascript - para un menú desplegable, se puede caminar a través de los contenedores de menú o elementos del menú principal, y asignarles un z-index
de 1000, 999, 998 y así sucesivamente. Otro método: cuando un menú emergente o desplegable se vuelve visible, encuentre todos sus ancestros relativamente posicionados y asígneles una clase on-top
que tenga un índice z muy alto; cuando se vuelve invisible de nuevo, elimina las clases.
Irónicamente funciona muy bien en IE8 – Chris