DEV Community

Cover image for Why your z-index isn't working
Abdulqudus Abubakre
Abdulqudus Abubakre

Posted on

Why your z-index isn't working

I was building a sidebar recently, and I encountered a bug where the content of the page was always on top of the mobile navbar no matter how high I raised the z-index of the sidebar. This took me a while to figure out and I'm writing this article hoping that someone out there won't waste a lot of time like I did trying to solve the bug.

What is z-index

z-index is a CSS property that allows you to set the stacking order of positioned elements in the DOM. Here's how to specify the z-index from your CSS:

.element {
  z-index: 1;
}
Enter fullscreen mode Exit fullscreen mode

When no z-index is set, the stacking order follows the appearance
of the elements in the DOM.

I set the z-index correctly, so why doesn't it work?

The z-index of an element depends on a number of things, and usually, when these conditions aren't met, the z-index of your element would most likely not take effect.

Here are some of the reasons why your z-index doesn't work;

You set z-index on a static element

By default, every element has a position of static. z-index only works on positioned elements (relative, absolute, fixed, sticky) so if you set a z-index on an element with a static position, it won't work.

A ridiculously large z-index was previously set

You might be working on an existing codebase that had the z-index of an element set to 999 (for example). This would affect the stacking order as only an element with a higher z-index can show on top. So you would need to set the z-index of at least 1000 for the z-index to work. Also, it's good practice to avoid setting large z-index values, that way you can avoid issues such as this.

The parent element has a lower z-index

The z-index of an element can only go as far as the maximum z-index of its parent (it cannot appear in a higher stacking context than its parent). Take for example;

.child {
  z-index: 3;
}

.element-to-cover {
  z-index: 2;
}

.parent {
  z-index: 1;
}
Enter fullscreen mode Exit fullscreen mode

In this case, you want to display the child element over the element-to-cover element so you set the z-index to 3. This should work since it has a z-index higher than the element-to-cover, but because the parent element has a z-index of 1, the child element would not appear above the element-to-cover

Summary

  1. You have to set the position of an element for the z-index to work
  2. Check to see if the element has a lower z-index value than the element you want it to appear over
  3. The z-index won't work if the parent element has a z-index lower than the z-index of your element

This article was originally post on my blog

Latest comments (4)

Collapse
 
theodorusclarence profile image
Theodorus Clarence

Nice!

Using position: relative; with z-index: 1; will also create a stacking context.

I recommend a blog post from Josh W Comeau

Collapse
 
ayoazeez26 profile image
Ayoazeez26

I used knowledge from this to explain z-index positioning to a friend. Thanks for this!!!

Collapse
 
afif profile image
Temani Afif

note than elements that are child of flexbox container or grid container (which is something common nowadays) don't require position to use z-index

Collapse
 
ibn_abubakre profile image
Abdulqudus Abubakre

Oh wow.....thanks a lot. I didn't actually know that