Docs LogoDocs

Position Property - Element Positioning

Documentation for Position Property - Element Positioning.

Position Property - Element Positioning

What is the Position Property?

The position property controls how an element is positioned in the document. It determines whether an element follows the normal document flow or is positioned independently.

Why is Position Important?

Positioning allows you to:

  • Place elements precisely - Exact pixel positioning
  • Create layers - Stack elements on top of each other
  • Fixed headers - Elements that stay in place while scrolling
  • Tooltips and dropdowns - Floating elements
  • Complex layouts - Overlapping and layered designs

Position Values - Quick Reference

ValueDescriptionPositioned?Offset Properties?
staticNormal flow (default)NoNo
relativeRelative to normal positionYesYes
absoluteRelative to positioned ancestorYesYes
fixedRelative to viewportYesYes
stickyHybrid of relative and fixedYesYes

Offset Properties: top, right, bottom, left

Detailed Explanation

1. position: static (Default)

What it does: Elements follow the normal document flow. This is the default for all elements.

Characteristics:

  • Normal document flow
  • Cannot use offset properties (top, right, bottom, left)
  • Cannot use z-index

HTML Example:

<div class="box static">Static Box 1</div>
<div class="box static">Static Box 2</div>

CSS Example:

.static {
  position: static; /* Default, usually not needed */
  background-color: #007bff;
  color: white;
  padding: 20px;
  margin-bottom: 10px;
}

Result: Boxes stack normally, one after another.


2. position: relative

What it does: Element is positioned relative to its normal position. It still occupies its original space in the document flow.

Characteristics:

  • Stays in document flow (space reserved)
  • Can use offset properties to move it
  • Original space still occupied
  • Can use z-index

HTML Example:

<div class="box">Normal Box</div>
<div class="box relative">Relative Box (moved)</div>
<div class="box">Another Normal Box</div>

CSS Example:

.relative {
  position: relative;
  top: 20px; /* Move down 20px from normal position */
  left: 30px; /* Move right 30px from normal position */
  background-color: #28a745;
  color: white;
  padding: 20px;
}

Result: Middle box is moved down and right, but its original space is still reserved.

When to use:

  • Slight adjustments to position
  • Creating a positioning context for absolute children
  • Layering with z-index

Real-world scenario: Nudging an icon slightly up or down to align with text:

.icon {
  position: relative;
  top: 2px; /* Align with text baseline */
}

3. position: absolute

What it does: Element is positioned relative to its nearest positioned ancestor (any ancestor with position other than static). If none exists, it's positioned relative to the document body.

Characteristics:

  • Removed from document flow (no space reserved)
  • Positioned relative to nearest positioned ancestor
  • Can use offset properties
  • Can use z-index

HTML Example:

<div class="container">
  <div class="box">Normal Box</div>
  <div class="box absolute">Absolute Box</div>
  <div class="box">Another Normal Box</div>
</div>

CSS Example:

.container {
  position: relative; /* Creates positioning context */
  height: 300px;
  background-color: #f0f0f0;
  padding: 20px;
}

.absolute {
  position: absolute;
  top: 20px; /* 20px from top of container */
  right: 20px; /* 20px from right of container */
  background-color: #dc3545;
  color: white;
  padding: 20px;
}

Result: Absolute box is positioned in top-right corner of container, other boxes ignore its existence.

Common Pattern - Centering:

.centered {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%); /* Center perfectly */
}

When to use:

  • Tooltips and dropdowns
  • Modal overlays
  • Badges and notifications
  • Image overlays

Real-world scenario: Adding a notification badge to a button:

<button class="btn-with-badge">
  Messages
  <span class="badge">5</span>
</button>
.btn-with-badge {
  position: relative;
  padding: 10px 20px;
}

.badge {
  position: absolute;
  top: -8px;
  right: -8px;
  background-color: red;
  color: white;
  border-radius: 50%;
  width: 20px;
  height: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 12px;
}

4. position: fixed

What it does: Element is positioned relative to the viewport (browser window). It stays in the same place even when scrolling.

Characteristics:

  • Removed from document flow
  • Positioned relative to viewport
  • Stays fixed while scrolling
  • Can use offset properties
  • Can use z-index

HTML Example:

<header class="fixed-header">Fixed Header</header>
<main class="content">
  <p>Scroll down to see the fixed header stay in place...</p>
  <!-- Long content -->
</main>

CSS Example 1 - Fixed Header:

.fixed-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0; /* Full width */
  background-color: #333;
  color: white;
  padding: 20px;
  z-index: 1000;
}

.content {
  margin-top: 80px; /* Space for fixed header */
}

CSS Example 2 - Fixed Footer:

.fixed-footer {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  background-color: #333;
  color: white;
  padding: 20px;
}

CSS Example 3 - Fixed Sidebar:

.fixed-sidebar {
  position: fixed;
  top: 0;
  left: 0;
  width: 250px;
  height: 100vh;
  background-color: #f0f0f0;
  padding: 20px;
}

When to use:

  • Fixed navigation headers
  • Floating action buttons
  • Cookie consent banners
  • Chat widgets

Real-world scenario: Creating a "Back to Top" button that stays in bottom-right corner:

.back-to-top {
  position: fixed;
  bottom: 20px;
  right: 20px;
  background-color: #007bff;
  color: white;
  padding: 15px;
  border-radius: 50%;
  cursor: pointer;
  z-index: 1000;
}

5. position: sticky

What it does: Element is relative until it reaches a scroll threshold, then becomes fixed. Best of both worlds!

Characteristics:

  • Starts as relative
  • Becomes fixed when scroll threshold is reached
  • Stays within parent container
  • Requires at least one offset property (usually top)

HTML Example:

<div class="container">
  <h2 class="sticky-header">Section 1</h2>
  <p>Content for section 1...</p>
  <p>More content...</p>

  <h2 class="sticky-header">Section 2</h2>
  <p>Content for section 2...</p>
  <p>More content...</p>
</div>

CSS Example:

.sticky-header {
  position: sticky;
  top: 0; /* Stick to top when scrolling */
  background-color: #007bff;
  color: white;
  padding: 15px;
  margin-bottom: 20px;
  z-index: 10;
}

Result: Headers stick to top while scrolling through their section, then unstick when section ends.

When to use:

  • Table headers that stick while scrolling
  • Section headers in long pages
  • Sidebar navigation
  • Sticky filters in e-commerce

Real-world scenario: Sticky table header:

thead th {
  position: sticky;
  top: 0;
  background-color: #333;
  color: white;
  z-index: 10;
}

z-index Property

What it does: Controls the stacking order of positioned elements (higher values appear on top).

Syntax:

z-index: number;

HTML Example:

<div class="box box-1">Box 1 (z-index: 1)</div>
<div class="box box-2">Box 2 (z-index: 2)</div>
<div class="box box-3">Box 3 (z-index: 3)</div>

CSS Example:

.box {
  position: absolute;
  width: 200px;
  height: 200px;
  padding: 20px;
}

.box-1 {
  top: 0;
  left: 0;
  background-color: red;
  z-index: 1;
}

.box-2 {
  top: 50px;
  left: 50px;
  background-color: green;
  z-index: 2;
}

.box-3 {
  top: 100px;
  left: 100px;
  background-color: blue;
  z-index: 3; /* On top */
}

Common z-index values:

  • Modal overlays: z-index: 1000;
  • Fixed headers: z-index: 100;
  • Dropdowns: z-index: 10;
  • Normal content: z-index: 1;

Common Patterns

Pattern 1: Modal Overlay

<div class="modal-overlay">
  <div class="modal">
    <h2>Modal Title</h2>
    <p>Modal content...</p>
  </div>
</div>
.modal-overlay {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: rgba(0, 0, 0, 0.5);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
}

.modal {
  position: relative;
  background-color: white;
  padding: 30px;
  border-radius: 8px;
  max-width: 500px;
  z-index: 1001;
}

Pattern 2: Image with Caption Overlay

<div class="image-container">
  <img src="image.jpg" alt="Image" />
  <div class="caption">Image Caption</div>
</div>
.image-container {
  position: relative;
}

.caption {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  background-color: rgba(0, 0, 0, 0.7);
  color: white;
  padding: 10px;
}

Last updated on July 15, 2026

On this page