The z-index is a powerful yet confusing concept of CSS. Let's make it easy!
z-index
is a CSS property that controls stacking order of elements along a z-axis. Let's first take a look at what the z-axis is, and then get you started with a few tips to help you solve situations that tend to trip up developers.
Imagine a hypothetical line starting from your eye to screen. That is z-axis. It works like this:
The biggest thing that confuses developers is that z-index only works on positioned elements. You must specify the position
rule (relative
, absolute
, sticky
, or fixed
) if you want to arrange an element using z-index.
/* bad - z-index will not work without position */
.element {
z-index: 1;
}
/* good - z-index works when position is applied */
.element {
position: relative;
z-index: 1;
}
By default, all elements have a z-index of 0. When z-index rules are the same and two elements collide, an element written father down your HTML code will be stacked on top.
Take two sibling elements, a
and b
, where b
is written after a
:
<!-- #b will have stacking precedence if no z-index is specified -->
<div id="a">...</div>
<div id="b">...</div>
By default, if both of these elements are positioned in such a way that they overlap, but neither has a z-index, b
will be stacked on top of a
.
Using the example with a
and b
above, let's say b
is intentionally stacked on a
. And let's say a
has a child, c
, which we give a z-index of 100
. The HTML might look like this:
<div id="a">
<div id="c"></div>
</div>
<div id="b">...</div>
And the corresponding CSS:
#a {
position: absolute;
z-index: 1;
}
#b {
position: absolute;
z-index: 2;
}
#c {
position: absolute;
z-index: 100;
}
In this case, the child(ren) of a
(c
) can never be stacked above b
. This is how it plays out on the screen:
Here is some test code you can play around with for better understanding.
This content was originally sourced from this tweet by @Prathkum. Feel free to add to the Twitter thread with question or comments.