Ctrl + K
CSS11 min read

CSS Flexbox Guide

Master CSS Flexbox from the basics to advanced alignment techniques used in modern responsive web development.

Published: 2026-08-01

CSS Flexbox is a layout system designed to arrange elements efficiently along a single axis. It simplifies alignment, spacing and sizing, making it much easier to build responsive navigation bars, cards, forms, toolbars and countless other interface components without relying on floats or complicated positioning techniques.

Unlike traditional layout methods, Flexbox distributes available space dynamically. Elements can grow, shrink and align automatically depending on the size of the container, allowing interfaces to adapt smoothly across different screen sizes.

What Is Flexbox?

Flexbox, short for Flexible Box Layout, is a one-dimensional layout model. It arranges items either horizontally or vertically while automatically handling spacing, alignment and proportional sizing.

.container {
  display: flex;
}

Applying display: flex transforms an element into a flex container. Every direct child immediately becomes a flex item that participates in the layout.

Flex Container and Flex Items

Every Flexbox layout contains two main parts. The parent element acts as the flex container, while its direct children become flex items that are positioned according to Flexbox rules.

ElementPurpose
Flex containerControls the layout
Flex itemIndividual child element
Main axisPrimary layout direction
Cross axisPerpendicular direction
GapSpace between items

Understanding the Main Axis

Every Flexbox layout has a main axis. By default it runs horizontally from left to right. Most Flexbox properties operate relative to this axis.

.container {
  display: flex;
  flex-direction: row;
}

The default direction is row, meaning items are placed horizontally in their natural document order.

Changing Direction

The flex-direction property controls how items are arranged inside the container.

ValueResult
rowHorizontal
row-reverseHorizontal reversed
columnVertical
column-reverseVertical reversed
.container {
  display: flex;
  flex-direction: column;
}

Changing the direction also changes the orientation of the main axis, which affects alignment properties such as justify-content.

The Cross Axis

The cross axis always runs perpendicular to the main axis. When the main axis is horizontal, the cross axis becomes vertical, and vice versa.

Understanding both axes is essential because Flexbox uses different properties to align items along each one.

Spacing Items

Modern Flexbox layouts typically use the gap property instead of margins to create consistent spacing between items.

.container {
  display: flex;
  gap: 24px;
}

Gap automatically creates equal spacing between flex items without adding unwanted margins around the outside of the container.

💡 Whenever browser support allows it, prefer gap instead of margins. It keeps layouts cleaner and reduces spacing bugs.

Horizontal Alignment

The justify-content property distributes free space along the main axis.

ValueBehavior
flex-startItems at the beginning
centerItems centered
flex-endItems at the end
space-betweenEqual space between items
space-aroundEqual space around items
space-evenlyPerfectly equal spacing
.container {
  display: flex;
  justify-content: space-between;
}

This is commonly used for navigation bars because the first and last items align naturally with opposite sides of the container.

Vertical Alignment

The align-items property controls how items are positioned along the cross axis.

.container {
  display: flex;
  align-items: center;
}

This is one of the simplest ways to vertically center content inside a container.

ValueBehavior
stretchFill available height
centerCenter vertically
flex-startTop alignment
flex-endBottom alignment
baselineAlign text baselines

Allowing Items to Wrap

By default, all flex items stay on a single line. If there isn't enough room, they simply shrink. The flex-wrap property allows items to move onto additional rows instead, making layouts much more responsive.

.container {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
}

Wrapping is commonly used for card layouts, image galleries and product grids where the number of items changes depending on screen size.

Controlling Item Size

Flex items can automatically grow or shrink to occupy available space. Three properties work together to control this behavior: flex-grow, flex-shrink and flex-basis.

PropertyPurpose
flex-growAllow an item to grow
flex-shrinkAllow an item to shrink
flex-basisDefine the initial size
.item {
  flex-grow: 1;
}

Items with the same flex-grow value divide any remaining space equally between themselves.

The Flex Shorthand

Instead of writing three separate properties, developers usually use the flex shorthand property.

.item {
  flex: 1;
}

The shorthand is concise and commonly used for creating columns with equal widths.

Auto Margins

Auto margins provide another powerful way to align individual flex items without affecting the rest of the layout.

.button {
  margin-left: auto;
}

This pushes the element to the opposite side of the container, making it especially useful for navigation bars and toolbars.

Changing Item Order

The order property changes the visual position of individual flex items without modifying the HTML source.

.featured {
  order: -1;
}

Although convenient, changing visual order should be used carefully because screen readers and keyboard navigation continue following the document order.

⚠️ Avoid using order to completely rearrange page content. Visual order should generally match the logical document structure for better accessibility.

Aligning Individual Items

While align-items affects every child, align-self overrides alignment for a single flex item.

.special {
  align-self: flex-end;
}

This allows individual elements to have unique alignment without changing the behavior of the rest of the container.

Building Responsive Layouts

Flexbox naturally adapts to different screen sizes. Combined with wrapping and flexible sizing, many layouts require only minimal media queries.

.cards {
  display: flex;
  flex-wrap: wrap;
  gap: 24px;
}

.card {
  flex: 1 1 300px;
}

Each card starts at roughly 300 pixels wide but grows when additional space is available. Once the screen becomes too narrow, cards automatically wrap onto the next line.

Common Flexbox Layouts

  • Navigation bars.
  • Card layouts.
  • Button groups.
  • Toolbars.
  • Pricing tables.
  • Media objects.
  • Centered hero sections.

Nested Flex Containers

Flex containers can be nested inside one another. A page may use one Flexbox layout for the overall header while each navigation section contains another independent Flexbox layout.

This nesting capability makes Flexbox extremely flexible for building reusable interface components.

Flexbox vs CSS Grid

Flexbox and CSS Grid are often used together because they solve different layout problems. Flexbox excels at arranging elements along a single axis, while Grid manages rows and columns simultaneously.

Use FlexboxUse Grid
Navigation menusPage layouts
Button groupsDashboards
ToolbarsComplex grids
Cards in one rowMagazine layouts
Centering contentTwo-dimensional positioning

Many modern websites combine both technologies. Grid defines the overall page structure, while Flexbox handles alignment inside individual components.

Common Mistakes

  • Forgetting that justify-content aligns along the main axis.
  • Confusing align-items with justify-content.
  • Using margins instead of gap for spacing.
  • Not enabling flex-wrap when responsive wrapping is needed.
  • Using order to rearrange important page content.
⚠️ Remember that changing flex-direction also changes the meaning of justify-content and align-items because the main and cross axes rotate with the layout.

Performance

Flexbox is implemented natively by all modern browsers and is highly optimized. In typical websites there is virtually no performance penalty from using Flexbox, even with many interface components.

Readability and maintainability are usually more important than micro-optimizations when designing Flexbox layouts.

Browser Support

Flexbox enjoys excellent browser support and has become one of the standard tools for modern CSS development. All major desktop and mobile browsers fully support the core specification.

💡 Unless you're supporting very old browsers, Flexbox can safely be used as the primary layout method for one-dimensional interface components.

Frequently Asked Questions

What is Flexbox best used for?

Flexbox is ideal for one-dimensional layouts such as navigation bars, toolbars, forms, button groups and card rows.

Can Flexbox replace CSS Grid?

Not entirely. Flexbox works along one axis, while Grid is designed for two-dimensional layouts involving both rows and columns.

Should I use gap or margins?

The gap property is generally preferred because it provides cleaner and more predictable spacing between flex items.

Does Flexbox work on mobile devices?

Yes. Flexbox is fully supported by modern mobile browsers and is commonly used to build responsive interfaces.

Can Flexbox center elements perfectly?

Yes. Combining justify-content: center with align-items: center centers content both horizontally and vertically.

Helpful CSS Tools

A CSS Flexbox Generator helps build container and item properties visually, a CSS Grid Generator is useful when two-dimensional layouts are required, a CSS Gap Calculator simplifies spacing values, a CSS Formatter keeps stylesheets readable, and a Responsive Breakpoint Calculator helps adapt layouts for different screen sizes.

Conclusion

CSS Flexbox has transformed the way developers build user interfaces by making alignment, spacing and responsive layouts significantly easier than older CSS techniques. Once you understand containers, axes, wrapping and flexible sizing, you can create clean, adaptive layouts with very little code. Combined with CSS Grid, Flexbox remains one of the most essential layout technologies in modern front-end development.