Live editor for all the examples will be added soon.
The CSS Flexbox (Flexible Box Layout) is a layout model that allows you to create flexible and responsive layouts with ease. It enables you to align items within a container, distribute space between them, and control their size and positioning—even when the size of the container is unknown. Flexbox is particularly useful for designing complex layouts that adjust to different screen sizes.
In this guide, we’ll cover the basics of Flexbox, explain its key properties, and provide examples to demonstrate how it works.
1. What is Flexbox?
Flexbox is a one-dimensional layout model that helps you arrange items either in a row or column. It is ideal for distributing space and aligning items, even when their sizes are dynamic or unknown. Flexbox operates on two levels:
- The flex container (parent element).
- The flex items (child elements within the container).
How to Enable Flexbox
To enable Flexbox, you simply apply display: flex;
to a container. This makes the container a flex container, and all of its direct children become flex items.
Example of Basic Flexbox:
.container {
display: flex;
}
<div class="container">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
2. Main Concepts of Flexbox
Flex Container
The flex container is the parent element where Flexbox properties are applied. This container controls the behavior of its children (flex items). Once the container is set to display: flex;
, you can use a range of Flexbox properties to manage the layout.
Flex Items
Flex items are the direct children of the flex container. These items automatically become flexible, meaning their size and position can be adjusted using Flexbox properties.
3. Flexbox Properties
Properties for the Flex Container
These properties control how the flex container behaves and how the items inside it are aligned.
3.1 flex-direction
The flex-direction
property defines the direction in which the flex items are placed inside the container.
- row: The items are placed in a row (default).
- row-reverse: The items are placed in a row, but reversed.
- column: The items are placed in a column.
- column-reverse: The items are placed in a column, but reversed.
Syntax:
.container {
display: flex;
flex-direction: row; /* or column */
}
Example:
.container {
display: flex;
flex-direction: column;
}
This makes the items stack vertically.
3.2 justify-content
The justify-content
property controls how the items are aligned along the main axis (horizontally by default).
- flex-start: Items are aligned at the start of the container (default).
- flex-end: Items are aligned at the end of the container.
- center: Items are centered along the main axis.
- space-between: Items are evenly spaced, with the first item at the start and the last item at the end.
- space-around: Items are evenly spaced, with equal space around each item.
Syntax:
.container {
display: flex;
justify-content: center;
}
Example:
.container {
display: flex;
justify-content: space-between;
}
This spaces the items out evenly, with the first item at the start and the last at the end of the container.
3.3 align-items
The align-items
property controls how the flex items are aligned along the cross axis (vertically by default).
- stretch: Items stretch to fill the container (default).
- flex-start: Items are aligned at the start of the cross axis.
- flex-end: Items are aligned at the end of the cross axis.
- center: Items are centered along the cross axis.
- baseline: Items are aligned along their baselines.
Syntax:
.container {
display: flex;
align-items: center;
}
Example:
.container {
display: flex;
align-items: flex-start;
}
This aligns all the items at the top of the container.
3.4 flex-wrap
The flex-wrap
property controls whether the flex items should wrap onto multiple lines if they overflow the container.
- nowrap: All items are placed in one line (default).
- wrap: Items wrap onto multiple lines when they don’t fit in one line.
- wrap-reverse: Items wrap onto multiple lines in reverse order.
Syntax:
.container {
display: flex;
flex-wrap: wrap;
}
Example:
.container {
display: flex;
flex-wrap: wrap;
justify-content: space-around;
}
This makes the items wrap to the next line when they overflow the container’s width.
Properties for the Flex Items
These properties control the behavior of individual flex items within the container.
3.5 flex-grow
The flex-grow
property controls how much a flex item should grow relative to the other items inside the container. It takes a unitless number as a value.
- 0: The item will not grow (default).
- 1: The item will grow and take up the available space.
Syntax:
.item {
flex-grow: 1;
}
Example:
.item {
flex-grow: 2;
}
This means the item will grow twice as fast as other items that have flex-grow: 1
.
3.6 flex-shrink
The flex-shrink
property controls how much a flex item should shrink when there is not enough space in the container.
- 1: The item will shrink (default).
- 0: The item will not shrink.
Syntax:
.item {
flex-shrink: 0;
}
This prevents the item from shrinking when the container size is reduced.
3.7 flex-basis
The flex-basis
property defines the initial size of a flex item before any extra space is distributed.
- It can be set to a length (e.g.,
200px
) or a percentage.
Syntax:
.item {
flex-basis: 150px;
}
This sets the item’s size to 150px before any other flex properties like flex-grow
or flex-shrink
are applied.
3.8 align-self
The align-self
property allows individual flex items to be aligned differently from the other items within the same container.
- auto: Inherits the value from
align-items
. - flex-start: Aligns the item at the start of the cross axis.
- flex-end: Aligns the item at the end of the cross axis.
- center: Centers the item along the cross axis.
- baseline: Aligns the item’s baseline.
- stretch: Stretches the item to fill the container (default).
Syntax:
.item {
align-self: center;
}
This centers the specific item along the cross axis, even if the other items are aligned differently.
4. Practical Example: Building a Simple Flexbox Layout
Here’s a practical example of how to create a basic responsive layout using Flexbox. This layout will contain a header, a main content area, and a sidebar.
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flexbox Layout</title>
<style>
body {
margin: 0;
font-family: Arial, sans-serif;
}
/* Flex container for the layout */
.container {
display: flex;
flex-direction: column;
min-height: 100vh;
}
/* Header section */
.header {
background-color: #4CAF50;
color: white;
text-align: center;
padding: 20px;
}
/* Main content and sidebar container */
.main-content {
display: flex;
flex: 1;
}
/* Main section */
.main {
flex: 3;
background-color: lightgrey;
padding: 20px;
}
/* Sidebar section */
.sidebar {
flex: 1;
background-color: #f1f1f1;
padding: 20px;
}
/* Footer section */
.footer {
background-color: #4CAF50;
color: white;
text-align: center;
padding: 10px;
}
</style>
</head>
<body>
<div class="container">
<!-- Header -->
<div class="header">
<h1>Flexbox Layout Example</h1>
</div>
<!-- Main content and sidebar -->
<div class="main-content">
<div class="main">
<h2>Main Content</h2>
<p>This is the main content area. It takes up more space than the sidebar.</p>
</div>
<div class="sidebar">
<h2
>Sidebar</h2>
<p>This is the sidebar.</p>
</div>
</div>
<!-- Footer -->
<div class="footer">
<p>Footer Section</p>
</div>
</div>
</body>
</html>
Explanation:
- Flex Container: The
.container
div is set todisplay: flex;
, and it stacks the header, main content, and footer vertically usingflex-direction: column;
. - Main Content: Inside the
.main-content
container, the main section (.main
) takes up more space (flex: 3;
) than the sidebar (flex: 1;
). - Footer: The footer stays at the bottom of the page, even when content is minimal, thanks to
flex: 1;
on the main content container.
Conclusion
CSS Flexbox is a powerful layout model that simplifies the process of creating responsive, flexible designs. By using Flexbox properties, you can control how elements behave within a container, distribute space, and align items with precision. Whether you are building a simple webpage or a complex web application, Flexbox provides the tools to create adaptable layouts that work on any screen size.