How Should You Build Layouts: Grid, Flexbox, or Positioning?

MMuhammad Naeem
September 29, 2025
8 min read
253 views

When building layouts in CSS, the two main tools you’ll rely on are Flexbox and Grid.

Don’t rely on position: absolute; for everyday layouts.
Many beginners try to build entire pages with
position: absolute and fixed widths/heights.
This leads to fragile layouts that break on different screen sizes.

Use positioning only for fine-tuning or special effects (like tooltips, popups, or badges).
For general layouts, use Grid and Flexbox.


What Is CSS Flexbox?

Flexbox (Flexible Box Layout) is a one-dimensional layout system designed to arrange elements in a row or column and align them neatly.

  • Parent element → becomes a flex container with display: flex;

  • Children → become flex items that adjust size and position automatically

Key Features of Flexbox

  • Easily center items (horizontally & vertically).

  • Control spacing between items.

  • Make layouts responsive without floats or manual positioning.

  • Best for lining things up neatly in one direction (1D).

Example: Navbar with Flexbox

nav {
  display: flex;
  justify-content: space-between; /* spread items */
  align-items: center;            /* vertical centering */
}
<nav>
  <a href="#">Home</a>
  <a href="#">About</a>
  <a href="#">Contact</a>
</nav>

The items flow horizontally and stay evenly spaced, even if one link has more text.


Flex container properties (apply to the parent)

  • display: flex / inline-flex — create a flex formatting context.

  • flex-directionrow | row-reverse | column | column-reverse → main axis direction.

  • flex-wrapnowrap | wrap | wrap-reverse → allow items to wrap to new lines.

  • flex-flow — shorthand for flex-direction + flex-wrap.

  • justify-contentflex-start | flex-end | center | space-between | space-around | space-evenly → distribute items on the main axis.

  • align-itemsstretch | flex-start | flex-end | center | baseline → align items on the cross axis.

  • align-contentstretch | center | space-between | space-around | flex-start | flex-end → alignment of multiple rows (only when there is wrapping).

  • gap (and row-gap, column-gap) — spacing between flex items (modern and recommended).

Example: center content and space items horizontally

.container {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 16px;
}

Flex item properties (apply to children)

  • order — integer, controls visual order (does not change DOM order).

  • flex-grow — number, how much the item grows relative to others.

  • flex-shrink — number, how it shrinks when space is tight.

  • flex-basis — initial main-size before growing/shrinking (like starting width).

  • flex — shorthand: flex: <grow> <shrink> <basis> (common: flex: 1 or flex: 0 1 auto).

  • align-self — override align-items for an individual item.

  • min-width / min-height and max-* — useful to prevent items from collapsing or overflowing.

  • margin: auto — can be used to push items (e.g., margin-left: auto pushes an item to the right).

Important snippet (prevent overflow with long content):

.item {
  flex: 1;        /* share available space */
  min-width: 0;   /* allow the item to shrink properly (common gotcha) */
}

Common Flexbox patterns (with small examples)

  • Centered block:

.container { display:flex; justify-content:center; align-items:center; height:200px; }
  • Equal-width columns:

.row { display:flex; gap:16px; }
.col { flex:1; min-width:0; } /* min-width prevents overflow when text is long */
  • Push right (classic nav):

nav { display:flex; align-items:center; }
nav .spacer { margin-left:auto; } /* pushes following items to the right */

Flexbox pitfalls & pro tips

  • Use gap instead of manual margins for consistent spacing.

  • min-width:0 on flex items is often needed to avoid overflow of long text.

  • Avoid heavy use of order — it changes visual order but not DOM order (accessibility/readers).

  • align-content only applies when there are multiple lines (i.e., items wrapped).

  • Test vertical centering with align-items:center — it solves most centering headaches.


What Is CSS Grid?

CSS Grid is a two-dimensional layout system that lets you create rows and columns to structure an entire page.

  • Parent element → becomes a grid container with display: grid;

  • Children → become grid items placed in cells.

Key Features of Grid

  • Create layouts with both rows + columns.

  • Control gaps (gutters) between items.

  • Build complex, responsive designs with ease.

Example: Page Layout with Grid

.container {
  display: grid;
  grid-template-columns: 200px 1fr; /* sidebar + main */
  grid-template-rows: 80px 1fr 60px; /* header, content, footer */
  gap: 10px;
}
<div class="container">
  <header>Header</header>
  <aside>Sidebar</aside>
  <main>Main Content</main>
  <footer>Footer</footer>
</div>

The header spans full width, sidebar stays on the left, main content grows, and footer sits below — all with just a few lines of CSS.


Grid container properties (apply to the grid parent)

  • display: grid / inline-grid — create grid context.

  • grid-template-columns / grid-template-rows — define explicit tracks (e.g., 200px 1fr 100px).

  • grid-template-areas — named areas for readable layouts.

  • gap, row-gap, column-gap — gutters between grid cells.

  • grid-auto-rows / grid-auto-columns — size of implicitly created tracks.

  • grid-auto-flowrow | column | dense — controls how auto-placed items flow.

  • justify-items / align-items — alignment of items inside their cell.

  • justify-content / align-content — alignment of the whole grid within the container.

  • place-items / place-content — shorthand for the above.


Grid item / placement properties

  • grid-column / grid-row — placement in the grid (1 / -1, span 2).

  • grid-area — either a name (from template-areas) or row-start / column-start / row-end / column-end.

  • justify-self / align-self — override cell alignment for the item.

  • place-self — shorthand for justify-self + align-self.

Example: spanning full width

.header { grid-column: 1 / -1; } /* spans from first column to last */

Powerful functions and units (grid magic)

  • repeat() → DRY: grid-template-columns: repeat(3, 1fr);

  • fr unit → fraction of remaining space (1fr, 2fr).

  • minmax(min, max) → enforce min/max sizes: grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));

  • auto-fit vs auto-fill → helpful for responsive card grids.

  • fit-content() / min-content / max-content → intrinsic sizing helpers.

  • subgrid → (advanced) inherit parent tracks — limited support in some environments.


Responsive Grid example (cards)

.cards {
  display: grid;
  gap: 16px;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
}

This creates a responsive card layout that adds/removes columns as the container width changes.


Grid pitfalls & pro tips

  • Use gap not margins between grid items.

  • Use minmax() + auto-fit or auto-fill for responsive cards — this is often simpler than media queries.

  • grid-auto-flow: dense can backfill small items but may reorder DOM visual placement (use with care).

  • Named areas (grid-template-areas) make complex templates readable — great for maintainability.

  • Negative indices in grid-column: 1 / -1 are powerful; -1 is the last line.

  • Debugging tip: temporarily apply borders/backgrounds or use the browser’s grid inspector to see tracks and areas.

  • Respect DOM order for accessibility — avoid reordering content solely with grid unless necessary.


How Do Flexbox and Grid Work Together?

Think of them as teammates:

  • Grid = the overall scaffolding (page skeleton).

  • Flexbox = the fine-tuning (aligning items inside each section).

Example: Use Grid to divide the page into header, sidebar, main, footer. Then use Flexbox inside the header to neatly space out the logo and navigation.


Mini Webpage Demo: Grid + Flexbox

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Grid + Flexbox Demo</title>
  <style>
    * { box-sizing: border-box; margin: 0; padding: 0; }
    body { font-family: sans-serif; background: #f4f4f4; }

    /* GRID LAYOUT */
    .container {
      display: grid;
      grid-template-columns: 200px 1fr;
      grid-template-rows: 70px 1fr 50px;
      grid-template-areas:
        "header header"
        "sidebar main"
        "footer footer";
      height: 100vh;
      gap: 10px;
    }

    header   { grid-area: header; background: #0077cc; color: white; padding: 0 1rem; }
    aside    { grid-area: sidebar; background: #e0e0e0; padding: 1rem; }
    main     { grid-area: main; background: white; padding: 1rem; }
    footer   { grid-area: footer; background: #333; color: white; text-align: center; padding: 1rem; }

    /* FLEXBOX INSIDE HEADER */
    header {
      display: flex;
      justify-content: space-between;
      align-items: center;
    }

    nav a {
      color: white;
      margin-left: 1rem;
      text-decoration: none;
      font-weight: bold;
    }

    nav a:hover { text-decoration: underline; }
  </style>
</head>
<body>
  <div class="container">
    <header>
      <h1>MySite</h1>
      <nav>
        <a href="#">Home</a>
        <a href="#">About</a>
        <a href="#">Contact</a>
      </nav>
    </header>
    
    <aside>
      <p><strong>Sidebar</strong></p>
      <ul>
        <li>Dashboard</li>
        <li>Settings</li>
        <li>Profile</li>
      </ul>
    </aside>
    
    <main>
      <h2>Main Content</h2>
      <p>This is the main area of the page. Grid places it in its own cell, while Flexbox spaces out the header items above.</p>
    </main>
    
    <footer>
      <p>&copy; 2025 MySite</p>
    </footer>
  </div>
</body>
</html>

Key Takeaway:

  • Grid = Skeleton → Use it for the big structure (header, sidebar, main, footer).

  • Flexbox = Muscles → Use it to align items neatly inside those sections.

  • Positioning = Special Effects → Use only for extras like tooltips, popups, or badges (not for main layouts).

Pro Tips & Tricks

  1. Start with Grid for page layout → Divide your page into header, sidebar, main, and footer.

  2. Use Flexbox inside grid areas → Perfect for navbars, buttons, or centering text.

  3. Avoid position: absolute for layouts → It breaks responsiveness. Save it for overlays or floating elements.

  4. Combine Grid + Flexbox → Grid makes the “map”, Flexbox handles the “details.”

  5. Try gap instead of margins → Works in both Grid and Flexbox to add spacing cleanly.

  6. Use align-items: center; in Flexbox → Quick way to vertically center without hacks.

  7. Responsive Trick → Use fr units in Grid and flex: 1 in Flexbox for automatic resizing.

Comments (0)

Join the conversation

Sign in to share your thoughts and engage with other readers.

No comments yet

Be the first to share your thoughts!