Usando la propiedad de transformación, el índice z se cancela y aparece en el frente. (Al comentar -webkit-transform, z-index funciona correctamente en el siguiente código)
.test {
width: 150px;
height: 40px;
margin: 30px;
line-height: 40px;
position: relative;
background: white;
-webkit-transform: rotate(10deg);
}
.test:after {
width: 100px;
height: 35px;
content: "";
position: absolute;
top: 0;
right: 2px;
-webkit-box-shadow: 0 5px 5px #999;
/* Safari and Chrome */
-webkit-transform: rotate(3deg);
/* Safari and Chrome */
transform: rotate(3deg);
z-index: -1;
}
<html>
<head>
<title>transform</title>
<link rel="stylesheet" type="text/css" href="transformtest.css">
</head>
<body>
<div class="test">z-index is canceled.</div>
</body>
</html>
¿Cómo funcionan la transformación y el índice z juntos?
Respuestas:
Repasemos lo que está ocurriendo. Para empezar, tenga
z-index
en cuenta que en elementos posicionados ytransform
por sí mismo crea nuevos " contextos de apilamiento " en elementos. Esto es lo que está pasando:Su
.test
elemento se hatransform
establecido en algo diferente a ninguno, lo que le da su propio contexto de apilamiento.Luego agrega un
.test:after
pseudo-elemento, que es hijo de.test
. Este hijo tienez-index: -1
, establecer el nivel de pila.test:after
dentro del contexto de apilamiento de.test
Settingz-index: -1
on.test:after
no lo coloca detrás.test
porquez-index
solo tiene significado dentro de un contexto de apilamiento dado.Cuando eliminas
-webkit-transform
de.test
él, se elimina su contexto de apilamiento, lo que provoca.test
y.test:after
comparte un contexto de apilamiento (el de<html>
) y hace que se.test:after
quede atrás.test
. Tenga en cuenta que después de eliminar.test
la-webkit-transform
regla puede, una vez más, darle su propio contexto de apilamiento estableciendo una nuevaz-index
regla (cualquier valor) en.test
(nuevamente, porque está posicionada).Entonces, ¿cómo resolvemos tu problema?
Para obtener z-index de trabajo de la forma esperada, asegúrese de que
.test
y.test:after
compartir el mismo contexto de pila. El problema es que desea.test
rotar con transform, pero hacerlo significa crear su propio contexto de apilamiento. Afortunadamente, colocarlo.test
en un contenedor de envoltura y rotarlo permitirá que sus hijos compartan un contexto de apilamiento al mismo tiempo que rotan ambos.Esto es lo que empezó con: http://jsfiddle.net/fH64Q/
Y aquí hay una forma en que puede sortear los contextos de apilamiento y mantener la rotación (tenga en cuenta que la sombra se corta un poco debido al
.test
fondo blanco):.wrapper { -webkit-transform: rotate(10deg); } .test { width: 150px; height: 40px; margin: 30px; line-height: 40px; position: relative; background: white; } .test:after { width: 100px; height: 35px; content: ""; position: absolute; top: 0; right: 2px; -webkit-box-shadow: 0 5px 5px #999; /* Safari and Chrome */ -webkit-transform: rotate(3deg); /* Safari and Chrome */ transform: rotate(3deg); z-index: -1; }
<div class="wrapper"> <div class="test">z-index is canceled.</div> </div>
Hay otras formas de hacer esto, incluso mejores formas. Probablemente haría del fondo "post-it" el elemento que lo contiene y luego pondría el texto dentro, que probablemente sería el método más fácil y reduciría la complejidad de lo que tienes.
Consulte este artículo para obtener más detalles sobre el
z-index
orden de apilamiento, o la especificación W3C CSS3 de trabajo sobre el contexto de apilamientofuente
Establezca el div que desea permanecer en la parte superior
position:relative
fuente
Tuve un problema similar en el que los hermanos estaban siendo
transform: translate()
maltratados yz-index
no trabajaban.La solución más sencilla es establecer
position: relative
en todos los hermanos, luegoz-index
funcionaría nuevamente.fuente
Solución rápida: también puede girar el otro elemento 0 grados.
fuente
transform:rotate(0.0rad)
solucionó. No pude aplicarlo a través de una regla css, tenía que estar directamente en el elemento. Esto NO tiene sentido, pero gracias por publicar la respuesta que me hizo intentarlo.Estaba enfrentando un problema similar. Lo que hice fue agregar un div contenedor alrededor de la prueba y le di la propiedad de transformación al div contenedor.
.wrapper{ transform: rotate(10deg); }
aquí está el violín http://jsfiddle.net/KmnF2/16/
fuente
Establezca el div que desea permanecer en la parte superior en la posición: absoluta
fuente