Das Verwalten von z-index über große Websites hinweg kann eine echte Qual sein. CSS ist schwer zu testen, daher ist es notorisch einfach, eine Änderung vorzunehmen, die dazu führt, dass beispielsweise eine wichtige Benutzeroberfläche unter etwas Verstecktes verschwindet.
Wenn Sie einen CSS-Präprozessor verwenden, können wir es vielleicht auf eine spezielle Weise handhaben.
Eine Idee aus der Spieleprogrammierung
Die vertikale Stapelreihenfolge ist nicht nur ein Problem für das Webdesign, sondern auch ein Hauptproblem für Spieleentwickler. Sie arbeiten in noch dynamischeren Umgebungen, in denen es entscheidend ist, welche Dinge über anderen erscheinen.

In einem kurzen Gespräch mit Ryan Campbell, der sich in die Welt der Spiele einarbeitet, sagte er, dass die übliche Methode eine Enum-Variable (ähnlich einem benannten Array von Konstanten) sei, auf die man dann bei Bedarf verweist.
Hier ist ein Beispiel für Code, den er verwenden könnte
typedef enum : uint16_t {
WorldLayerGround = 100,
WorldLayerBelowCharacter = 200,
WorldLayerAboveCharacter = 400,
WorldLayerTop = 800,
WorldLayerCount = 1600
} WorldLayer;
Das ist in einer Datei definiert, die der Deklaration von Konstanten für das Spiel gewidmet ist. Beachten Sie, wie
- Sie sind alle zusammen deklariert
- Zwischen den Zahlen ist Platz gelassen
Es ist ziemlich üblich, dass Leute auch im Webdesign z-index in Hunderterbereichen nummerieren. Die Idee ist, dass man später etwas dazwischen schieben könnte, wenn nötig, was bei 1, 2, 3 usw. nicht möglich wäre, da z-index keine Dezimalzahlen unterstützt. Aber selten sieht man z-index so gruppiert deklariert. Klingt für mich nach einer cleveren Idee!
Gruppierung
Die Idee ist, dass der gesamte Code, der die vertikale Stapelung steuert, an einem Ort ist. Sie könnten all diese Dinge zusammenlegen.
.modal {
z-index: 9000;
}
.overlay {
z-index: 8000;
}
.header {
z-index: 7000;
}
Aber davon bin ich kein großer Fan. Ich mag es nicht, Selektoren in Stylesheets zu duplizieren, nur zur Organisation. Nur eine persönliche Vorliebe. Wenn ich finde, wo eine Klasse definiert ist, sind dort alle Dinge, die diese Klasse tut.
Vielleicht können wir dasselbe tun, aber nur mit den Werten...

Ein z-index Partial
Vielleicht ist die mit Abstand nützlichste Funktion von Präprozessoren die Möglichkeit, Includes zu nutzen. Mehrere Dateien zu einer einzigen Ausgabedatei zusammenzufügen. Das bedeutet, Sie können Ihr CSS so organisieren, wie es für Sie am sinnvollsten ist, was fast sicher bedeutet, es in kleine, modulare Teile zu zerlegen.
Vielleicht haben Sie bereits eine variables.styl oder constants.less oder so etwas. Sie könnten noch modularer werden und eine Datei nur zur Verwaltung von z-index haben. In SCSS beginnen die typischen Namenskonventionen für Dateien, die nur zum Einbinden gedacht sind, mit einem Unterstrich, also würden wir eine _zindex.scss erstellen.
In dieser Datei würden Sie Variablen deklarieren, die alle z-index-Werte enthalten, die Sie auf der gesamten Website verwenden.
$zindexModal : 9000;
$zindexOverlay : 8000;
$zindexHeader : 7000;
Dann haben Sie in Ihrer globalen Sammlung von Includes für andere SCSS-Dateien immer Folgendes verfügbar
@import "zindex";
Und verwenden Sie sie nach Bedarf
.header {
z-index: $zindexHeader;
}
Die Idee wäre, **diese Sache voll durchzuziehen**. Deklarieren Sie z-index nirgendwo, ohne dafür eine Variable zu erstellen und sie im Stack in der Datei _zindex.scss zu platzieren.
Maps könnten sauberer sein
Gleiche Idee, aber unter Verwendung einer Sass-Map anstelle einzelner globaler Variablen
$zindex: (
modal : 9000,
overlay : 8000,
dropdown : 7000,
header : 6000,
footer : 5000
);
.header {
z-index: map-get($zindex, header);
}
Ich denke, ich werde Websites auf dieses System umstellen. Ich sehe keine Nachteile und viele Vorteile.
Wow, ich finde diese Idee wirklich gut, besonders für große Projekte, an denen mehrere Entwickler arbeiten. Wann immer ich auf ein z-index-Problem stoße und einen Wert ändern muss, mache ich mir Sorgen, dass der von mir geänderte Wert im Zusammenhang mit einem anderen Element irgendwo anders auf der Website/App gesetzt wurde, von dem ich nichts weiß, und oft führt das Ändern eines z-index-Werts zur Lösung eines Problems nur zu einem anderen Problem irgendwo anders. Es ist wirklich einfach, den Überblick darüber zu verlieren, welche Werte was bewirken, und das würde sehr helfen. Ich nehme an, wenn diese Technik nicht verwendet wird, könnte ich zumindest einen Kommentar hinzufügen, der den Wert und die anderen Elemente erklärt, mit denen er korreliert.
Danke für die Idee, Bruder!
Diese Idee ist bereits in Twitter Bootstrap im Einsatz.
Das ist auch der Grund, warum ich es zuerst übernommen habe, und es ist ein großartiges System. Macht die Fehlersuche bei z-index viel einfacher.
Tolle Idee – ich würde definitiv eine Map verwenden und eine Funktion schreiben, um später Tipparbeit zu sparen
Dann
Das habe ich noch nie gesehen und ich bin fasziniert!
Können Sie es mir erklären?
Was genau macht eine Map?
Woher haben Sie das alles gelernt?
Vor etwa 6 Monaten bin ich auf die Verwendung von Sass-Variablen für z-index umgestiegen und habe die Entscheidung keine Sekunde bereut. Anfangs bekamen wir einige Fragen von unseren Entwicklern, warum wir Variablen für Einzelzwecke erstellen, aber als ich die Vorteile der Vermeidung von Stapelkonflikten erklärte, ging ihnen ein Licht auf. Dies macht die Arbeit mit z-index einfach schmerz- und problemfrei.
Da gibt es einen Tippfehler: „Maybe ou already have a variables.styl“ sollte „Maybe you already have a variables.styl“ lauten.
Diese Idee gefällt mir sehr gut. Ich weiß, dass Bootstrap auch diesen Ansatz verwendet. Wir haben ihn auch in unsere eigene Codebasis bei der Arbeit übernommen.
Wenn Sie einen dokumentierten Programmierstil haben, hilft ein Hinweis auf diese Technik anderen Entwicklern, sodass Sie keine zufälligen Fälle finden, in denen z-index nicht nach diesem Ansatz verwendet wird, der sich durch Ihren Code zieht.
Großartig! Ich finde es toll, dass jemand mit so viel Einfluss wie Sie endlich einen vorgeschlagenen z-index-Standard dargelegt hat. Mir gefällt auch die SASS-Variante davon.
Ich benutze seit einiger Zeit etwas Ähnliches, das ich den "Z-Index Index" nenne: https://github.com/danielmall/danielmallcom/blob/master/-/c/_scss/base.scss (beginnend bei Zeile 27)
Ich habe immer nur einen Stacking-Partial für dieses Dienstprogramm verwendet, aber stattdessen verwende ich
data-order="100", ein Data-Attribut anstelle einer Klasse. Für mich ist das eine sauberere Trennung, aber das ist nur eine persönliche Sache.Klingt interessant, und ich kann verstehen, wie so etwas zur Verantwortung der Inhaltsebene gehören könnte. Können Sie uns mehr darüber erzählen?
Ich hasse es, derjenige zu sein, der das bemerkt und darauf hinweist ... „nortiously“?
Sass Maps... ich wusste nicht mal, dass es sie gibt!
Gibt es irgendwo einen Blog, der einen Beitrag hat wie „Sass-Funktionen, von denen Sie nicht wussten, dass sie existieren“? haha (aber ernsthaft)
Ich wusste auch nicht, dass Sass Maps existieren. Jetzt mache ich mich daran, alles darüber zu lernen, um festzustellen, wie ich das aktuelle Sass bereinigen kann. Schön!
Bitte, RTFM. :)
Neben den offiziellen Sass-Docs hat Hugo einige gute Artikel über die Verbesserung Ihres Sass-Workflows mit fortgeschrittenen Funktionen: HugoGIRAUDEL.com.
Ich wollte gerade sagen, ich bin überrascht, dass er noch nichts gesagt hat, aber natürlich hat er es. Nur weiter unten.
Nützliche Informationen, ich wollte nur kommentieren und sagen, wie großartig Final Fantasy 3 ist.
Das ist übrigens FF6 :-). Aber alle sind großartig
Das Problem, das ich mit z-index habe, ist, dass es nur für Elemente funktioniert, die position:absolute, position:relative oder position:fixed sind.
Wie handhaben Sie das für Websites, auf denen Sie z-index häufig verwenden? Setzen Sie einfach alles auf
* {position:relative}? Wenn ja, wie positionieren Sie ein Element absolut in einem Element, das sich mehrere Ebenen darüber befindet? Oder vermeiden Sie das als schlechte Praxis?Oder hat jemand eine Sass-Funktion, die die oben genannten Techniken mit dem Standard-Setzen jedes Elements mit z-index auf position:relative kombiniert?
Sie können das bestehende System nicht ändern. z-index muss immer auf positionierten Elementen verwendet werden. Ich sehe darin kein Problem. Es gibt Elemente, die immer noch statisch sein müssen und keine Positionierung jeglicher Art benötigen.
So handhabe ich z-index für die aktuelle Webanwendung, an der ich arbeite. Mit nur 2 Front-End-Entwicklern und über zwei Dutzend Back-End-Entwicklern hat die Einrichtung einer Sass-Datei mit Variablen für jedes Element, das einen z-index benötigte, und die anschließende Dokumentation in unserer Pattern Library die Probleme mit der Schichtung auf 0 reduziert.
@Fooman – Das gibt Ihnen eine Einführung in Sass Maps: http://benfrain.com/using-lists-with-maps-in-sass-3-3/
Danke! Ich lese es jetzt.
Ich habe auch noch nie Maps verwendet, aber aus der Verwendung im Artikel denke ich, dass ich auch ohne einen Artikel mit SASS Maps loslegen kann. Trotzdem danke für den Link. Ich werde versuchen, ihn mir anzusehen.
In Zukunft könnte ich mir vorstellen, dass dies mit CSS-Variablen gemacht wird. Abgesehen von den aktuellen Unterstützungseinschränkungen bezweifle ich, dass es einen besseren Weg gibt, dies zu tun.
Dies ist die „alte“ Syntax für CSS-Variablen. Hier ist die neue
Okay, es war nett, zu versuchen, die typisierten Enums von C++11 zu verwenden, aber uint8_t begrenzt die Werte auf den Bereich [0, 255], also...
Nächstes Mal mehr Glück?
Sie haben Recht! Ich habe das zu einem Typ korrigiert, der diese Zahlen verarbeiten konnte.
Wie haben Sie letzte Nacht geschlafen? Gut?
Das ergibt für mich Sinn. Eine Sache, die dies nicht adressiert, ist die Integration von Drittanbieter-Widgets (Modals, Share-Buttons usw.), die unweigerlich ihr eigenes z-index-System haben und oft JavaScript verwenden, um sich „nach oben“ zu schieben.
Ich schätze, eine Einigung auf einen Standardansatz wird dieses Problem im Laufe der Zeit nur verringern.
Wie gehen Sie mit neuen Stapelkontexten um? Ein Element mit z-index 7000 könnte *unter* einem Element mit z-index 5000 erscheinen, wegen des z-index seiner Eltern.
Weitere Informationen
http://philipwalton.com/articles/what-no-one-told-you-about-z-index/
https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context
Das ist eine gute Frage. Sicherlich könnte das System erweitert werden, um dem Rechnung zu tragen. Vielleicht nur bei der Organisation der Map.
Danke für den Zweifel! Ich habe heute etwas Neues gelernt, dank der Links, die Sie in „Weitere Informationen“ eingefügt haben :)
Genau das mache ich mir auch Sorgen, Leon. Die Dinge werden komplexer, wenn sich der Stapelkontext ändert, und Sie werden mit dem erwähnten Ansatz Stapelkontext-bezogene Probleme bekommen.
Ich zähle meine z-indexes selten über 3 hinaus. Das bedeutet natürlich, dass jeder Beteiligte Stapelkontexte verstehen muss. Der Artikel, den Leon erwähnt hat, ist genial, um bessere Stile mit Stapelkontexten zu schreiben.
Aber ich sehe, dass viele Leute hier den Ansatz gut genutzt haben. Ich werde die Augen offen halten, ob er sich eines Tages als nützlich erweisen könnte.
@Mudassir: Freut mich, dass ich helfen konnte! Stapelkontexte können ziemlich knifflig sein, aber wenn man sie einmal verstanden hat, kann man sie zu seinem Vorteil nutzen.
Zum Beispiel: Pseudo-Elemente hinter ihren Elternelementen verstecken (http://nicolasgallagher.com/css-drop-shadows-without-images/).
Brillante Lösung. Z-index ist definitiv eines dieser Dinge, die einfach dazu neigen, unordentlich und verwirrend zu werden. Alles, was versucht, dieses Problem zu lindern, ist willkommen. Ich werde wahrscheinlich zu diesem Ansatz wechseln.
Schöne Lösung, aber diese z-indexes sind *viel* zu hoch. Gibt es einen Grund, warum sie bei 5000 beginnen? Ich bevorzuge persönlich meine z-indexes unter 100. Ich sehe so viele Websites mit z-indexes von 0-999999, was einfach ein bisschen lächerlich ist.
Das ist großartig, ich wusste nichts von gemappten Werten in SCSS!
Toller Beitrag, Chris! Ich habe angefangen, Farbpaletten mit Sass Maps zu erstellen, und es war eine großartige Erfahrung. Jetzt kommt Z-index auch auf die Liste.
Persönlich würde ich eine zusätzliche Funktion erstellen, um die z-index-Werte abzurufen, anstatt map-get zu oft zu tippen. Hier ist ein Beispiel, wie es aussehen würde
Es ist nur ein Schritt weiter, aber mir gefällt dieser Ansatz. Wäre großartig, wenn Sie das nützlich finden würden
Fantastisch!
Ich verwende einen ähnlichen Ansatz. Ich mag diese willkürlich hohen
z-index-Zahlen nicht und füge dann neue dazwischen ein. Das wird nach einer Weile einfach unordentlich.Stattdessen verwende ich einfach eine Liste und hole mir den Index von dort
Auf diese Weise muss ich mich nicht mit Zahlen herumschlagen, und das Hinzufügen eines neuen Elements im Stack wird sehr einfach.
Nun, das klingt wirklich schön, aber – wie bereits erwähnt – läuft das alles auf *nichts* hinaus, wegen des Konzepts der **Stacking Contexts** in CSS. Ein Jammer, aber ich fürchte, z-index bleibt eine Qual.. (was in der Natur seines *Designs* liegt und nicht mit unterstützenden Werkzeugen und Technologien wie Sass überwunden werden kann). Ich wünschte, ich wäre falsch.. :(
Ich arbeite an einer riesigen Webanwendung und bin der Einzige im Team, der sich mit CSS beschäftigt. Diese Idee ist eine riesige Hilfe. Danke. Wann ist Ihr Buch lieferbar? *Hinweis, Hinweis*
Das klingt großartig für komplett selbst geschriebenen Code, aber was ist mit der Verwendung von Bibliotheken, bei denen Sie z-index nicht festlegen möchten (wie jQuery-Dialogen)?
Es ist extrem selten, dass ich für irgendetwas auf fast jeder Website, an der ich arbeite, auf z-index zurückgreifen muss. Wofür genau verwenden Sie es?
Gleichfalls, und in den wenigen Fällen, in denen ich z-indexes verwenden muss, erledigt die richtige Einstellung des Stapelkontexts das für mich.
Meine Praxis ist, dass der
z-indexjedespositionierten odertransformierten Elements, das später im Dokumentfluss erscheinen soll, nur1oder2sein sollte, und wenn derz-indexlokal wäre, machen Sie den lokalen Scope – derposition: relativeodertransformoder Ähnliches hat, setzen Sie dessenz-index: 0. Auch der Container der gesamten Seite mit Ausnahme von Elementen mit globalenz-indexen (nun ja, Indizes) hatposition: relative; z-index: 0;und für seine globalz-indexierten Geschwister reicht es aus, einfach 1 oder 2 zuzuweisen.Entschuldigen Sie den Tippfehler.
Setzen Sie den z-index des lokalen Geltungsbereichs – der eine position: relative oder transform oder Ähnliches haben sollte – auf 0.
Hier ist eine ziemlich elegante Lösung, die ich mir ausgedacht habe, um komplexe z-Indexierungen zu behandeln. Im Wesentlichen abstrahiert sie die Idee des z-index zu nur „Schichten“ und lässt Sass die mühsame Arbeit erledigen. Dies verleiht ihm einen eher „designorientierten“ Ansatz und ermöglicht es Ihnen, Ihre Schichten visuell aufzulisten, ohne explizit z-index-Werte deklarieren zu müssen. In einer _config.scss
In einer _mixins.scss
Dies kann auch „zwischen“ Schichten verwendet werden, falls Sie einen anderen Satz von z-indexes „shimmen“ müssen.
Das Ergebnis würde entsprechend z-indexed „Schichten“ zwischen der 1. und 2. Schicht (aus
$layers) ausgeben.Ich habe nicht viel Zeit damit verbracht, dies zu optimieren oder zu erweitern, da es für meine Bedürfnisse ausreicht, aber ich bin sicher, dass Sie darauf aufbauend weitere Funktionalität hinzufügen könnten, wenn Sie möchten. Vielleicht eine Funktion, um den z-index einer Schicht zurückzugeben, aber ich musste noch nicht so weit gehen.
Lassen Sie mich wissen, was Sie denken, Chris, ich bin ein langjähriger Leser und Erstposter ;)
-Mike McCormick
Hier ist die Ausgabe, hätte ich eigentlich einfügen sollen
Und Sie sehen, dass ich das hätte verwenden sollen
Anstatt dies