Normalerweise schaltet mein Gehirn ab, wenn ich Begriffe wie „Malreihenfolge“ oder „Stacking Context“ höre, und meine Augen werden glasig. Nicht, dass mein Gehirn nicht sowieso öfter abschaltet, aber das ist ein anderes Thema für ein anderes Mal.
Martin Robinson von Igalia geht auf diese Konzepte ein und verwendet ein Beispiel, das ziemlich leicht zu verstehen ist, selbst für mich. Er beginnt mit zwei sich überlappenden Feldern mit negativen Rändern.
<div class="blue box">1</div>
<div class="green box">2</div>

Dann führt er ein drittes Feld ein, das ein Kind des grünen Feldes ist. Dem grünen Feld wird ein z-index von -1 zugewiesen. Wie zu erwarten, stapeln sich sowohl das grüne als auch das gelbe Feld unter dem blauen Feld.
<div class="blue box">0</div>
<div class="green box" style="position: relative; z-index: -1;">-1
<div class="yellow box">-1</div>
</div>

Hier begann mein Gehirn zu schmelzen. Wenn der z-index des grünen Feldes bei -1 bleibt, wir seinem Kind aber einen massiven Wert zuweisen, sagen wir 1.000, sieht alles ... genau gleich aus.
<div class="blue box">0</div>
<div class="green box" style="position: relative; z-index: -1;">-1
<div class="yellow box" style="position: relative; z-index: 1000;">1000</div>
</div>

Ich bin sicher, viele von Ihnen können bereits erraten (oder wissen es einfach), warum das blaue Feld oben bleibt, obwohl die Änderung des z-index des gelben Feldes impliziert, dass es stattdessen oben sein sollte, aber ich tat es sicher nicht. Martin fand die technische Antwort in der CSS2-Spezifikation, tief vergraben in Anhang E, den er dankenswerterweise verlinkt hat – sonst hätte ich ihn sicher nie gefunden.
Wir lernen aus Anhang E, dass ein Stacking Context eine atomar gemalte Sammlung von Seitenelementen ist. Was bedeutet das? Vereinfacht ausgedrückt bedeutet es, dass Dinge innerhalb eines Stacking Contexts zusammen als Einheit gemalt werden und dass Elemente außerhalb des Stacking Contexts niemals dazwischen gemalt werden. Ein aktiver
z-indexist eine der Situationen in CSS, die die Erstellung eines Stacking Contexts auslösen. Gibt es eine Möglichkeit, unser obiges Beispiel so anzupassen, dass das dritte Element zum selben Stacking Context wie die ersten beiden Elemente gehört? Die Antwort ist, dass wir es aus dem vom zweiten Element erstellten Stacking Context entfernen müssen.
Also, ja. Solange das gelbe Feld ein Kind des grünen Feldes ist, bilden die beiden einen Stacking Context, an dem das blaue Feld keinen Anteil hat. Damit Gelb über Blau kommt, muss es aus Grüns Stacking Context entfernt werden.

Das ist der Kern von Martins Beitrag, aber er geht noch weiter und es lohnt sich, dorthin zu gehen. Wenn Sie das tun, werden Sie sehen, wie die Stapelreihenfolge zu einigen echten CSS-Tricks führt.

Es ist nicht das erste Mal, dass wir Beweise dafür verlinkt haben, dass z-index kein ebenes Spielfeld ist, daher werde ich versuchen, mir das für das nächste (und unvermeidliche) Mal, wenn ich mit dem Stapeln von Elementen kämpfe, einzuprägen.
Ich bin neu im Programmieren und versuche, alles zu lernen, was ich kann. Das hat mir bei dem geholfen, was ich gerade versuche zu tun. Danke.
Sehr guter Beitrag. Ich musste das Original überprüfen, um wirklich zu verstehen, worum es ging, denn ohne den Code am Anfang war es etwas schwierig zu begreifen.
Danach war es ziemlich offensichtlich, dass, wenn man 2 Elemente innerhalb desselben Divs (oder irgendeines Containers) hat, mit darin enthaltenen Elementen mit einem bestimmten z-index, der z-index jedes Elements innerhalb dieses Wrappers im Grunde nur innerhalb des Wrappers (des oben genannten Divs) gilt.
Aber ja, diese Szenarien lassen sich besser mit etwas Code erklären, sonst sind sie am Ende etwas schwer zu greifen.
Danke für den aufschlussreichen Beitrag!
Hilfreich
Aber wenn das Kind position:absolute; hätte, wäre es oben, glaube ich?!
Ja, deshalb brauchen wir einen echten absoluten Index, da der aktuelle relativ ist und nicht alle Lebensfälle abdeckt. Oft braucht man einfach einen absoluten zindex.
A – 1
B – 0
B.C – 1000
Dann wäre B.C über allem. Aktuell müsste man das DOM manipulieren, aber das kann man nicht immer tun, besonders mit modernen datengesteuerten Frameworks.
Ich würde die Eigenschaft „absolute-z-index“ vorschlagen.
Sind
z-indexrelativ zum Stacking Context?Das wäre mein TLDR, wenn ich es richtig verstanden habe.