Explain this behavior:
<div style="z-index: 1"></div>
<div></div>
<div></div>
<div></div>
div {
position: relative;
background: red;
width: 100px;
height: 100px;
}
div:before {
position: absolute;
background: blue;
width: 100px;
height: 100px;
z-index: -1;
content: "";
left: -5px;
top: -5px;
}
http://jsfiddle.net/2VexH/2/
Only difference is the first div has z-index: 1 set.
Setting a positioned element's z-index
to anything other than auto
(the initial value) causes the element to generate a new stacking context for its descendant boxes.
This prevents any of its descendants from appearing below it, including the div:before
pseudo-element, even if their z-index
is negative. Of course, any descendant with a negative z-index
will continue to appear below a descendant with a zero or positive z-index
within the containing element, but that containing element will always be at the very back.1
The rest of your div
elements that don't have a z-index
set will use the initial value instead, and therefore not generate stacking contexts for their pseudo-elements, allowing the pseudo-elements to appear below the real elements. The stacking context in which they are drawn instead is that of body
.
1Note that the content of a stacking context root will still appear above the background of a descendant with a negative z-index
. This is intentional, and is covered in greater detail in this answer, with relevant links to the spec.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With