DEV Community

Cover image for CSS Centering: Grid vs. Flexbox vs. Anchor Positioning
Lucy Muturi
Lucy Muturi

Posted on Originally published at syncfusion.com on

CSS Centering: Grid vs. Flexbox vs. Anchor Positioning

TL;DR: CSS centering is a layout decision, not a one-line fix. Learn when to use Grid, Flexbox, and Anchor Positioning to keep modals, tooltips, and responsive UI layouts usable and accessible as content and viewports change.

At some point, every frontend developer has seen this happen.

A card looks perfectly centered on a laptop. When QA opens the same screen on a smaller device, the content grows taller than expected, and suddenly the top of the modal becomes unreachable. No scrolling. No way out. Just a “centered” UI that quietly broke.

That’s the real CSS centering problem today.

Not how to center something, but what kind of centering behavior you actually want when the layout changes, content grows, or the viewport shrinks.

Modern CSS gives us excellent tools: Grid, Flexbox, safe alignment, logical properties, and now Anchor Positioning. The hard part is not knowing the syntax. It’s choosing the right centering model for the situation you’re in.

This guide is about making that decision without fighting your own layout later.

Centering isn’t a snippet; it’s a layout decision

When someone says “center this element,” they could mean very different things:

  • One element centered inside a panel
  • A group of actions centered as a row
  • A modal centered but still scrollable
  • A tooltip centered relative to a button
  • Content that stays reachable even when it overflows

CSS doesn’t have a single centering feature because layout itself isn’t singular. Grid, Flexbox, block layout, and anchored positioning all follow different rules. Alignment behaves differently depending on which system you’re using and what happens when space runs out.

The useful question is not “How do I center this?”

Instead, ask:

  • What is being centered?
  • Which layout model is being used?
  • What should happen when the content no longer fits?

Once you answer that, the CSS choice usually becomes obvious.

When grid is the right kind of centering

If your layout has one main thing that should sit in the middle, Grid is often the cleanest answer.

Think loaders, empty states, hero content, or a single card that needs to be visually balanced in both directions.

Grid is not inherently better than Flexbox for centering an element on two axes. Both layout models can center an element horizontally and vertically. Grid is often concise when the surrounding layout is track-based or two-dimensional, while Flexbox is usually more natural when elements form a directional row or column.

Example:

CSS

.hero {
    min-block-size: 70vh;
    display: grid;
    place-items: center;
}
Enter fullscreen mode Exit fullscreen mode

Two-axis centering with CSS Grid


Two-axis centering with CSS Grid

This kind of centering works well because it’s explicit and stable. You’re not relying on flex direction, item order, or spacing tricks. You’re saying: this thing belongs in the center of this space.

When the layout becomes primarily directional, such as a row of buttons or navigation items, Flexbox can express the intent more naturally. As soon as you’re arranging multiple related elements like buttons, text blocks, and icons, Grid’s strength becomes less relevant.

That’s where Flexbox earns its place.

Flexbox is better when content flows

Flexbox is ideal when elements are arranged in a row or column and alignment depends on the flow of content. justify-content controls alignment along the main axis, while align-items controls the cross axis. When flex-direction changes from row to column, those axes change too. This makes explicit Flexbox alignment important for toolbars, action groups, navigation items, and other directional layouts.

Directional content flow and alignment with Flexbox


Directional content flow and alignment with Flexbox

Why place-items isn’t a full replacement

In a flex container, place-items affects cross-axis alignment through align-items, but its justify-items component does not align flex items on the main axis. For clear two-axis intent, use justify-content and align-items explicitly.

Avoid relying on this:

CSS

.toolbar {
    display: flex;
    place-items: center;
}
Enter fullscreen mode Exit fullscreen mode

Prefer explicit flexbox alignment:

CSS

.toolbar {
    display: flex;
    justify-content: center;
    align-items: center;
}
Enter fullscreen mode Exit fullscreen mode

place-items vs. explicit Flexbox alignment


place-items vs. explicit Flexbox alignment

place-items vs place-content: A common source of confusion

Both properties are useful, but they solve different problems.

place-items controls how grid items are aligned within their grid areas.

CSS

.panel {
    display: grid;
    place-items: center;
}
Enter fullscreen mode Exit fullscreen mode

place-content controls how the grid’s tracks are aligned within the grid container.

CSS

.badge-cloud {
    display: grid;
    grid-template-columns: repeat(3, max-content);
    place-content: center;
    gap: 0.5rem;
}
Enter fullscreen mode Exit fullscreen mode

place-items vs. place-content in CSS Grid


place-items vs. place-content in CSS Grid

Using the wrong one often leads to layouts that feel almost right but behave strangely when space changes. If you find yourself compensating with margins, it’s usually a sign the alignment target is wrong.

Safe alignment CSS: Centering without hiding content

Centering breaks down most often in modals and previews.

When content exceeds the viewport height, mathematically centered layouts can trap content off‑screen. Safe alignment allows the browser to avoid an alignment position that would cause content to overflow the alignment container in a way that makes it unreachable.

HTML

<div class="modal-backdrop">
    <section class="modal" role="dialog" aria-modal="true">
        <!-- Modal content -->
    </section>
</div>

Enter fullscreen mode Exit fullscreen mode

CSS

.modal-backdrop {
    position: fixed;
    inset: 0;
    display: grid;
    place-items: safe center;
    overflow: auto;
    padding: 1rem;
}

.modal {
    inline-size: min(40rem, 100%);
}
Enter fullscreen mode Exit fullscreen mode

Strict Centering vs. Safe Centering


Strict Centering vs. Safe Centering

The backdrop serves as both the grid container and the scrolling container. safe center keeps the modal centered when space is available and falls back to a safer alignment when strict centering would make content unreachable. The safe keyword controls alignment only; overflow: auto independently provides scrolling when the modal exceeds the available space.

This example focuses on layout. A production modal should also include an accessible name, focus management, keyboard handling, and appropriate dialog semantics.

Mobile viewport adjustment with dvh

On mobile devices, browser controls can change the visible viewport height as they appear or disappear. Add min-block-size: 100dvh to make the backdrop follow the currently available viewport height:

CSS

.modal-backdrop {
    position: fixed;
    inset: 0;
    min-block-size: 100dvh;
    display: grid;
    place-items: safe center;
    overflow: auto;
    padding: 1rem;
}
Enter fullscreen mode Exit fullscreen mode

The dvh unit addresses dynamic viewport-height changes on mobile devices.

Read the full blog post on the Syncfusion Website

Top comments (0)