2017-03-10 2 views
3

Ich habe Probleme, meine divs ordnungsgemäß mit CSS z-index zu stapeln. In meinem Code, wenn ich .nose::before und .nose::after zu z-index: -1 setze, setzt es die zwei divs ganz hinten im Stapel. Allerdings setze ich einfach diese divs hinter die .nose div. Hier ist mein Code:stapeln von Pseudo-Elementen mit Z-Index

*, *::after, *::before { 
 
    box-sizing: border-box; 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 

 
html, body { height: 100%; } 
 

 
body { 
 
    background: #44BBA4; 
 
} 
 

 
.head { 
 
    position: absolute; 
 
    margin: auto; 
 
    top: 0; 
 
    right: 0; 
 
    bottom: 0; 
 
    left: 0; 
 
    height: 375px; 
 
    width: 400px; 
 
    background: #df9e27; 
 
    border-radius: 50%; 
 
    border: 10px solid #000; 
 
} 
 

 
.head::before, .head::after { 
 
    content: ""; 
 
    position: absolute; 
 
    height: 90px; 
 
    width: 90px; 
 
    background: #df9e27; 
 
    border-radius: 50%; 
 
    border: 10px solid #000; 
 
    z-index: -1; 
 
} 
 

 
.head::before { 
 
    top: -30px; 
 
    left: 40px; 
 
} 
 

 
.head::after { 
 
    top: -30px; 
 
    right: 40px; 
 
} 
 

 
.eye { 
 
    position: absolute; 
 
    top: 150px; 
 
    height: 25px; 
 
    width: 25px; 
 
    background: #000; 
 
    border-radius: 50%; 
 
} 
 

 
.eye.left { 
 
    left: 90px; 
 
} 
 

 
.eye.right { 
 
    right: 90px; 
 
} 
 

 
.eye::before { 
 
    content: ""; 
 
    position: absolute; 
 
    top: -50px; 
 
    left: -37px; 
 
    height: 100px; 
 
    width: 100px; 
 
    border-radius: 50%; 
 
    border: 12px solid transparent; 
 
    border-top: 12px solid #000; 
 
} 
 

 
.nose { 
 
    position: absolute; 
 
    margin: auto; 
 
    right: 0; 
 
    left: 0; 
 
    bottom: 130px; 
 
    height: 30px; 
 
    width: 30px; 
 
    background: #000; 
 
    border-radius: 50%; 
 
} 
 

 
.nose::before, .nose::after { 
 
    content: ""; 
 
    position: absolute; 
 
    height: 68px; 
 
    width: 73px; 
 
    background: #fff; 
 
    border-radius: 50%; 
 
    border: 10px solid #000; 
 
    z-index: -1; 
 
}
<div class="head"> 
 
    <div class="eye left"></div> 
 
    <div class="eye right"></div> 
 
    
 
    <div class="nose"></div> 
 
</div>

+1

Warum nicht einfach die Nase "Z-Index" auf 3 und die Vorher/Nachher auf 2? –

+0

Ja, ich habe so etwas schon mal ausprobiert, und aus irgendeinem Grund funktioniert es nicht :( –

Antwort

1

Kurz: Set Z-Index auf dem Kopfelement. Bewegen Sie die Ohren aus dem Kopfelement.

Hier ist warum.

z-index hat Stapelkontexte. Jeder dieser Kontexte hat ein Wurzelelement (irgendein HTML-Element). Nun, um ein Root-Element zu werden es mit einem der folgenden Regeln entspricht:

  • seine <html> Element
  • andere Position als static und z-index andere als auto
  • Opazität von weniger als 1

So ist der Standard-Stapelkontext mit dem <html> Element als Root.

Sobald sich das Element in einem Bereich befindet (mit anderen Worten Kind eines Stammelements), kann es nur relativ zu den Elementen innerhalb des Bereichs positioniert werden.

Denken Sie darüber nach, wie eine verschachtelte Liste.

z-index scoping list

Wrap hier ist ein Wurzelelement, da es Position relativ und Z-Index auf 1 und alle seine Kinder sind jetzt in einem Stapel Umfang mit dem Wrap als Wurzel festgelegt hat.

Also, wie in einer verschachtelten Liste, können Kinder eines bestimmten Elements nicht vor seinem Stamm angezeigt werden. Zum Beispiel Child2 kann nicht vor der Wrap erscheinen, da es innerhalb davon begrenzt ist. Aber es kann vor der Child1 erscheinen.

Nun ist die Struktur in Ihrem Fall wie folgt:

enter image description here

Beachten Sie, dass der Kopf nicht eine Wurzel ist, weil es nicht mit den Regeln nicht entspricht ein (positionierte Elemente für immer muss auch haben Z-Index anders als Auto). Deshalb, wenn Sie z-index von -1 auf die Nase :: vor und :: zuweisen, nachdem Sie diese:

enter image description here

Die Elemente den ganzen Weg hinter dem Kopf positioniert worden sind, weil sie in der gleichen Stapelbereich. Aber sie erscheinen über Head::before, denn wenn Elemente den gleichen Z-Index haben, werden sie entsprechend der Reihenfolge der Darstellung in HTML gestapelt.

Um zu verhindern, dass Kopf-Kinder dahinter erscheinen, müssen Sie den Z-Index hinzufügen.Dies macht es zu einem Grundelement eines neuen Stacking-Scopes.

enter image description here

Aber das schafft ein weiteres Problem. Jetzt sind die Ohren auf dem Kopf positioniert. Dies ist nicht mit CSS allein zu lösen, da sie sich in einem Stapelbereich des Kopfes befinden. Und Wurzel liegt immer hinter jedem seiner Kinder.

Um es zu lösen, müssen Sie die Ohren aus dem Kopf bewegen. Das bedeutet, dass Sie Pseudoelemente (vor & danach) nicht mehr verwenden können. Ich schlage vor, Ohrelemente außerhalb des Kopfes zu erstellen und alles in ein anderes Element (Bär genannt?) Mit relativer Position einzuwickeln. Wrapper wird benötigt, wenn Sie die Ohren immer noch relativ zum Kopf positionieren möchten.

Die Antwort ist meist von this article inspiriert.