Ich versuche ein Element mit dem :after
CSS-Selektor für Pseudoelemente
#element {
position: relative;
z-index: 1;
}
#element::after {
position:relative;
z-index: 0;
content: " ";
position: absolute;
width: 100px;
height: 100px;
}
Es scheint wie das ::after
Element kann nicht niedriger sein als das Element selbst.
Gibt es eine Möglichkeit, das Pseudoelement niedriger als das Element selbst zu halten?
Pseudo-Elemente werden als Nachkommen des zugehörigen Elements behandelt. Um ein Pseudoelement unter dem übergeordneten Element zu positionieren, müssen Sie ein neuer Stapelkontext erstellen, um die Standard-Stapelreihenfolge zu ändern.
Wenn Sie das Pseudoelement (absolut) positionieren und einen anderen Z-Indexwert als "auto" zuweisen, wird der neue Stapelkontext erstellt.
#element {
position: relative; /* optional */
width: 100px;
height: 100px;
background-color: blue;
}
#element::after {
content: "";
width: 150px;
height: 150px;
background-color: red;
/* create a new stacking context */
position: absolute;
z-index: -1; /* to be below the parent element */
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Position a pseudo-element below its parent</title>
</head>
<body>
<div id="element">
</div>
</body>
</html>
Ich weiß, dass dies ein alter Thread ist, aber ich habe das Bedürfnis, die richtige Antwort zu posten. Die eigentliche Antwort auf diese Frage lautet, dass Sie einen neuen Stapelkontext auf dem übergeordneten Element des Elements mit dem Pseudoelement erstellen müssen (und dass Sie ihm tatsächlich einen Z-Index geben müssen, nicht nur eine Position).
So was:
#parent {
position: relative;
z-index: 1;
}
#pseudo-parent {
position: absolute;
/* no z-index allowed */
}
#pseudo-parent:after {
position: absolute;
top:0;
z-index: -1;
}
Es hat nichts mit der Verwendung von: vor oder: nach Pseudoelementen zu tun.
#parent { position: relative; z-index: 1; }
#pseudo-parent { position: absolute; } /* no z-index required */
#pseudo-parent:after { position: absolute; z-index: -1; }
/* Example styling to illustrate */
#pseudo-parent { background: #d1d1d1; }
#pseudo-parent:after { margin-left: -3px; content: "M" }
<div id="parent">
<div id="pseudo-parent">
</div>
</div>
Versuch es
el {
transform-style: preserve-3d;
}
el:after {
transform: translateZ(-1px);
}
Es gibt zwei Probleme, die hier im Spiel sind:
Die CSS 2.1-Spezifikation besagt, dass "The :before
und :after
Pseudo-Elemente Elemente interagieren mit anderen Feldern wie Run-In-Feldern, als wären sie echte Elemente, die direkt in das zugehörige Element eingefügt wurden. Ich kenne keine Möglichkeit, um Inhalte zu verschieben, die niedriger sind als der Z-Index des übergeordneten Elements im DOM, das in allen Browsern funktioniert.
Nummer 1 oben bedeutet nicht unbedingt, dass es unmöglich ist, aber das zweite Hindernis ist schlimmer: Letztendlich ist es eine Frage der Browserunterstützung. Firefox unterstützte die Positionierung generierter Inhalte bis FF3.6 überhaupt nicht. Wer kennt sich mit Browsern wie IE aus. Selbst wenn Sie einen Hack finden, mit dem es in einem Browser funktioniert, ist es sehr wahrscheinlich, dass er nur in diesem Browser funktioniert.
Das Einzige, was ich mir vorstellen kann, was für alle Browser funktionieren wird, ist die Verwendung von Javascript, um das Element einzufügen, anstatt CSS. Ich weiß, das ist keine gute Lösung, aber die :before
und :after
Pseudo-Selektoren sehen einfach nicht so aus, als würden sie es hier abschneiden.
Apropos zur Spezifikation ( http://www.w3.org/TR/CSS2/zindex.html ), seit a.someSelector
wird positioniert, um einen neuen Stapelkontext zu erstellen, aus dem seine untergeordneten Elemente nicht ausbrechen können. Verlassen a.someSelector
unpositioniert und dann Kind a.someSelector:after
kann im selben Kontext stehen wie a.someSelector
.
Ich weiß, diese Frage ist uralt und hat eine akzeptierte Antwort, aber ich habe eine bessere Lösung für das Problem gefunden. Ich poste es hier, damit ich keine doppelte Frage erstelle und die Lösung anderen weiterhin zur Verfügung steht.
Ändere die Reihenfolge der Elemente. Verwenden Sie die :before
Pseudoelement für den Inhalt, der darunter liegen soll, und passen Sie die Ränder an, um dies zu kompensieren. Die Randbereinigung kann chaotisch sein, aber das gewünschte z-index
bleibt erhalten.
Ich habe dies mit IE8 und FF3.6 erfolgreich getestet.
Setzen Sie z-index
Des Pseudoelements :before
Oder :after
Auf -1 und geben Sie ihm eine position
, die die Eigenschaft z-index
(absolute
, relative
oder fixed
). Dies funktioniert, weil das z-index
Des Pseudoelements relativ zu seinem übergeordneten Element ist und nicht <html>
, Was der Standard für andere Elemente ist. Was Sinn macht, weil sie untergeordnete Elemente von <html>
Sind.
Das Problem, das ich hatte (das mich zu dieser Frage und der akzeptierten Antwort oben führte), war, dass ich versuchte, ein :after
- Pseudoelement zu verwenden, um eine Phantasie mit einem Hintergrund für ein Element mit z-index
Zu bekommen. von 15 und selbst wenn es mit einem z-index
von 14 gesetzt wurde, wurde es immer noch über dem übergeordneten Element gerendert. Dies liegt daran, dass das übergeordnete Element in diesem Stapelkontext einen z-index
Von 0 hat.
Hoffentlich hilft das ein wenig zu klären, was los ist.
Ich habe es ganz einfach behoben:
.parent {
position: relative;
z-index: 1;
}
.child {
position: absolute;
z-index: -1;
}
Damit wird das übergeordnete Element in z-index: 1 gestapelt, wodurch das untergeordnete Element in z-index: 0 "landen" kann, da andere dom-Elemente in z-index: 0 "existieren" Das übergeordnete Element hat einen Z-Index von 1, das untergeordnete Element liegt unter den anderen dom-Elementen und ist daher nicht sichtbar.
Dies funktioniert auch für Pseudoelemente wie : after
Ich weiß nicht, ob jemand das gleiche Problem damit haben wird. Die ausgewählte Antwort ist teilweise richtig.
Was Sie brauchen, ist:
parent{
z-index: 1;
}
child{
position:relative;
backgr