Skip to content

CSS Position

The position property is fundamental for controlling the layout method and placement of elements, often used with offset properties (top, right, bottom, left) and z-index.

The position property determines how an element is positioned within the document or its container. It works in conjunction with the offset properties.

There are five main values for position:

  • static: The default value. The element follows the normal document flow. Offset properties have no effect.
  • relative: The element is positioned relative to its normal position in the flow. Offset properties shift the element visually without affecting the surrounding layout (space is preserved).
  • absolute: The element is removed from the normal document flow and positioned relative to its nearest positioned ancestor (an ancestor with position set to relative, absolute, fixed, or sticky). If no positioned ancestor exists, it’s positioned relative to the initial containing block (often the <html> element).
  • fixed: The element is removed from the normal document flow and positioned relative to the viewport (the browser window). It stays in the same place even when the page is scrolled.
  • sticky: A hybrid value. The element behaves like relative until it reaches a specified scroll threshold (defined by offset properties like top), after which it behaves like fixed relative to its nearest scrolling ancestor or the viewport.

Note: Offset properties (top, right, bottom, left) only apply to elements whose position is not static.

Elements are laid out in the order they appear in the HTML. This is the default behavior.

[Imagine a simple div positioned normally in the page flow]

CSS:

.static-element {
position: static; /* Default, often not explicitly needed */
border: 3px solid green;
}

top, right, bottom, left, and z-index have no effect on static elements.

Allows you to offset an element from its normal position using top, right, bottom, left. The original space it occupied remains, and other elements are not affected.

It also serves as a positioning context for absolute positioned children.

[Imagine a div slightly shifted down and right from where it would normally be, leaving empty space behind]

CSS:

.relative-element {
position: relative;
left: 30px;
top: 15px;
border: 3px solid blue;
}

Positions an element relative to the browser viewport. It stays fixed even when scrolling. It’s removed from the normal flow, so it doesn’t leave a gap.

Commonly used for headers, footers, or sidebars that should always be visible.

[Imagine a small box fixed in the bottom-right corner of the browser window]

CSS:

.fixed-element {
position: fixed;
bottom: 20px;
right: 20px;
width: 200px;
border: 3px solid red;
background-color: lightgray;
}

Positions an element relative to its nearest positioned ancestor. If none exists, it uses the initial containing block (usually <html>). It’s removed from the normal flow.

Crucial for creating overlays, dropdown menus, tooltips, etc.

[Imagine a container div (relative) with a smaller div (absolute) positioned precisely within its top-right corner]

HTML Structure:

<div class="relative-container">
I am the container (position: relative).
<div class="absolute-child">
I am positioned absolutely (top: 10px, right: 10px).
</div>
</div>

CSS:

.relative-container {
position: relative; /* Establishes positioning context */
width: 400px;
height: 200px;
border: 3px solid orange;
padding: 10px;
}
.absolute-child {
position: absolute;
top: 10px;
right: 10px;
width: 150px;
height: 50px;
border: 3px solid purple;
background-color: lightyellow;
}

Acts like position: relative within its parent until a scroll threshold (e.g., top: 0) is met. Then, it ‘sticks’ in place like position: fixed relative to its scrolling container.

Useful for sticky headers or navigation that appear only after scrolling past a certain point.

[Imagine a section header that scrolls normally but then sticks to the top of the viewport once reached]

CSS:

.sticky-header {
position: sticky;
top: 0; /* Sticks to the top when scroll position reaches it */
background-color: white;
padding: 10px;
border-bottom: 1px solid #ccc;
}

Note: Sticky positioning can be tricky and depends on the overflow properties of parent elements.

When positioned elements overlap, the z-index property controls their stacking order (which element appears on top).

z-index only works on positioned elements (relative, absolute, fixed, sticky). Higher values appear on top of lower values. Elements with the same z-index stack according to their order in the HTML.

Example:

.element-on-top {
position: absolute;
z-index: 10;
background-color: lightblue;
}
.element-below {
position: absolute;
z-index: 5;
background-color: lightcoral;
}