Używając właściwości transform, indeks z jest anulowany i pojawia się na początku. (Podczas komentowania out -webkit-transform, z-index działa poprawnie w poniższym kodzie)
.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>
Jak współdziałają transform i z-index?
Odpowiedzi:
Przejdźmy przez to, co się dzieje. Na początek zwróć uwagę, że
z-index
na pozycjonowanych elementach itransform
samodzielnie utwórz nowe „ konteksty układania ” ” na elementach. Oto co się dzieje:Twój
.test
żywioł matransform
ustawiony na coś innego niż none, co daje mu własny kontekst stosu.Następnie dodajesz
.test:after
pseudoelement, który jest dzieckiem.test
. To dziecko maz-index: -1
, ustawienie poziomu stosu.test:after
w kontekście stosu.test
Ustawieniez-index: -1
on.test:after
nie powoduje umieszczenia go za nim,.test
ponieważz-index
ma znaczenie tylko w danym kontekście układania.Po usunięciu
-webkit-transform
z.test
niego usuwa kontekst układania, powodując.test
i.test:after
udostępniając kontekst układania (kontekst<html>
) i.test:after
przechodząc za nim.test
. Zauważ, że po usunięciu reguły.test
'-webkit-transform
możesz ponownie nadać jej własny kontekst stosu, ustawiając nowąz-index
regułę (dowolną wartość) na.test
(ponownie, ponieważ jest ustawiona)!Jak więc rozwiążemy Twój problem?
Aby indeks Z działał zgodnie z oczekiwaniami, upewnij się, że
.test
i.test:after
udostępniaj ten sam kontekst stosu. Problem polega na tym, że chcesz.test
obracać z transformacją, ale zrobienie tego oznacza utworzenie własnego kontekstu stosowego. Na szczęście umieszczenie.test
w opakowaniu do owijania i obracanie, które nadal pozwoli jego dzieciom udostępniać kontekst układania, jednocześnie obracając oba.Oto, od czego zacząłeś: http://jsfiddle.net/fH64Q/
A oto sposób na obejście kontekstów układania i utrzymanie rotacji (zwróć uwagę, że cień jest nieco odcinany z powodu
.test
białego tła):.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>
Są na to inne sposoby, nawet lepsze. Prawdopodobnie uczyniłbym tło "post-it" elementem zawierającym, a następnie umieściłbym tekst w środku, to prawdopodobnie byłaby najłatwiejsza metoda i zmniejszyłaby złożoność tego, co masz.
Zapoznaj się z tym artykułem, aby uzyskać więcej informacji na temat
z-index
kolejności układania w stosy lub działającej specyfikacji W3C CSS3 dotyczącej kontekstu układaniaźródło
Ustaw div, na którym chcesz pozostać na górze
position:relative
źródło
Miałem podobny problem, gdy rodzeństwo było
transform: translate()
iz-index
nie pracowało.Najprostszym rozwiązaniem jest ustawienie
position: relative
na całe rodzeństwo, a potemz-index
znowu zadziała.źródło
Szybka naprawa: Możesz po prostu obrócić drugi element o 0 stopni.
źródło
transform:rotate(0.0rad)
go naprawiło. Nie mogłem go zastosować za pomocą reguły css, musiał on znajdować się bezpośrednio na elemencie. To NIE ma sensu, ale dziękuję za opublikowanie odpowiedzi, która skłoniła mnie do spróbowania.Miałem podobny problem. To, co zrobiłem, to dodałem element div opakowujący wokół testu i przekazałem właściwość transform do elementu div wrapper.
.wrapper{ transform: rotate(10deg); }
tutaj jest skrzypce http://jsfiddle.net/KmnF2/16/
źródło
Ustaw div, na którym chcesz pozostać na górze, na pozycję: bezwzględną
źródło