Flex-direction Solution

This lesson is the solution to the Flex-direction exercise in the previous lesson.

The following steps provide a complete solution to the flex-direction exercise:

Step 1: Markup

We could create two divs with three children each for the columns, or three divs with two children each for the rows.

As the order of the boxes should stay natural, and we cannot reposition the inner divs, we will create three rows with two children each:

<div class="flex-container">
  <div class="flex-item">First</div>
  <div class="flex-item">Second</div>
</div>
<div class="flex-container">
  <div class="flex-item">Third</div>
  <div class="flex-item">Fourth</div>
</div>
<div class="flex-container">
  <div class="flex-item">Fifth</div>
  <div class="flex-item">Sixth</div>
</div>

Step 2: Basic CSS setup with media query

We will address the following points:

  • The minimum width of the page should be 400 pixels
  • Colors: the page background should be lightblue
body {
  min-width: 400px;
  background-color: lightblue;
}
  • Below the 600 pixels screen width, each box is 400 pixel wide and is centered horizontally
  • The top and bottom margin around the boxes is 40px
  • The height of each box is 200px
  • At or above the 600px width, each box is 250px wide and there is a 25px margin around the boxes
  • The boxes have an orange background

Note that we will make use of the mobile-first setup we learned in the first chapter of the course. After defining generic styles, we will only have to take care of incremental style definitions at or above 600px.

Note the exercise does not specify the height explicitly at or above 600px screen width. In this case, we will inherit the generic height of 200px, as the below 600px height is inherited at or above 600px.

The 25px margin overrides all margins (top, right, bottom, left) at or above 600px.

body {
  min-width: 400px;
  background-color: lightblue;
}

.flex-item {
  width: 400px;
  height: 200px;
  margin: 40px auto;
  background-color: orange;
}

@media only screen and (min-width: 600px) {
  .flex-item {
    width: 250px;
    margin: 25px;
  }
}

Step 3: border-box

  • Despite adding a 1px black border, two boxes should fit next to each other even at 600px page width
  • The boxes are aligned to the left

The left alignment automatically applies.

The tool that helps us fit 600px of content and 2px of border in 600px is the border-box box-sizing model. This model includes the border width in the box width, therefore, instead of 602px, we only have 600px content to deal with in each row.

A generic best practice is to add a CSS reset to set the margin, padding, and box-sizing model of all elements in the code. We will perform this reset at the top of the stylesheet.

Although it is up to interpretation whether the 1px black border is to be added to screen sizes below 600px, common sense dictates that we use uniform style for all screen sizes.

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  min-width: 400px;
  background-color: lightblue;
}

.flex-item {
  width: 400px;
  height: 200px;
  margin: 40px auto;
  background-color: orange;
  border: 1px solid black;
}

@media only screen and (min-width: 600px) {
  .flex-item {
    width: 250px;
    margin: 25px;
  }
}

Step 4: Flexbox

There is no need to change anything else below 600px screen width, because the block layout already displays the rectangles perfectly.

At or above 600px, we will need to add display: flex;

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  min-width: 400px;
  background-color: lightblue;
}

.flex-item {
  width: 400px;
  height: 200px;
  margin: 40px auto;
  background-color: orange;
  border: 1px solid black;
}

@media only screen and (min-width: 600px) {
  .flex-container {
    display: flex;
  }

  .flex-item {
    width: 250px;
    margin: 25px;
  }
}

Step 5: 900px layout

Let’s define the 900px media query. Everything else stays intact.

In this small example, we will use the body as an outer Flex container. Normally, we would need an external component as a flex container. In real-world projects, create another container.

@media only screen and (min-width: 900px) {
  body {
    display: flex;
  }

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

The above stylesheet defines the

First  Third  Fifth 
Second Fourth Sixth

layout. For the reversed layout, consider adding flex-direction: row-reverse to the body:

@media only screen and (min-width: 900px) {
  body {
    display: flex;
    flex-direction: row-reverse;
  }

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

The complete solution

Let’s summarize all the steps in a complete solution.

Get hands-on with 1400+ tech skills courses.