Re-Order Grid Columns in Bootstrap 5
Tags: css, bootstrap, webdev, html
Published: 2021-06-09 15:13:59

A key aspect of responsive design that Bootstrap provides is the ability to change the position of content on different devices and screen widths.
--

---

Why Change Content Order?
==

A common use-case is a typical 2-column page layout. Often, the vertical stacking of columns is desired on smaller screen devices (tablets & phones) where horizontal space is limited. Arguably, this may also help with SEO as the main content is closer to the top of the page when search engines like Google crawl the page. 

Using the [Bootstrap 5 ordering classes](https://getbootstrap.com/docs/5.0/utilities/flex/#order) we’re able to utilize the column ordering feature of the Bootstrap grid. On small (mobile) screens we want to show our main content at the top and then the sidebar nav below.

![Change column order in Bootstrap - small devices](https://miro.medium.com/max/349/0*AlKX212q7aw97Eqo.png)

![Change column order in Bootstrap - larger devices](https://miro.medium.com/max/700/0*OOg6tVKShm55sLxZ.png)

---

Flexbox Parent & Children
==

As you may know the Bootstrap 5 grid utilizes **Flexbox**. The concept of "parent & children" in Flexbox equates to the "row & columns" of the Bootstrap grid. One ***parent*** row containing one or more ***child*** columns...

```
<div class="row">
    <div class="col">
         Child 1
    </div>
    <div class="col">
         Child 2
    </div>
    <div class="col">
         Child 3
    </div>
</div>
```
Natural vs. Visual Order
==

Notice that the ***natural order*** of the columns is:

|---1---|---2---|---3---|

Using the flex ordering CSS classes we can change the ***visual order*** of the columns...

```
<div class="row">
      <div class="col order-2"> Child 1 </div>
      <div class="col order-1"> Child 2 </div>
      <div class="col order-3"> Child 3 </div>
</div>
```

|---2---|---1---|---3---|

[Simple Bootstrap Ordering Demo](https://codeply.com/p/T52wfQIdG6)

As you can see, the columns are in the same *natural order*, but the *visual order* has changed by using the `order-*` classes on the columns.

---

In practice, we would want to ***change the visual order depending on the screen width***. For example, suppose I want this order on *larger screens*...

|---3---|---2---|---1---|

But on *smaller screens* I want this (natural) order...

|---1---|---2---|---3---|

We can achieve this using the responsive `order-lg-*` classes to control the larger (992px and wider) breakpoint:

```
<div class="row">
    <div class="col border order-lg-3"> Child 1 </div>
    <div class="col border order-lg-2"> Child 2 </div>
    <div class="col border order-lg-1"> Child 3 </div>
</div>
```

[See row 3 of the demo](https://codeply.com/p/T52wfQIdG6)

---

Since Bootstrap provides many [ordering classes for all 6 breakpoints](https://getbootstrap.com/docs/5.0/utilities/flex/#order) you can manipulate the position of columns in exhaustively many ways...

Here's the responsive [Codeply with more re-ordering examples](https://codeply.com/p/XLuC2eGQND)

Before wrapping-up let's revisit the 1st use-case of changing the order of a 2-column layout. The markup is soooo simple...

```
<div class="row">
    <div class="col-sm-3 order-sm-first order-last"> Sidebar </div>
    <div class="col-sm"> Main </div>
</div>
```

[See row 4 of the demo](https://codeply.com/p/T52wfQIdG6)

The use of `order-sm-first order-last` on the Sidebar translates to "order first on small and wider", and "order last on extra small (xs)".

I hope this has given you a little insight as to how ordering works in Bootstrap 5. Please share your thoughts and questions in the comments. 

😎B5