CSSAwwwards
+ Submit tool
guideBeginner · Updated 2025

How to Center a Div in CSS: 7 Modern Methods Explained (2025)

Centering in CSS is one of the most Googled frontend questions in history — yet most tutorials only show one or two methods. This guide covers all seven modern approaches, explains when each is the right choice, and provides working code for every single one.

By Adil Badshah2 June 202510 min read
How to Center a Div in CSS — 7 Modern Methods with Code Examples

Why CSS Centering Has Always Been Confusing

Quick Answer

CSS has no single “center this” property — centering depends on the display type of the element (block, inline, flex, grid), whether you need horizontal or vertical centering, and the sizing of the parent container. The easiest modern solution is Flexbox: three lines on the parent centres any child both ways.

“How do I center a div in CSS?” has been one of the most Googled programming questions for over a decade. The running joke among developers — that CSS centering is inexplicably difficult — has its roots in a real problem: CSS was originally designed to lay out text documents, not application interfaces. Vertical centring in particular had no elegant native solution until Flexbox arrived.

The frustration is compounded by the fact that how you centre an element depends heavily on context. Are you centering an inline element or a block element? Horizontally, vertically, or both? Is the parent a known height? Is the child a known size? Different answers require different CSS.

In 2025, the situation has improved dramatically. Flexbox and CSS Grid give you powerful, readable centring with just a few lines. But the old techniques still appear in legacy codebases, and understanding all seven methods — including when each is appropriate — makes you a more confident CSS developer. Let’s go through every approach.

Before you start: The most common reason centring appears not to work is that the parent element has no height. The browser centres the child within the parent’s height. If the parent has no explicit height, it collapses to the height of its content and there is no extra space to centre within. Add min-height: 100vh or a fixed height to the parent and the centring will immediately work.

1Flexbox — The Recommended Default

Quick Answer

Add display: flex, justify-content: center, and align-items: center to the parent container. Give the parent a height. The child centres both horizontally and vertically. This is the most widely used, readable, and browser-compatible centring method in 2025.

Flexbox is the right choice for most centring tasks. It is explicit, readable, reversible, and works for any number of children — whether you need to centre one element or a row of several. According to MDN Web Docs, justify-content: center distributes flex items along the main axis and align-items: center aligns them along the cross axis — together, they achieve both dimensions of centring.

Apply all three properties to the parent container, not the child you want to centre:

.container {  display: flex;  justify-content: center; /* horizontal */  align-items: center;     /* vertical   */  min-height: 100vh;       /* needs a height for vertical centring */}

Note that justify-content operates along the main axis — which is horizontal when flex-direction is row (the default). If you change to flex-direction: column, the axes swap: justify-content centres vertically and align-items centres horizontally. This trips up many developers when they first encounter it.

Centering one item vs. centring multiple items

justify-content: center centres all flex children as a group along the main axis. If you need to centre each child independently, or align them in a specific pattern, you have more granular options: align-self: center on an individual child overrides the parent’s align-items for that one element.

To experiment with every Flexbox property and see the results live, use the Flexbox Playground — it renders a configurable flex container and updates the CSS output as you adjust every setting.

2CSS Grid — place-items: center

Quick Answer

Add display: grid and place-items: center to the parent. place-items is a shorthand for align-items and justify-items combined. Two properties on the parent — the child centres in both dimensions. No changes needed on the child element itself.

CSS Grid’s place-items: center is arguably the most concise centring solution available in CSS. Two properties on the parent — done. It works for any size child and requires no properties set on the child element itself. If you are already using Grid for your layout, this is the natural choice.

.container {  display: grid;  place-items: center;     /* shorthand: align-items + justify-items */  min-height: 100vh;}

place-items is shorthand for two properties: align-items (which controls alignment on the block/column axis) and justify-items (which controls alignment on the inline/row axis). Setting both to center via the shorthand centres grid children in both directions simultaneously.

One important distinction from Flexbox: justify-items in Grid controls individual item placement within its grid area, whereas justify-content in Flexbox controls distribution of items along the container. For single-item centring, the visual result is identical; for multi-item layouts, the behaviour differs significantly.

3Absolute Positioning + Transform

Quick Answer

Set position: relative on the parent and on the child: position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%). The child moves to the exact centre regardless of its dimensions. Works without knowing the child’s width or height.

This technique predates Flexbox and was the standard way to centre elements for many years. It still has a specific use case: centring an element that is positioned outside normal document flow, such as a modal overlay, a tooltip, or a loading spinner that needs to sit in the centre of the screen regardless of the page layout around it.

.container {  position: relative;  min-height: 300px;} .child {  position: absolute;  top: 50%;  left: 50%;  transform: translate(-50%, -50%);  /* works for any child size — no width needed */}

Here is the mechanism: top: 50% moves the element’s top edge to 50% of the parent — which means the element’s centre is below the true centre. transform: translateY(-50%) then shifts the element back up by half its own height, landing its centre exactly at the parent’s centre. The same logic applies horizontally with left: 50% and translateX(-50%).

When to use this method: Modals, overlays, fixed-position tooltips, lightboxes, and any element that needs to float in the centre of the screen independent of layout. For elements within normal document flow, prefer Flexbox or Grid — they are simpler and more maintainable.

4margin: 0 auto — Horizontal Centering for Block Elements

Quick Answer

Set margin: 0 auto on a block-level element with an explicit width. The browser splits the remaining horizontal space equally on both sides, centring the element. This is horizontal only — it does not centre vertically. It is the oldest and most widely supported centring technique in CSS.

margin: auto has been in CSS since the beginning and remains the go-to approach for centring page containers, article wrappers, and any fixed-width block element within its parent. The principle is simple: auto margins on the left and right tell the browser to fill the remaining space equally, which centres the element.

.child {  display: block;  width: fit-content; /* or any fixed width */  margin-left: auto;  margin-right: auto;  /* shorthand: margin: 0 auto; */}

The common use pattern is a page wrapper: max-width: 1200px; margin: 0 auto; padding: 0 24px; — this ensures the content never exceeds a readable width and is always horizontally centred on wider screens. This is the same pattern used on CSSAwwwards.com itself.

Why it does not work vertically: In the block layout model, margin: auto in the vertical (block) direction resolves to 0, not to the available space. This is specified in the CSS Box Model specification. Vertical auto margins only work in flex and grid contexts — which is why Method 5 exists.

5Grid or Flex Container + margin: auto on Child

Quick Answer

Create a flex or grid container, then set margin: auto on the child. In flex and grid contexts, auto margins absorb all available space in both axes — centring the child both horizontally and vertically. This is one of the cleanest multi-axis centring techniques available.

This lesser-known technique exploits a behaviour specific to flex and grid containers: within these contexts, margin: auto on a child resolves to all available space in both directions — not just horizontally. This makes it a valid alternative to justify-content / align-items, and it has the advantage of working per-child without touching the parent’s alignment properties.

.container {  display: grid;   /* or display: flex; */  min-height: 300px;} .child {  margin: auto;    /* grid/flex items: auto margins work in both axes */}

This pattern is particularly useful when you need to centre one specific child in a flex or grid container while leaving other children unaffected. You cannot achieve that with justify-content: center alone — that centres all children as a group.

6Logical Properties — margin-inline: auto

Quick Answer

margin-inline: auto is the modern, writing-mode-aware equivalent of margin-left: auto; margin-right: auto. It centres a block element horizontally in any writing direction. margin-block: auto centres vertically in grid or flex contexts. Both are supported in all modern browsers since 2021.

CSS Logical Properties replace physical directions (left, right, top, bottom) with writing-mode-aware equivalents (inline-start, inline-end, block-start, block-end). This matters for internationalisation: an application that serves Arabic or Hebrew users (right-to-left writing) or Mongolian (top-to-bottom) should use logical properties to ensure layouts remain correct without direction-specific overrides.

.child {  width: fit-content;  margin-inline: auto; /* horizontal — writing-mode aware */   /* For vertical: parent must be grid or flex */  margin-block: auto;  /* vertical   — writing-mode aware */}

For most English-language projects in 2025, margin-inline: auto is simply a more concise way to write margin-left: auto; margin-right: auto — one property instead of two. It is increasingly the preferred form in new CSS codebases and is used by default in many modern CSS frameworks.

7text-align: center — For Inline Content

Quick Answer

text-align: center centres inline and inline-block children — including text, images, buttons with display: inline-block, and inline SVGs — within their parent. Set it on the parent, not the element you want to centre. It does not centre block-level children or work vertically.

text-align: center is the oldest and most limited centering technique. It applies to the inline formatting context — meaning it centres inline content (text, images, inline-block elements) within their line box. It does not centre block-level elements like <div> or <p> by default.

.container {  text-align: center; /* centres inline/inline-block/text children */} .child {  display: inline-block; /* makes a div respond to text-align */}

The main use case today is centring text within a heading or paragraph, centring inline navigation links, or centring a row of icons or badges that are displayed as inline-block. For page layout and component centring, prefer Flexbox or Grid — they give you far more control.

Which Centering Method Should You Use?

With seven methods available, choosing the right one is a matter of context. Here is a decision guide based on the most common scenarios.

SituationBest Method
Centre one element, both axesFlexbox or Grid (Methods 1–2)
Centre page wrapper / article contentmargin: 0 auto (Method 4)
Centre a modal or overlay on screenAbsolute + Transform (Method 3)
Centre one child, not othersmargin: auto on child in flex/grid (Method 5)
Centre text or inline iconstext-align: center (Method 7)
RTL / internationalised layoutLogical Properties (Method 6)
Already using Grid layoutplace-items: center (Method 2)

The default for new projects in 2025: reach for Flexbox first. It handles the vast majority of centring use cases with clear, readable CSS. Upgrade to Grid when your layout requires it. Fall back to margin: 0 auto for simple page containers. Reserve absolute positioning for elements that genuinely need to escape document flow.

Expert insight:Jen Simmons, a member of the CSS Working Group at Apple, has noted that modern CSS — specifically Grid and Flexbox — makes centering “trivial.” The difficulty developers experienced historically came from trying to centre elements using a box model designed for text flow, not UI layout. Flexbox and Grid were designed specifically with two-dimensional alignment in mind.

Frequently Asked Questions

What is the easiest way to center a div in CSS?
The easiest way is Flexbox: add display: flex; justify-content: center; align-items: center; to the parent element. This centres the child both horizontally and vertically. Give the parent a height (such as min-height: 100vh) to see vertical centring take effect.
How do you center a div both horizontally and vertically?
Three modern approaches work: (1) Flexbox: display: flex; justify-content: center; align-items: center; on the parent. (2) CSS Grid: display: grid; place-items: center; on the parent. (3) Absolute + Transform: position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); on the child with position: relative on the parent.
What does margin: 0 auto do in CSS?
margin: 0 auto sets top and bottom margins to 0 and left and right margins to auto. The browser calculates equal available space on both sides, centring the element horizontally. This only works on block-level elements with an explicit width. It does not centre elements vertically.
Why does my div not centre vertically?
Vertical centring requires the parent element to have an explicit height. Without a height, the parent collapses to fit its content and there is no extra vertical space to centre within. Add min-height: 100vh or a fixed height to the parent, then apply Flexbox or Grid centring. This is the most common cause of vertical centring failing.
Which CSS centering method should I use in 2025?
Use Flexbox (display: flex; justify-content: center; align-items: center;) as your default — it is the most universally applicable and readable. Use CSS Grid (place-items: center) when you are already in a grid layout. Use margin: 0 auto for simple horizontal centring of fixed-width block elements. Avoid absolute positioning unless the element genuinely needs to escape document flow.

Conclusion

Centring in CSS is no longer the frustrating problem it once was. With Flexbox and CSS Grid available in every modern browser, the most common centring tasks — both axes, single element, multiple elements — are solved with two or three lines of clear, readable CSS. The seven methods in this guide cover every scenario from basic horizontal centring to positioned overlays to internationalised layouts.

Start with Method 1 (Flexbox) for any new centring task. If you are already in a grid layout, reach for Method 2 (Grid + place-items: center). Use Method 3 (Absolute + Transform) only for positioned elements outside document flow. For page containers, Method 4 (margin: 0 auto) is still the cleanest option.

To experiment with Flexbox and Grid properties live, use the Flexbox Playground and CSS Grid Generator on CSSAwwwards — both are free, require no login, and show you the CSS output as you configure the layout.

Share this article