- CSS Tutorial
- CSS Introduction
- CSS Syntax
- CSS Comments
- CSS Selectors
- CSS Fonts
- CSS Colors
- CSS Backgrounds
- CSS Box Model
- CSS Borders
- CSS Margins
- CSS Padding
- CSS Text
- CSS Images
- CSS Links
- CSS Lists
- CSS Tables
- CSS Outline
- CSS Icons
- CSS Display
- CSS max-witdh
- CSS Position
- CSS z-index
- CSS Overflow
- CSS Float
- CSS Align
- CSS Opacity
- CSS Navigation Bar
- CSS Dropdowns
- CSS Forms
- CSS Units
- CSS !important
- CSS Specificity
- CSS Combinators
- CSS inline-block
- CSS Hover
- CSS Cursors
- CSS Selectors
- CSS Type Selector
- CSS Class Selector
- CSS ID Selector
- CSS Attribute Selector
- CSS Pseudo-class Selector
- CSS Pseudo-element Selector
- CSS Universal Selector
- CSS Advanced
- CSS Text Formatting
- CSS Gradients
- CSS Shadow
- CSS Rounded Corners
- CSS Text Effects
- CSS 2D Transform
- CSS 3D Transform
- CSS Border Images
- CSS Inherit
- CSS Transitions
- CSS Animations
- CSS Box Sizing
- CSS Tooltip
- CSS Masking
- CSS Pagination
- CSS Styling Images
- CSS object-fit
- CSS object-position
- CSS Buttons
- CSS Multiple Columns
- CSS Variables
- CSS Flexbox
- CSS Grid
- CSS Media Queries
CSS Flexbox
Flexbox, or the Flexible Box Layout, is a CSS3 layout model that fundamentally changed how we design web interfaces. Before Flexbox, developers relied on floats and table hacks to align elements—methods that were never intended for complex layouts. Flexbox provides a predictable way to distribute space and align items, even when their size is unknown or dynamic. Whether you are building a simple navigation bar or a complex dashboard, Flexbox is your go-to tool for modern CSS development.
Basic Flexbox Concepts
To master Flexbox, you must understand the relationship between the Parent (Flex Container) and the Children (Flex Items). When you apply Flexbox to a parent, it gains the power to control the size, alignment, and order of its children.
Flex Container: This is the parent element. By applying display: flex;, you enable a flex context. It also establishes two axes: the Main Axis (running along the items) and the Cross Axis (running perpendicular to the items).
Flex Items: These are the direct children of the flex container. While the container handles the overall alignment, individual items can have their own rules regarding how they grow, shrink, or sit within that space.
display: flex;.
Flex Container Properties
display
This property initializes the flex context. Without it, none of the other flex properties will work.
- display: flex;: Defines the container as a block-level element that takes up the full width of its parent.
- display: inline-flex;: Defines the container as an inline element, which only takes up as much width as its content requires.
flex-direction
This determines the direction of the Main Axis. It tells the browser whether to stack items horizontally or vertically.
- flex-direction: row;: The default setting. Items are placed left-to-right (in LTR languages).
- flex-direction: column;: Items stack vertically from top-to-bottom.
- flex-direction: row-reverse;: Items are placed right-to-left.
- flex-direction: column-reverse;: Items stack vertically from bottom-to-top.
flex-direction: column; for mobile-first designs. It’s a clean way to stack navigation links or cards on smaller screens and can easily be switched to row via media queries for desktop.
flex-wrap
By default, flex items will try to fit onto one single line. This property allows them to wrap onto multiple lines if space runs out.
- flex-wrap: nowrap;: Default. All items stay on one line, which may cause overflowing.
- flex-wrap: wrap;: Items wrap onto new lines from top to bottom.
- flex-wrap: wrap-reverse;: Items wrap onto new lines from bottom to top.
justify-content
This defines the alignment along the Main Axis. It helps distribute extra free space when items don't take up the full width of the container.
- justify-content: flex-start;: Items are grouped at the start of the line.
- justify-content: flex-end;: Items are grouped at the end of the line.
- justify-content: center;: Items are centered. This is the easiest way to horizontally center content.
- justify-content: space-between;: The first item is at the start, the last is at the end, and others are evenly spaced. Perfect for navigation bars.
- justify-content: space-around;: Items have equal space on both sides (making the gaps between items twice as large as the gaps at the ends).
- justify-content: space-evenly;: All gaps, including those at the start and end, are of equal size.
align-items
This defines how items are aligned along the Cross Axis (perpendicular to the Main Axis).
- align-items: stretch;: Default. Items stretch to fill the container's height (or width if direction is column).
- align-items: flex-start;: Items sit at the start of the cross axis.
- align-items: flex-end;: Items sit at the end of the cross axis.
- align-items: center;: Items are centered vertically (if the direction is row).
- align-items: baseline;: Items align such that their text baselines line up.
justify-content: center; and align-items: center; on the container.
align-content
This property only has an effect when there are multiple lines of flex items (i.e., when flex-wrap: wrap; is used).
- align-content: flex-start;: Lines are packed at the start of the container.
- align-content: flex-end;: Lines are packed at the end.
- align-content: center;: Lines are centered.
- align-content: space-between;: Lines are evenly distributed; first line at the top, last line at the bottom.
- align-content: stretch;: Default. Lines stretch to take up the remaining space.
align-content on a single row of items. It won't work! Use align-items for single-line alignment.
Flex Item Properties
order
By default, flex items appear in the order they exist in the HTML. The order property lets you change this without touching the markup.
- order: <number>;: Default is 0. Lower numbers (including negative ones) move items to the front; higher numbers move them to the back.
flex-grow
This dictates what amount of the available space the item should take up. If all items have flex-grow: 1, they will share the space equally.
- flex-grow: <number>;: A value of 2 means this item will take up twice as much "extra" space as an item with a value of 1.
flex-shrink
This defines the ability for an item to shrink if there isn't enough space in the container.
- flex-shrink: <number>;: Default is 1. Setting this to 0 prevents the item from shrinking at all, forcing it to maintain its original size.
flex-basis
This defines the default size of an element before the remaining space is distributed.
- flex-basis: <length> | auto;: You can use pixels, percentages, or
auto. It acts like a "starting width" for the item.
flex
This is the shorthand for flex-grow, flex-shrink, and flex-basis. It is highly recommended to use this rather than the individual properties.
- flex: <flex-grow> <flex-shrink> <flex-basis>;
flex shorthand. It handles the edge cases and default values more intelligently than setting each property separately. For example, flex: 1; is a quick way to say flex: 1 1 0%;.
Flexbox Example
Here is a real-world example of a responsive card grid. In this example, the cards will grow to fill space and wrap to a new line when the screen gets too narrow.
/* The Container */
.flex-container {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
gap: 20px; /* Modern way to add spacing between items */
padding: 20px;
background-color: #f4f4f4;
}
/* The Items */
.flex-item {
background-color: white;
padding: 20px;
border: 1px solid #ddd;
border-radius: 8px;
/* Grow to fill space, don't shrink below content size, start at 30% width */
flex: 1 0 calc(33.33% - 20px);
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
@media (max-width: 768px) {
.flex-item {
/* On smaller screens, take up roughly half the width */
flex: 1 0 calc(50% - 20px);
}
}
<div class="flex-container">
<div class="flex-item">
<h3>Service One</h3>
<p>High-quality web development services tailored to your needs.</p>
</div>
<div class="flex-item">
<h3>Service Two</h3>
<p>Expert UI/UX design to make your product stand out.</p>
</div>
<div class="flex-item">
<h3>Service Three</h3>
<p>SEO optimization to help you reach more customers.</p>
</div>
</div>
Flexbox Benefits
- Alignment Control: Finally makes vertical centering easy and consistent.
- Equal Heights: By default, flex items in a row will stretch to the height of the tallest item, solving a decades-old CSS problem.
- Source Order Independence: You can visually reorder elements without changing your HTML structure, which is great for accessibility and SEO.
- Dynamic Sizing: Items can grow to fill empty space or shrink to avoid overflow, creating a fluid user experience.
Browser Support
Flexbox is supported by 99% of browsers in use today. While Internet Explorer 11 has some "quirks" with Flexbox (like issues with min-height), modern browsers like Chrome, Firefox, Safari, and Edge have full, robust support. If you are still supporting IE11, you may need a few specific "flexbug" workarounds, but for most modern projects, you can use Flexbox with complete confidence.
gap property (as seen in the example above) to handle spacing between items. It is much cleaner than using margins, though it's a newer feature, so ensure it fits your browser support requirements (supported in all modern browsers since 2020/2021).
Flexbox is an essential skill for any modern web developer. By mastering the relationship between the container and its items, you can build layouts that are not only beautiful but also robust across every device and screen size.