Table of Contents
- What is CSS Flexbox?
- Core Concepts: Flex Container & Flex Items
- Flex Container Properties
- Flex Item Properties
- Practical Examples
- Common Use Cases for Flexbox
- Troubleshooting & Pro Tips
- Conclusion
- References
What is CSS Flexbox?
CSS Flexbox, short for Flexible Box Module, is a layout model designed to arrange elements in a container such that they dynamically distribute space and adjust to different screen sizes. Unlike traditional layout models (e.g., floats, tables), Flexbox is content-first—it prioritizes the relationships between parent (container) and child (items) elements, allowing items to flex (grow, shrink, or reorder) based on available space.
Key Advantages of Flexbox:
- Simplified Alignment: Easily align items horizontally (main axis) or vertically (cross axis) with minimal code.
- Dynamic Sizing: Items automatically adjust size to fill space (grow) or shrink to fit constraints.
- Responsive by Default: Adapts to screen size without complex media queries (though media queries can enhance it).
- Order Control: Rearrange items visually without changing the HTML structure.
Core Concepts: Flex Container & Flex Items
To use Flexbox, you first define a flex container and its flex items:
- Flex Container: The parent element with
display: flex(ordisplay: inline-flexfor inline-level containers). This enables Flexbox layout for its direct children. - Flex Items: The direct children of the flex container. These items will “flex” according to the container’s properties.
Axes in Flexbox:
Flexbox works along two axes, which define how items are arranged:
- Main Axis: The primary axis along which items are laid out. By default, it’s horizontal (left-to-right), but this can be changed with
flex-direction. - Cross Axis: The perpendicular axis to the main axis. By default, it’s vertical (top-to-bottom).

Source: MDN Web Docs
Flex Container Properties
The flex container controls the layout of its items via these properties:
display
Purpose: Defines an element as a flex container.
Values:
flex: Makes the container a block-level flex container (takes full width by default).inline-flex: Makes the container an inline-level flex container (only takes as much width as needed).
Example:
.container {
display: flex; /* Block-level flex container */
}
.inline-container {
display: inline-flex; /* Inline-level flex container */
}
flex-direction
Purpose: Defines the direction of the main axis (and thus the layout of items).
Values:
row(default): Main axis is horizontal (left-to-right).row-reverse: Main axis is horizontal (right-to-left).column: Main axis is vertical (top-to-bottom).column-reverse: Main axis is vertical (bottom-to-top).
Example:
.container {
display: flex;
flex-direction: column; /* Items stack vertically */
}
flex-wrap
Purpose: Controls whether flex items wrap to the next line when there’s not enough space.
Values:
nowrap(default): Items stay in a single line (may overflow the container).wrap: Items wrap to the next line (top-to-bottom forrowdirection).wrap-reverse: Items wrap to the next line (bottom-to-top forrowdirection).
Example:
.container {
display: flex;
flex-wrap: wrap; /* Items wrap to new lines */
}
flex-flow
Shorthand for flex-direction and flex-wrap.
Syntax: flex-flow: <flex-direction> <flex-wrap>;
Example:
.container {
flex-flow: row wrap; /* Equivalent to flex-direction: row; flex-wrap: wrap; */
}
justify-content
Purpose: Aligns flex items along the main axis.
Values (row direction shown; reverse for column):
flex-start(default): Items align to the start of the main axis (left forrow).center: Items center along the main axis.flex-end: Items align to the end of the main axis (right forrow).space-between: Items distribute evenly; first item at start, last at end, space between.space-around: Items distribute evenly with equal space on both sides (doubled space between items).space-evenly: Items distribute with equal space between them (no extra space at start/end).
Example:
.container {
display: flex;
justify-content: space-between; /* Distribute items with space between */
}
align-items
Purpose: Aligns flex items along the cross axis. Applies to all items in the container.
Values (row direction shown; reverse for column):
stretch(default): Items stretch to fill the container’s cross axis (equal height forrow).flex-start: Items align to the start of the cross axis (top forrow).center: Items center along the cross axis.flex-end: Items align to the end of the cross axis (bottom forrow).baseline: Items align by their text baselines.
Example:
.container {
display: flex;
height: 300px; /* Define cross axis height */
align-items: center; /* Vertically center items */
}
align-content
Purpose: Aligns multiple lines of flex items along the cross axis. Only applies if flex-wrap: wrap (i.e., items wrap to multiple lines).
Values (similar to justify-content but for cross axis):
stretch(default): Lines stretch to fill the container.flex-start: Lines align to the start of the cross axis.center: Lines center along the cross axis.flex-end: Lines align to the end of the cross axis.space-between: Lines distribute evenly; first line at start, last at end.space-around: Lines distribute with equal space around them.
Example:
.container {
display: flex;
flex-wrap: wrap;
height: 400px; /* Extra height for multiple lines */
align-content: space-around; /* Space around wrapped lines */
}
Flex Item Properties
Flex items can override or extend the container’s behavior with these properties:
order
Purpose: Controls the visual order of flex items. Default: 0.
How it works: Items are sorted by order value (ascending). Negative values are allowed.
Example:
.item-2 {
order: -1; /* Appears before items with order: 0 */
}
.item-1 {
order: 1; /* Appears after items with order: 0 */
}
flex-grow
Purpose: Defines how much an item should grow to fill available space. Default: 0 (no growth).
How it works: Takes a unitless value (ratio). If all items have flex-grow: 1, space is divided equally.
Example:
.item {
flex-grow: 1; /* All items grow equally */
}
.item-highlight {
flex-grow: 2; /* Grows twice as much as others */
}
flex-shrink
Purpose: Defines how much an item should shrink when there’s not enough space. Default: 1 (shrinks).
How it works: Unitless value (ratio). 0 means the item will not shrink (may overflow).
Example:
.item-fixed {
flex-shrink: 0; /* Prevents shrinking */
}
flex-basis
Purpose: Defines the initial size of an item before space is distributed. Default: auto (uses item’s content size).
Values: Can be length (px, rem), percentage (%), or auto.
Example:
.item {
flex-basis: 200px; /* Initial width of 200px */
}
.item-responsive {
flex-basis: 50%; /* Initial width of 50% of container */
}
flex
Shorthand for flex-grow, flex-shrink, and flex-basis.
Syntax: flex: <flex-grow> <flex-shrink> <flex-basis>;
Common values:
flex: initial:flex: 0 1 auto(default behavior: shrink, no growth, auto basis).flex: auto:flex: 1 1 auto(grows and shrinks).flex: none:flex: 0 0 auto(no growth/shrink, auto basis).flex: 1:flex: 1 1 0%(grows, shrinks, basis 0%).
Example:
.item {
flex: 1; /* Equivalent to flex-grow: 1; flex-shrink: 1; flex-basis: 0%; */
}
align-self
Purpose: Overrides the container’s align-items for a specific item.
Values: Same as align-items (stretch, flex-start, center, flex-end, baseline).
Example:
.container {
align-items: flex-start; /* All items align to top */
}
.item-centered {
align-self: center; /* This item centers vertically */
}
Practical Examples
Let’s apply Flexbox to real-world layouts:
Example 1: Centering an Element
Easily center an item both horizontally and vertically:
<div class="container">
<div class="centered-item">I'm centered!</div>
</div>
.container {
display: flex;
height: 100vh; /* Full viewport height */
justify-content: center; /* Horizontal center (main axis) */
align-items: center; /* Vertical center (cross axis) */
}
.centered-item {
width: 200px;
height: 100px;
background: #3498db;
color: white;
text-align: center;
padding: 20px;
}
Example 2: Responsive Navigation Bar
A nav bar with logo on the left, links on the right, and wraps on small screens:
<nav class="navbar">
<div class="logo">MyLogo</div>
<ul class="nav-links">
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
.navbar {
display: flex;
justify-content: space-between; /* Logo left, links right */
align-items: center; /* Vertically center items */
padding: 1rem;
background: #2c3e50;
color: white;
}
.nav-links {
display: flex;
gap: 1rem; /* Space between links (modern alternative to margin) */
list-style: none;
padding: 0;
margin: 0;
}
/* Responsive: Stack links on small screens */
@media (max-width: 600px) {
.navbar {
flex-direction: column; /* Stack logo and links vertically */
gap: 1rem;
}
.nav-links {
flex-direction: column; /* Stack links vertically */
align-items: center;
}
}
Example 3: Equal-Height Card Layout
Cards with equal height, even if content varies:
<div class="card-container">
<div class="card">
<h3>Card 1</h3>
<p>Short content.</p>
</div>
<div class="card">
<h3>Card 2</h3>
<p>Longer content that would normally make this card taller. Flexbox ensures equal height!</p>
</div>
<div class="card">
<h3>Card 3</h3>
<p>Medium content.</p>
</div>
</div>
.card-container {
display: flex;
gap: 1rem;
padding: 1rem;
flex-wrap: wrap; /* Wrap on small screens */
}
.card {
flex: 1; /* Grow to fill space */
min-width: 250px; /* Minimum width before wrapping */
padding: 1rem;
border: 1px solid #ddd;
border-radius: 8px;
background: white;
}
Common Use Cases for Flexbox
Flexbox shines in these scenarios:
- Centering Content: Horizontally, vertically, or both (as in Example 1).
- Navigation Bars: Aligning logos, links, and buttons (Example 2).
- Equal-Height Elements: Cards, columns, or panels with varying content (Example 3).
- Distributing Space: Spacing items evenly (e.g.,
justify-content: space-betweenfor form buttons). - Reordering Items: Visually reordering content without changing HTML (e.g., mobile-first designs).
- Inline Alignment: Aligning icons with text (e.g., a button with icon + label).
Troubleshooting & Pro Tips
Common Issues & Fixes
- Items not wrapping? Ensure
flex-wrap: wrapis set on the container. - Items overflowing? Use
flex-shrink: 1(default) or setmin-width: 0on items with long content. - Uneven spacing? Use
gap(modern browsers) instead of margins for consistent spacing between items.
Pro Tips
- Use
flex: 1for equal distribution: Shorthand forflex-grow: 1; flex-shrink: 1; flex-basis: 0%ensures items share space equally. margin: autois powerful: A flex item withmargin-left: autowill push itself to the right (useful for aligning a single item to the end).- Avoid fixed heights: Let Flexbox handle sizing dynamically for responsiveness.
- Check browser support: Flexbox is supported in all modern browsers, but IE11 has partial support (use
autoprefixerfor legacy compatibility).
Conclusion
CSS Flexbox revolutionizes layout design by providing an intuitive, powerful way to arrange elements. By mastering container properties (e.g., justify-content, align-items) and item properties (e.g., flex, order), you can build responsive, flexible layouts with minimal code. Whether you’re centering a button, creating a navigation bar, or designing a card grid, Flexbox is the go-to tool for modern web development.
Practice with the examples above, experiment with different properties, and soon you’ll unlock Flexbox’s full potential!