Skip to content

Positioning

  • Static, relative, absolute, and fixed positioning
  • Z-index property
  • Stacking context

Positioning is a fundamental concept in CSS that allows you to control the placement of elements on a webpage. By understanding the different positioning schemes (static, relative, absolute, fixed, and sticky), as well as related properties like z-index and stacking contexts, you can create complex layouts and control the visual hierarchy of your content.


1. Static, Relative, Absolute, and Fixed Positioning

Section titled “1. Static, Relative, Absolute, and Fixed Positioning”

Each positioning method determines how an element is placed in the document and how it interacts with other elements.

  • Default Behavior: Every element in HTML is statically positioned by default.
  • Characteristics:
  • Elements are positioned according to the normal document flow, meaning they appear in the order they are written in the HTML.
  • The top, right, bottom, and left properties have no effect on static elements.

Example:

div {
position: static;
}
  • In most cases, you don’t need to explicitly set position: static; since it is the default.
  • Relative to Itself: A relatively positioned element is moved relative to its original position in the normal document flow.
  • Characteristics:
  • The element’s position in the document flow is preserved, meaning it still occupies space.
  • Use the top, right, bottom, and left properties to move the element from its original position.
  • Other elements are not affected by the movement of the relatively positioned element.

Example:

div {
position: relative;
top: 20px;
left: 10px;
}
  • This moves the div 20 pixels down and 10 pixels to the right from where it would normally be placed.
  • Relative to Nearest Positioned Ancestor: An absolutely positioned element is removed from the normal document flow and positioned relative to its nearest positioned ancestor (an ancestor with position set to relative, absolute, or fixed).
  • Characteristics:
  • If no ancestor is positioned, it is positioned relative to the initial containing block (typically the browser window).
  • The top, right, bottom, and left properties define the exact position.
  • Other elements in the document flow are unaffected by the absolutely positioned element, meaning it can overlap other elements.

Example:

.container {
position: relative;
}
.absolute-box {
position: absolute;
top: 50px;
left: 100px;
}
  • The .absolute-box element is positioned 50 pixels from the top and 100 pixels from the left of its closest positioned ancestor, .container.
  • Relative to the Viewport: A fixed-positioned element is positioned relative to the browser window (viewport), regardless of scrolling.
  • Characteristics:
  • The element is removed from the normal document flow.
  • The top, right, bottom, and left properties determine its exact position.
  • The element stays fixed in place even when the page is scrolled.

Example:

.fixed-banner {
position: fixed;
top: 0;
width: 100%;
background-color: #333;
color: white;
}
  • This creates a fixed header or banner that remains at the top of the viewport as you scroll.
  • Hybrid of Relative and Fixed: A sticky-positioned element acts like a relatively positioned element until it reaches a specified position, at which point it sticks in place (like fixed positioning).
  • Characteristics:
  • The element toggles between relative and fixed positioning depending on the scroll position.
  • The top, right, bottom, or left values determine when the element becomes “sticky.”

Example:

.sticky-header {
position: sticky;
top: 0;
background-color: yellow;
}
  • This creates a header that sticks to the top of the page when scrolling past it.

The z-index property controls the vertical stacking order of elements that overlap. It only applies to elements with a positioning value other than static (i.e., relative, absolute, fixed, or sticky).

Syntax:

selector {
z-index: value;
}

Values:

  • Integer values: The z-index can be positive, negative, or zero.
  • Higher z-index values place elements on top of those with lower values.
  • Elements with equal z-index values stack according to their order in the HTML (the latter appears on top).

Example:

.box1 {
position: absolute;
top: 50px;
left: 50px;
z-index: 1;
}
.box2 {
position: absolute;
top: 100px;
left: 100px;
z-index: 2;
}
  • In this example, .box2 will appear on top of .box1 because it has a higher z-index value.

Note: The z-index property only works on positioned elements (relative, absolute, fixed, sticky). Non-positioned elements stack in the order they appear in the DOM, without considering z-index.


A stacking context is a conceptual layer in the z-axis where elements are stacked in order of their z-index values. Stacking contexts help manage how elements are layered and ensure that certain elements appear above or below others.

A new stacking context is created by any of the following:

  • An element with position set to relative, absolute, fixed, or sticky and a z-index value other than auto.
  • An element with a z-index of auto but within an HTML element that has a transform, opacity, filter, or certain CSS properties that affect rendering (like clip-path).
  • The root element of a document (usually the html element).
  • Background/borders of the element forming the stacking context.
  • Descendant elements with negative z-index.
  • Non-positioned, non-floating descendants in order of appearance in the HTML.
  • Descendant elements with z-index: auto.
  • Descendant elements with positive z-index.

Example:

.container {
position: relative;
z-index: 10; /* Creates a new stacking context */
}
.child {
position: absolute;
z-index: 1;
}
.sibling {
position: absolute;
z-index: 5;
}
  • Here, .child and .sibling are in the same stacking context created by .container. .sibling will appear above .child because it has a higher z-index.

If an element within a stacking context creates a new stacking context, all elements inside the nested context are stacked relative to that context and cannot exceed the stacking of the parent context.

Example:

.parent {
position: relative;
z-index: 10;
}
.child {
position: relative;
z-index: 5; /* New stacking context */
}
.grandchild {
position: absolute;
z-index: 999; /* Stays within child’s stacking context */
}
  • In this example, even though .grandchild has a high z-index, it cannot stack higher than the .child element due to the stacking context of .child.