Smashing Magazine - we smash you with the information that will make your life easier. really.

The Z-Index CSS Property: A Comprehensive Look

Advertisement

Most CSS properties are quite simple to deal with. Often, applying a CSS property to an element in your markup will have instant results — as soon as you refresh the page, the value set for the property takes effect, and you see the result immediately. Other CSS properties, however, are a little more complex and will only work under a given set of circumstances.

The z-index property belongs to the latter group. z-index has undoubtedly caused as much confusion and frustration as any other CSS property. Ironically, however, when z-index is fully understood, it is a very easy property to use, and offers an effective method for overcoming many layout challenges.

In this article, we’ll explain exactly what z-index is, how it has been misunderstood, and we’ll discuss some practical uses for it. We’ll also describe some of the browser differences that can occur, particularly in previous versions of Internet Explorer and Firefox. This comprehensive look at z-index should provide developers with an excellent foundation to be able to use this property confidently and effectively.

[Offtopic: by the way, have you already visited Smashing Magazine's Facebook fan page? Join the community for a stream of useful resources, updates and giveaways!]

What is 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 z-index value means the element will be closer to the top of the stacking order. This stacking order runs perpendicular to the display, or viewport.

3-dimensional representation of the Z axis:

Graphical-z-index in The Z-Index CSS Property: A Comprehensive Look

In order to clearly demonstrate how z-index works, the image above exaggerates the display of stacked elements in relation to the viewport.

The Natural Stacking Order

In an HTML page, the natural stacking order (i.e. the order of elements on the Z axis) is determined by a number of factors. Below is a list showing the order that items fit into a stacking context, starting with the bottom of the stack. This list assumes none of the items has z-index applied:

  • Background and borders of the element that establish stacking context
  • Elements with negative stacking contexts, in order of appearance
  • Non-positioned, non-floated, block-level elements, in order of appearance
  • Non-positioned, floated elements, in order of appearance
  • Inline elements, in order of appearance
  • Positioned elements, in order of appearance

The z-index property, when applied correctly, can change this natural stacking order.

Of course, the stacking order of elements is not evident unless elements are positioned to overlap one another. Thus, to see the natural stacking order, negative margins can be used as shown below:

Grey Box

Blue Box

Gold Box

The boxes above are given different background and border colors, and the last two are indented and given negative top margins so you can see the natural stacking order. The grey box appears first in the markup, the blue box second, and the gold box third. The applied negative margins clearly demonstrate this fact. These elements do not have z-index values set; their stacking order is the natural, or default, order. The overlaps that occur are due to the negative margins.

Why Does it Cause Confusion?

Although z-index is not a difficult property to understand, due to false assumptions it can cause confusion for beginning developers. This confusion occurs because z-index will only work on an element whose position property has been explicitly set to absolute, fixed, or relative.

To demonstrate that z-index only works on positioned elements, here are the same three boxes with z-index values applied to attempt to reverse their stacking order:

Grey Box

Blue Box

Gold Box

The grey box has a z-index value of “9999″; the blue box has a z-index value of “500″; and the gold box has a z-index value of “1″. Logically, you would assume that the stacking order of these boxes should now be reversed. But that is not the case, because none of these elements has the position property set.

Here are the same boxes with position: relative added to each, and their z-index values maintained:

Grey Box

Blue Box

Gold Box

Now the result is as expected: The stacking order of the elements is reversed; the grey box overlaps the blue box, and the blue box overlaps the gold.

Syntax

The z-index property can affect the stack order of both block-level and inline elements, and is declared by a positive or negative integer value, or a value of auto. A value of auto gives the element the same stack order as its parent.

Here is the CSS code for the third example above, where the z-index property is applied correctly:

#grey_box {
	width: 200px;
	height: 200px;
	border: solid 1px #ccc;
	background: #ddd;
	position: relative;
	z-index: 9999;
}

#blue_box {
	width: 200px;
	height: 200px;
	border: solid 1px #4a7497;
	background: #8daac3;
	position: relative;
	z-index: 500;
}

#gold_box {
	width: 200px;
	height: 200px;
	border: solid 1px #8b6125;
	background: #ba945d;
	position: relative;
	z-index: 1;
}

Again, it cannot be stressed enough, especially for beginning CSS developers, that the z-index property will not work unless it is applied to a positioned element.

JavaScript Usage

If you want to affect the z-index value of an element dynamically via JavaScript, the syntax is similar to how most other CSS properties are accessed, using “camel casing” to replace hyphenated CSS properties, as in the code shown below:

var myElement = document.getElementById("gold_box");
myElement.style.position = "relative";
myElement.style.zIndex = "9999";

In the above code, the CSS syntax “z-index” becomes “zIndex”. Similarly, “background-color” becomes “backgroundColor”, “font-weight” becomes “fontWeight”, and so on.

Also, the position property is changed using the above code to again emphasize that z-index only works on elements that are positioned.

Improper Implementations in IE and Firefox

Under certain circumstances, there are some small inconsistencies in Internet Explorer versions 6 and 7 and Firefox version 2 with regards to the implementation of the z-index property.

<select> elements in IE6

In Internet Explorer 6, the <select> element is a windowed control, and so will always appear at the top of the stacking order regardless of natural stack order, position values, or z-index. This problem is illustrated in the screen capture below:

Z-index-ie6 in The Z-Index CSS Property: A Comprehensive Look

The <select> element appears first in the natural stack order and is given a z-index value of “1″ along with a position value of “relative”. The gold box appears second in the stack order, and is given a z-index value of “9999″. Because of natural stack order and z-index values, the gold box should appear on top, which it does in all currently used browsers except IE6:

Gold Box

Unless you’re viewing this page with IE6, you’ll see the gold box above overlapping the <select> element.

This bug in IE6 has caused problems with drop-down menus that fail to overlap <select> elements. One solution is to use JavaScript to temporarily hide the <select> element, then make it reappear when the overlapping menu disappears. Another solution involves using an <iframe>.

Positioned Parents in IE6/7

Internet Explorer versions 6 and 7 incorrectly reset the stacking context in relation to the nearest positioned ancestor element. To demonstrate this somewhat complicated bug, we’ll display two of the boxes again, but this time we’ll wrap the first box in a “positioned” element:

Grey Box

Blue Box

The grey box has a z-index value of “9999″; the blue box has a z-index value of “1″ and both elements are positioned. Therefore, the correct implementation is to display the grey box on top of the blue box.

If you view this page in IE6 or IE7, you’ll see the blue box overlapping the grey box. This is caused by the positioned element wrapping the grey box. Those browsers incorrectly “reset” the stacking context in relation to the positioned parent, but this should not be the case. The grey box has a much higher z-index value, and should therefore be overlapping the blue box. All other browsers render this correctly.

Negative Values in Firefox 2

In Firefox version 2, a negative z-index value will position an element behind the stacking context instead of in front of the background and borders of the element that established the stacking context. Here is a screen capture displaying this bug in Firefox 2:

Ff2 in The Z-Index CSS Property: A Comprehensive Look

Below is the HTML version of the above screen capture, so if you view this page in Firefox 3 or another currently-used browser, you’ll see the proper implementation: The background of the grey box (which is the element that establishes the stacking context) appears below everything else, and the grey box’s inline text appears above the blue box, which agrees with the “natural stacking order” rules outlined earlier.

Grey Box

Blue Box

Gold Box

Showcase of Various Usage

Applying the z-index property to elements on a page can provide a quick solution to various layout challenges, and allows designers to be a little more creative with overlapping objects in their designs. Some of the practical and creative uses for the z-index property are discussed and shown below.

Overlapping Tabbed Navigation

The CTCOnlineCME website uses overlapping transparent PNG images with z-index applied to the “focused” tab, demonstrating practical use for this CSS property:

Ctc-tabs in The Z-Index CSS Property: A Comprehensive Look

CSS Tooltips

The z-index property can be used as part of a CSS-based tooltip, as shown in the example below from trentrichardson.com:

Trent-tooltip in The Z-Index CSS Property: A Comprehensive Look

Light Box

There are dozens of quality light box scripts available for free use, such as the JQuery plugin FancyBox. Most, if not all of these scripts utilize the z-index property:

Fancybox-light in The Z-Index CSS Property: A Comprehensive Look

Light box scripts use a semi-opaque PNG image to darken the background, while bringing a new element, usually a window-like <div> to the foreground. The PNG overlay and the <div> both utilize z-index to ensure those two elements are above all others on the page.

Drop-Down Menus

Drop down menus such as Brainjar’s classic Revenge of the Menu Bar use z-index to ensure the menu buttons and their drop-downs are at the top of the stack.

Brainjar-menus in The Z-Index CSS Property: A Comprehensive Look

Photo Gallery Effects

A unique combination of JQuery animation and z-index can create a unique effect for use in a slideshow or photo gallery, as shown in the example below from the usejquery.com website:

Usejquery-photos in The Z-Index CSS Property: A Comprehensive Look

Polaroid Photo Gallery by Chris Spooner utilizes some CSS3 enhancements combined with z-index to create a cool re-stacking effect on hover.

Line25 in The Z-Index CSS Property: A Comprehensive Look

In this Fancy Thumbnail Hover Effect Soh Tanaka changes z-index values in a JQuery-based script:

Fancy-hover in The Z-Index CSS Property: A Comprehensive Look

CSS Experiments by Stu Nicholls

Stu Nicholls describes a number of CSS experiments on his website CSSplay. Here are a few that make creative use of the z-index property:

CSS image map

Beatles-map in The Z-Index CSS Property: A Comprehensive Look

CSS game

Css-game in The Z-Index CSS Property: A Comprehensive Look

CSS Frames Emulation

Frames-emulate in The Z-Index CSS Property: A Comprehensive Look

Layered Layout Enhancements

The 24 ways website implements z-index to enhance the site’s template, weaving year and date columns that stretch the length and width of the site’s content, for a very interesting effect.

24ways in The Z-Index CSS Property: A Comprehensive Look

Fancy Social Bookmarking Box

The Janko At Warp Speed site uses z-index in a “fancy share box”:

Sharebox in The Z-Index CSS Property: A Comprehensive Look

Perfect Full Page Background Image

This technique was described by Chris Coyier and used on the ringvemedia.com website. It implements z-index on content sections to ensure they appear above the “background” image, which is not a background image, but only mimics one:

Full-bg in The Z-Index CSS Property: A Comprehensive Look

Conclusion

Stacking contexts in CSS are a complex topic. This article did not attempt to discuss every detail on that topic, but instead has attempted to provide a solid discussion of how a web page’s stacking contexts are affected by z-index, which, when fully understood, becomes a powerful CSS property.

Beginning developers should now have a good understanding of this property and avoid some of the common problems that arise when trying to implement it. Additionally, advanced developers should have a stronger understanding of how proper use of z-index can provide solutions to countless layout issues and open doors to a number of creative possibilities in CSS design.

Further Reading

Louis Lazaris is freelance web developer of Greek descent, based in Toronto, Canada. He runs Impressive Webs, (please, not another web design blog!) and the newly-launched Interviews by Design that posts interviews with talented designers. You can follow Louis on Twitter or contact him through his website.

Post Rating
1 Star2 Stars3 Stars4 Stars5 Stars (2 votes, average: 5.00 out of 5)
Loading ... Loading ...

Tags: ,

Advertising
  1. 1
    Stephan
    September 15th, 2009 2:14 am

    One thing that is important to know is that there is a limit for the z-index value since FireFox 2.5. Since that version only z-index values less than or equal to 999999999 are working. Before FF2.5 you could use even bigger z-index values.

  2. 2
    M.R.
    September 15th, 2009 2:18 am

    Thank you for the article. Nice explanation.

  3. 3
    Jad Graphics
    September 15th, 2009 2:19 am

    Great tutorial. I needed something like this to further my knowledge about the Z-index. I was always confused on what it was, and this is a great post filled with examples. Thanks!

  4. 4
    Jens Thamm
    September 15th, 2009 2:40 am

    a game in pure css – wow!

  5. 5
    Bruno Abrantes
    September 15th, 2009 2:54 am

    Good rundown of the z-index feature. I feel very few designers employ this technique, maybe because they don’t know the property exists or are terribly confused by it. However, as you said in your article once you get into it z-index is extremely easy to understand and can push your layouts that little extra step further.

  6. 6
    Sam Benson
    September 15th, 2009 2:56 am

    Also note; the highest z-index value IE will allow is 2147483647 which is the maximum value for a 32bit integer.

    Unbeknown to most; it is also a double Mersenne prime.

    Sam

  7. 7
    Luke Jones
    September 15th, 2009 2:57 am

    I’m a great fan on the z-index:; property and use it often in sites, particularly those like Lucy Locket Kindergarten where there is a set background at the bottom. One issue I have noticed is the way IE handles the images, even when set to a lower z-index:; it still appears higher than other elements, therefore disrupting the flow. Try clicking my link at the bottom of that site in IE, Safari and Firefox and you’ll see exactly what I mean.

  8. 8
    Chris
    September 15th, 2009 2:59 am

    Excellent article! The z-index property is indeed the least known, generally speaking. Cheers

  9. 9
    Scott Brown
    September 15th, 2009 3:10 am

    Is it really that confusing? Set ‘position:’ then use z-index as you would layers in a Photoshop document with ‘1′ at the bottom. Not hard really. Sorry if I sound like a know-it-all!

    @ Sam Benson – Very good knowledge. You should check out the Five Numbers series on BBC Radio 4 website, sounds like it’ll be up your street.

  10. 10
    George
    September 15th, 2009 3:16 am

    Here’s another example of how to use z-index in making a fancy menu.

  11. 11
    Andi
    September 15th, 2009 3:44 am

    @smashingmagazine team:

    You should demonstrate the box behaviour with images of the boxes. Otherwise feedreaders like GoogleReader don’t show any effect on them. It ignores position and z-index

  12. 12
    Jonas
    September 15th, 2009 4:00 am

    I think the best overview of z-index can be found at http://tjkdesign.com/articles/z-index/teach_yourself_how_elements_stack.asp

  13. 13
    Daniel
    September 15th, 2009 4:07 am

    Why you use z-index values like 999999 when you can simple use values like 5, 6, 7.. or 10, 20, 30…

  14. 14
    asdsd
    September 15th, 2009 4:11 am

    I needed something like this to further my knowledge about the Z-index. I was always confused on what it was, and this is a great post filled with examples. Thanks!

  15. 15
    Michael
    September 15th, 2009 4:27 am

    As always: Great explanation. Nice article. Thanks.

  16. 16
    marbio
    September 15th, 2009 4:28 am

    Great article. Z-index property is an excellent css feature in my opinion.I love it.

  17. 17
    Jack
    September 15th, 2009 5:30 am

    Website css based on z-index : http://www.theriza.com

  18. 18
    Craig Wann
    September 15th, 2009 5:31 am

    Thanks! I’ve been seeing the full page backgrounds around and have wondered how that is done.

  19. 19
    Ryan Miller
    September 15th, 2009 5:36 am

    EXCELLENT Post! Thanks for saving me from many many future headaches. This has caused so many problems for me in the past, especially in understanding the browser differences.

    @ryancmiller

  20. 20
    Lisa
    September 15th, 2009 7:20 am

    I really love all your guys posts and am brought back here constantly through my RSS feeds and Twitter (as I’m sure many people are), but the adverts on your website are becoming ridiculous… it looks like a spam site from first glance. Web related ads were bearable, now free phone downloads? Come on guys…

  21. 21
    Robert Schultz
    September 15th, 2009 8:42 am

    I make excessive use of the z-index property to make sure the playing cards on World of Solitaire correctly stack upon each other. Without z-index, a Solitaire game in HTML/CSS/JavaScript would have been near impossible :)

  22. 22
    Brandon
    September 15th, 2009 8:44 am

    Great article really enjoyed it!
    @brjohnson2

  23. 23
    matt
    September 15th, 2009 10:28 am

    Hey guys, great article, it’s nice to see complex bugs described so simply. My one complaint is: please remove the link to w3schools under “Further Reading.” That site is a cesspool of dated misinformation. There are MUCH better resources out there, like MDC (https://developer.mozilla.org/).

  24. 24
    Ary Mega
    September 15th, 2009 10:45 am

    Smashing Magazine — you’re good, you.. you’re good.

  25. 25
    Kowalski
    September 15th, 2009 10:50 am

    @Daniel I presume people use z-index:9999; so that it’s obvious that that particular element is supposed to be at the top.

    Using z-index:30; doesn’t really scream “I’m at the top!”.

  26. 26
    johnmartyn
    September 15th, 2009 12:20 pm

    Excellent article. Worth mentioning that z-index doesn’t appear to work on positioned elements with overflow in IE6+ (see ).

  27. 27
    NotAlame
    September 15th, 2009 2:00 pm

    Thanks a lot! Really useful.

  28. 28
    Ant
    September 15th, 2009 2:29 pm

    Oh, and becasue of Fx 2 bug, we cannot use negative z-index?

  29. 29
    Adam Hermsdorfer
    September 15th, 2009 7:18 pm

    This answered a lot of my z-index questions. Jonas’s link does help clarify it further.

  30. 30
    eilonvi
    September 15th, 2009 10:43 pm

    Great article, just what I needed

    Thanks :)

  31. 31
    Tutorialzine
    September 15th, 2009 11:10 pm

    A great article. As always.

  32. 32
    bambang a indonesian designer
    September 16th, 2009 1:31 am

    nice articel,

    z-index is nice, but i think not good for your web, ‘couse the browser have many times image request to websites, i recommended, you use the image for your web (css sprites is good), if your image not use many color, make png it, if use many color jpg it.

    thanks

  33. 33
    Tim Piele
    September 16th, 2009 9:02 am

    Awesome. Mixing z-index with transparent png’s and dynamic values via javascript or PHP creates awesome websites.

  34. 34
    Jake Knight
    September 16th, 2009 6:43 pm

    Thanks for the great article. I was talking with a designer today about z-index and I never really understood it although now I can see how many times I could have used it.
    WKDS

  35. 35
    STEVE
    September 16th, 2009 7:14 pm

    Just thought I’d add about the use of CSS and Flash, which can create problems, where you need to overlap a CSS Div on top of a flash embeded item.

    1. In your code for the flash file, add the following:

    2. In the “embed” area, you need to add this:
    wmode=”transparent”

    Add your div with absolute positioning and off you go.

    http://www.brianyerkes.com/swfobject-help-when-placing-a-div-over-flash/

    Cheers,
    Steve

  36. 36
    Vince
    September 17th, 2009 12:46 am

    Excellent, this was what I needed to optimize my website.

  37. 37
    kalps
    September 17th, 2009 7:24 am

    since this is about z-index… can someone clarify ma doubt !?
    inside a z-indexed div, i insert an transparent png and use png fix js for IE6, but the png image still shows with a shadow… :(
    has anybody come across this kinda problem?

  38. 38
    necro
    September 17th, 2009 7:29 pm

    I never thought of using z-index in any of my project until I learned its usage and importance here. Thanks for this nice piece of collection.

    Now I am beginning to think of a photo blog under my Entertainment News site.

  39. 39
    Jaz
    September 23rd, 2009 11:17 am

    I had problems with z-index on my site which took ages to work out!

    Get Free Quality Backlinks Here

  40. 40
    Robert
    September 24th, 2009 8:40 am

    great tutorial, thanks!

  41. 41
    Divya
    October 7th, 2009 6:51 am

    I do not understand how the “Go China” site implementation of z-index is “perfect”? It is atrocious in Opera with double scrollbars (and 1 of them not even visible!).

  42. 42
    Dominic W
    October 30th, 2009 3:43 pm

    Good atricle. Thanks. One of the difficulties I have with z-index is that you never can tell on a page what the highest z index is. For example, if I am making a modal dialog control which can be used on many pages, how can I set the div used to make the modal to be above all else, when I do not know what the maximum z-index on a page it might be used on is? Setting to 999999 or whatever the maximum is in my opinion is not a good solution – who knows who else has done that. Is there a way to determine what the maximum z-index used is?

  43. 43
    Mark Graham
    November 25th, 2009 3:29 am

    Good Information and use of examples. Hi Dominic W: A trick I’ve used in the past is to group important properties like this in one area of my CSS file. So, you might want to put something like this at the top. If this post appears twice then it’s because I added a link to the previous post and then read the snippet about no link dropping when commenting.

    /* z-index order */

    #div1 {
    z-index: 1;
    }
    #div2 {
    z-index: 2;
    }

    /**/

    #div1 {
    position:relative;
    background:#fff; etc.
    }
    #div2 {
    position:absolute;
    background:#ccc; etc.
    }

    Just a simple way of maintaining your files. Hope this helps.

    Mark

  44. 44
    James Andrews
    December 4th, 2009 8:26 pm

    Great article. Totally helped me figure out my issue tonight.

  45. 45
    Magpie Brown
    January 14th, 2010 9:56 am

    Oooh, this is a lovely explanation of z-indexing, thanks so much for making things plain! I’m just learning CSS one bit at a time, and it’s been so satisfying employing z-indeces- still a long way to go but I’ll get there, partly thanks to great developers like you!

    Take care for now,

    Magpie Brown
    Bespoke Arts Publicity

  1. 00

    There are no trackbacks at this time. If you are interested in leaving a trackback, please use this URL.

Leave a Comment

Make sure you enter the * required information where indicated. Please also rate the article as it will help us decide future content and posts. Comments are moderated – and rel="nofollow" is in use. Please no link dropping, no keywords or domains as names; do not spam, and do not advertise!



Advertisement Advertise with us!
Join in Smashing Forum
Post your job