Altcademy - a Forbes magazine logo Best Coding Bootcamp 2023

What is Flexbox in CSS?

Flexbox, short for Flexible Box, is a powerful layout mode in CSS that allows you to control the distribution, alignment, and ordering of elements within a container. It's particularly useful for building responsive designs, where elements need to adapt to different screen sizes and orientations. In this blog post, we'll explore the basics of Flexbox, its properties, and how to use it in your web projects.

The Flex Container

Before diving into the properties of Flexbox, it's essential to understand the concept of the flex container. A flex container is an HTML element with its display property set to flex or inline-flex. Any child elements inside a flex container automatically become flex items.

Here's an example of a simple flex container with three child elements:

<div class="flex-container">
  <div>Item 1</div>
  <div>Item 2</div>
  <div>Item 3</div>
</div>
.flex-container {
  display: flex;
}

The above code snippet creates a flex container with three flex items. By default, the flex items will be displayed horizontally, and they will not wrap onto a new line if the container's width is too small.

Flexbox Properties

There are two sets of Flexbox properties: one for the flex container and another for the flex items. Let's start by discussing the properties that apply to the flex container.

Flex Direction

The flex-direction property determines the main axis along which the flex items are laid out. It has four possible values:

  • row (default): Items are arranged from left to right, in the order they appear in the HTML.
  • row-reverse: Items are arranged from right to left, in the reverse order they appear in the HTML.
  • column: Items are arranged from top to bottom, in the order they appear in the HTML.
  • column-reverse: Items are arranged from bottom to top, in the reverse order they appear in the HTML.
.flex-container {
  flex-direction: row;
}

Flex Wrap

The flex-wrap property controls whether the flex items should wrap onto a new line when there's not enough space in the container. It has three possible values:

  • nowrap (default): Items will not wrap and may shrink to fit the container.
  • wrap: Items will wrap onto a new line if there's not enough space in the container.
  • wrap-reverse: Items will wrap onto a new line, but the order of the lines will be reversed.
.flex-container {
  flex-wrap: wrap;
}

Justify Content

The justify-content property defines how the flex items should be aligned along the main axis. It has five possible values:

  • flex-start (default): Items are aligned at the beginning of the container.
  • flex-end: Items are aligned at the end of the container.
  • center: Items are centered within the container.
  • space-between: Items are evenly distributed, with the first item at the start of the container and the last item at the end.
  • space-around: Items are evenly distributed, with equal space around each item.
.flex-container {
  justify-content: center;
}

Align Items

The align-items property defines how the flex items should be aligned along the cross axis (perpendicular to the main axis). It has five possible values:

  • stretch (default): Items stretch to fill the container in the cross axis direction.
  • flex-start: Items are aligned at the start of the container.
  • flex-end: Items are aligned at the end of the container.
  • center: Items are centered within the container.
  • baseline: Items are aligned along their baselines (the imaginary line along which the text of each item is aligned).
.flex-container {
  align-items: center;
}

Now let's discuss the properties that apply to flex items.

Flex Grow

The flex-grow property controls how much a flex item can grow if there's extra space in the container. The default value is 0, which means the item will not grow. If you set it to a positive number, the item will grow by that factor, relative to the other items in the container.

For example, if you have three items with flex-grow values of 1, 2, and 3, the first item will grow half as much as the second item, and the third item will grow three times as much as the first item.

.item1 {
  flex-grow: 1;
}

.item2 {
  flex-grow: 2;
}

.item3 {
  flex-grow: 3;
}

Flex Shrink

The flex-shrink property controls how much a flex item can shrink if there's not enough space in the container. The default value is 1, which means the item can shrink proportionally to fit the container. If you set it to 0, the item will not shrink.

.item1 {
  flex-shrink: 0;
}

Flex Basis

The flex-basis property sets the initial size of a flex item before any growing or shrinking occurs. The default value is auto, which means the item's size will be determined by its content. You can also set it to a specific length, like 50% or 200px.

.item1 {
  flex-basis: 50%;
}

Flex

The flex property is a shorthand for setting flex-grow, flex-shrink, and flex-basis in one declaration. The syntax is: flex: <grow> <shrink> <basis>.

.item1 {
  flex: 1 0 50%;
}

Order

The order property allows you to change the order in which flex items appear in the container, without changing the HTML markup. The default value is 0, and you can set it to any integer value.

.item1 {
  order: 2; /* This item will be displayed after item2 */
}

.item2 {
  order: 1;
}

Putting It All Together

Let's take a look at a complete example using Flexbox to create a responsive navigation bar with a logo on the left and menu items on the right.

<header class="navbar">
  <div class="logo">Logo</div>
  <nav class="menu">
    <a href="#">Home</a>
    <a href="#">About</a>
    <a href="#">Contact</a>
  </nav>
</header>
.navbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1rem;
  background-color: #333;
  color: white;
}

.logo {
  font-weight: bold;
  font-size: 1.5rem;
}

.menu {
  display: flex;
}

.menu a {
  margin-left: 1rem;
  text-decoration: none;
  color: white;
}

In this example, we've used Flexbox to create a responsive navigation bar that adapts to different screen sizes and orientations. By combining the various properties of Flexbox, you can create a wide range of layouts with ease.

In conclusion, Flexbox is a powerful and versatile layout mode in CSS that allows you to control the distribution, alignment, and ordering of elements within a container. By understanding and applying the properties of Flexbox, you can create responsive and flexible designs that adapt to different screen sizes and orientations. Practice using Flexbox in your projects, and you'll soon find it an invaluable tool in your web development toolbox.