I have some absolutely positioned boxes. One of them has nested popup, larger then box. I want to make popup in front of all the boxes.
Setting z-index: 100
on boxes and z-index: 200
on popup does not help.
Boxes going in doc-order after box with popup appear to be over popup.
What do I miss about z-indices?
div {
border: 1px solid black;
}
.container {
position: relative;
}
.foo {
position: absolute;
background-color: white;
width: 5em;
z-index: 100;
}
#b0 {
top: 0em;
left: 0em;
}
#b1 {
top: 3em;
left: 1em;
}
#b2 {
top: 6em;
left: 2em;
}
#b3 {
top: 9em;
left: 3em;
}
#b4 {
top: 12em;
left: 4em;
}
.popup {
z-index: 200;
position: absolute;
left: 1em;
top: -1em;
width: 8em;
height: 8em;
background-color: grey;
}
<div class="container">
<div class="foo" id="b0">
<span>absolute box b0</span>
</div>
<div class="foo" id="b1">
<span>absolute box b1</span>
<div class="popup">
popup box inside b1
</div>
</div>
<div class="foo" id="b2">
<span>absolute box b2</span>
</div>
<div class="foo" id="b3">
<span>absolute box b3</span>
</div>
</div>
http://jsfiddle.net/B59pR/2/
Note: z-index only works on positioned elements (position: absolute, position: relative, position: fixed, or position: sticky) and flex items (elements that are direct children of display:flex elements).
Yes: use position:relative; z-index:10 . z-index has no effect for position:static (the default).
The z-index of elements inside of a stacking context are always relative to the parent's current order in its own stacking context. The <html> element is a stacking context itself and nothing can ever go behind it.
The z-index property determines the stack level of an HTML element. The “stack level” refers to the element's position on the Z axis (as opposed to the X axis or Y axis). A higher value means the element will be closer to the top of the stacking order.
You need to look at https://css-tricks.com/almanac/properties/z/z-index/ for a quick understanding of all this. Especially on the part where it says:
Also note that nesting plays a big role. If an element B sits on top of element A, a child element of element A can never be higher than element B.
What you did there was get children from lower elements and try to get them above children of higher elements.
All you needed to do was get the #b1 box on z-index 101:
div {
border: 1px solid black;
}
.container {
position: relative;
}
.foo {
position: absolute;
background-color: white;
width: 5em;
z-index: 100;
}
#b0 {
top: 0em;
left: 0em;
}
#b1 {
top: 3em;
left: 1em;
}
#b2 {
top: 6em;
left: 2em;
}
#b3 {
top: 5em;
left: 3em;
}
#b1 {
z-index: 101;
}
.popup {
z-index: 200;
position: absolute;
left: 3em;
top: -1em;
width: 8em;
height: 8em;
background-color: grey;
}
<div class="container">
<div class="foo" id="b0">
<span>absolute box b0</span>
</div>
<div class="foo" id="b1">
<span>absolute box b1</span>
<div class="popup">
popup box inside b1
</div>
</div>
<div class="foo" id="b2">
<span>absolute box b2</span>
</div>
<div class="foo" id="b3">
<span>absolute box b3</span>
</div>
</div>
I have this fixed on this fiddle for you to understand.
The core idea is that elements are rendered recursively in DOM tree-order (depth-first):
This means that tree-order of parents has a priority over z-index of their children.
In example in question all the foo
boxes have equal zindex=100 and was tree-ordered at step 3. Some "uncles" of popup are rendered after parents.
References:
https://www.w3.org/TR/CSS22/visuren.html#propdef-z-index https://www.w3.org/TR/CSS22/zindex.html
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