Skip to Content

CSS z-index Property

On most web pages, we're used to seeing tons of HTML elements laid out on the horizontal and vertical planes, also known as the x-axis and y-axis. This gives visitors top-down, left-to-right visibility of their web page, similar to reading a book. All elements are displayed in the sequence they are written in the code in this fashion.

In this tutorial, we'll break into the third dimension by layering 2D elements with the CSS z-index property.

Advertising Disclosure: I am compensated for purchases made through affiliate links. Click here for details.

What is the z-index Property?

The z-index property in CSS controls the stacking order of HTML elements on the z-axis. Although the elements don't look closer to us visibly, the idea is that the HTML elements can be stacked, or layered, in a way that can produce some useful and pretty awesome effects.

The following graphic illustrates the z-index property at work, layering three orange squares on the z-axis.  The larger the value, the higher up on the z-axis the element is:

CSS z-index

The z-index property in CSS is a great solution for fixed headers that you want to overlap page contents while scrolling down a page. It can also be used for some stunning visual effects if done correctly.

How to Use the z-index Property

The following code snippet displays two div elements on the page, each with a different z-index value:

div#item-1 {
position: relative;
z-index: 11;
}

div#item-2 {
position: relative;
z-index: 10;
}

Visually, this code will just display two elements in sequence from top to bottom without an overlap. In reality, the item-1 element will be one layer above item-2 on the z-axis. This is because the z-index value of item-1 is 1 larger than the other element.

As an example, if we were to offset the position of the second element so they both overlap, we could add some additional styling, like background colors, that illustrates the overlap:

div#item-1 {
width: 100px;
height: 100px;
background-color: red;
position: relative;
z-index: 11;
}

div#item-2 {
width: 100px;
height: 100px;
background-color: blue;
position: relative;
top: -100px;
left: 50px;
z-index: 10;
}

Now, the red element covers half of the blue element because the z-index value of the red element is higher:

The values for z-index must be a positive or negative integer value, maxing out at +/-2147483647. In my personal opinion, I believe it's lazy to go above 100 for z-index values unless you truly have that many elements layered on a page. It's best practice to keep track of which elements are layered so you can use smaller, more readable values.

z-index with Positioned Elements

You'll notice above that both of the elements had an additional CSS rule of position: relative. That's because, for z-index to work at all, you must set a value to this property. Otherwise, the layering gets ignored entirely.

All valid position property values that you can use include relative, absolute, fixed, static, and sticky.

Sibling Rivalry

Another thing you will notice is the z-index property only works with sibling elements. This means that you can't have an element standing on its own interact on the z-axis with a child element of another element.

Here's a simple way to illustrate this with a simple HTML code snippet:

<div id="item-1">
<div id="item-2"></div>
<div id="item-3"></div>
</div>
<div id="item-4"></div>

And some CSS for styling:

div#item-1 {
position: relative;
z-index: 13;
}

div#item-2 {
position: relative;
z-index: 12;
}

div#item-3 {
position: relative;
z-index: 11;
}

div#item-4 {
position: relative;
z-index: 10;
}

Now, if we were to set a different z-index value for each of these four elements, the layering would work like this:

  • item-1 could overlap item-4, but not item-2 or item-3, because those two elements are its own child elements.
  • Similarly, item-4 cannot overlap any of the other elements, because item-1 is the parent element with a larger z-index value.

Conclusion

In conclusion, the CSS z-index property is a great solution when overlapping elements on the z-axis. Get creative with it and try some different designs. You'll get good with using it quickly and will be on your way to creating some visually stunning web pages!

Posted by: Josh Rowe
Last Updated: August 29, 2022
Created: May 20, 2021

Comments

There are no comments yet. Start the conversation!

Add A Comment

Comment Etiquette: Wrap code in a <code> and </code>. Please keep comments on-topic, do not post spam, keep the conversation constructive, and be nice to each other.