Skip to main content

Layout grid

Create layout grids based on a 12-column system



How it works

The grid system uses a series of containers, rows, and columns to lay out and align content. The following row and corresponding code are an example of an in-depth look at how the grid comes together.

tablet:grid-col
tablet:grid-col
tablet:grid-col
<div class="grid-container">
  <div class="grid-row">
    <div class="tablet:grid-col border-1px bg-secondary-lighter padding-2 text-center">tablet:grid-col</div>
    <div class="tablet:grid-col border-1px bg-secondary-lighter padding-2 text-center">tablet:grid-col</div>
    <div class="tablet:grid-col border-1px bg-secondary-lighter padding-2 text-center">tablet:grid-col</div>
  </div>
</div>

This example code creates three equal-width columns on tablet, desktop, and widescreen devices by using our predefined grid classes. Those columns are centered in the page with the parent grid-container container.

The following sections break the layout grid down and describe how it works.

Containers, rows, and columns

  • Containers: grid-container centers the container and gives it a maximum width of desktop (1024px). If you would like the grid to span the full width of the page, do not use grid-container.
    • grid-container can also accept any breakpoint width, like tablet-lg or widescreen.
    • By default, grid-container has a padding-x of 2 units at narrow widths, and a padding-x of 4 units at desktop and wider.
  • Rows: Columns must have a grid-row as a parent.
  • Columns: grid-col-[1-12] indicates the number of columns the item spans out of a possible 12 per row. So, if you want three equal-width columns across, use grid-col-4 for each item.

Additional functionality

  • Equal-width columns: With flexbox, grid columns without a specified width will display as equal-width columns. For example, four instances of grid-col will display as one-quarter-width columns across all sizes. Refer to the auto-layout columns section for more examples.
  • Gutters: Rows and columns don’t have any gutters by default, but gutters can be added by including grid-gap-sm, grid-gap, or grid-gap-lg at the row level. Refer to gutters for more info.
  • Media queries: Grid breakpoints are based on minimum-width media queries, meaning they apply to that specific width and all greater widths (e.g., tablet:col-4 applies to tablet, desktop, and widescreen devices but not at mobile-lg or any width below the tablet breakpoint). Refer to responsive variants for a full list.
  • Auto layout columns

    Variable-width content

    .grid-col-auto items fit the natural width of their content.

    .grid-col and .grid-col-fill items flex to fill the available space as illustrated in the following example row and code.

    .grid-col-auto
    .grid-col
    .grid-col-fill
    .grid-col-auto
    <div class="grid-container">
      <div class="grid-row">
        <div class="grid-col-auto border-1px bg-secondary-lighter padding-2 text-center">.grid-col-auto</div>
        <div class="grid-col border-1px bg-secondary-lighter padding-2 text-center">.grid-col</div>
        <div class="grid-col-fill border-1px bg-secondary-lighter padding-2 text-center">.grid-col-fill</div>
        <div class="grid-col-auto border-1px bg-secondary-lighter padding-2 text-center">.grid-col-auto</div>
      </div>
    </div>

    Responsive classes

    Same at all breakpoints

    For columns that should maintain the same proportion at any viewport width, use the .grid-col and .grid-col-* classes. Specify a numbered class when you need a column of a specific width; otherwise, use .grid-col.

    .grid-col-[1-12] sets a fixed width of [n] grid columns in a 12-column grid.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    .grid-col-1
    .grid-col-2
    .grid-col-3
    .grid-col-4
    .grid-col-2
    .grid-col-8
    .grid-col-2
    .grid-col-2
    <div class="grid-row">
      <div class="grid-col-1 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-1</div>
      <div class="grid-col-2 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-2</div>
      <div class="grid-col-3 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-3</div>
      <div class="grid-col-4 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-4</div>
      <div class="grid-col-2 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-2</div>
    </div>
    
    <div class="grid-row">
      <div class="grid-col-8 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-8</div>
      <div class="grid-col-2 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-2</div>
      <div class="grid-col-2 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-2</div>
    </div>

    Stacked columns at narrow widths

    Columns are full-width until the narrowest breakpoint specified in a .grid-col class. For instance, using a single set of tablet:grid-col-* classes, you can create a basic grid system that starts out stacked before displaying as columns at the tablet breakpoint (tablet:) as illustrated in the following rows and corresponding code.

    .tablet:grid-col
    .tablet:grid-col
    .tablet:grid-col
    .tablet:grid-col-4
    .tablet:grid-col-8
    <div class="grid-row">
      <div class="tablet:grid-col border-1px bg-secondary-lighter padding-2 text-center">.tablet:grid-col</div>
      <div class="tablet:grid-col border-1px bg-secondary-lighter padding-2 text-center">.tablet:grid-col</div>
      <div class="tablet:grid-col border-1px bg-secondary-lighter padding-2 text-center">.tablet:grid-col</div>
    </div>
    
    <div class="grid-row">
      <div class="tablet:grid-col-4 border-1px bg-secondary-lighter padding-2 text-center">.tablet:grid-col-4</div>
      <div class="tablet:grid-col-8 border-1px bg-secondary-lighter padding-2 text-center">.tablet:grid-col-8</div>
    </div>

    Mix and match

    Don’t want your columns to simply stack in some breakpoints? Use a combination of different classes for each breakpoint as needed. See the following example rows and corresponding code for a better idea of how it all works.

    .tablet:grid-col-8
    .grid-col-6 .tablet:grid-col-4
    .grid-col-6 .tablet:grid-col-4
    .grid-col-6 .tablet:grid-col-4
    .grid-col-6 .tablet:grid-col-4
    .grid-col-6
    .grid-col-6
    <!-- Stack the columns on mobile by making one full-width and the other half-width -->
    <div class="grid-row">
      <div class="tablet:grid-col-8 border-1px bg-secondary-lighter padding-2 text-center">.tablet:grid-col-8</div>
      <div class="grid-col-6 tablet:grid-col-4 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-6 .tablet:grid-col-4</div>
    </div>
    
    <!-- Columns start at 50% wide on mobile and bump up to 33.3% wide on desktop -->
    <div class="grid-row">
      <div class="grid-col-6 tablet:grid-col-4 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-6 .tablet:grid-col-4</div>
      <div class="grid-col-6 tablet:grid-col-4 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-6 .tablet:grid-col-4</div>
      <div class="grid-col-6 tablet:grid-col-4 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-6 .tablet:grid-col-4</div>
    </div>
    
    <!-- Columns are always 50% wide, on mobile and desktop -->
    <div class="grid-row">
      <div class="grid-col-6 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-6</div>
      <div class="grid-col-6 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-6</div>
    </div>

    Offsetting columns

    .grid-offset-[1-12] offsets an item by the specified number of grid columns as shown in the following example.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    .grid-col-8.grid-offset-4
    <div class="grid-row">
      <div class="grid-col-8 grid-offset-4 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-8.grid-offset-4</div>
    </div>

    Column wrapping

    Items wrap when the sum of the grid columns is more than 12 as shown in the following example.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    .grid-col-8
    .grid-col-3
    .grid-col-5
    <div class="grid-row">
      <div class="grid-col-8 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-8</div>
      <div class="grid-col-3 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-3</div>
      <div class="grid-col-5 border-1px bg-secondary-lighter padding-2 text-center">.grid-col-5</div>
    </div>

    Gutters

    Default gutter

    Add grid-gap to a grid row to add a gap (or gutter) between each column in the row. The default gap width is 2 units and 4 units at desktop and higher. Customize the width of the gap by adjusting the value of $theme-column-gap in project settings as shown in the following example.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    .grid-col-4
    .grid-col-4
    .grid-col-4
    <div class="grid-row grid-gap">
      <div class="grid-col-4 border-1px bg-secondary-lighter padding-2 text-center">
        <div>.grid-col-4</div>
      </div>
      <div class="grid-col-4 border-1px bg-secondary-lighter padding-2 text-center">
        <div>.grid-col-4</div>
      </div>
      <div class="grid-col-4 border-1px bg-secondary-lighter padding-2 text-center">
        <div>.grid-col-4</div>
      </div>
    </div>

    Large gutter

    grid-gap-lg adds a larger gap (or gutter) between each column in a row than `grid-gap`. The default large-gap width is 32px (4 spacing units). Customize the width of the large gap by adjusting the value of $theme-column-gap-lg in project settings. There is also a .grid-gap-sm (2px) set with $theme-column-gap-sm. Also, you can add the following system values with grid-gap:

    • grid-gap-2px
    • grid-gap-05
    • grid-gap-1
    • grid-gap-2
    • grid-gap-3
    • grid-gap-4
    • grid-gap-5
    • grid-gap-6

    The following example row and code illustrate large gutters.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    .grid-col-4
    .grid-col-4
    .grid-col-4
    <div class="grid-row grid-gap-lg">
      <div class="grid-col-4 border-1px bg-secondary-lighter padding-2 text-center">
        <div>.grid-col-4</div>
      </div>
      <div class="grid-col-4 border-1px bg-secondary-lighter padding-2 text-center">
        <div>.grid-col-4</div>
      </div>
      <div class="grid-col-4 border-1px bg-secondary-lighter padding-2 text-center">
        <div>.grid-col-4</div>
      </div>
    </div>


    Utility variants

    Responsive variants

    More information about utility variants can be viewed on the utility variants page. You can view which responsive breakpoints are available for the layout grid in the responsive utilities section on that page.

    Looking for U.S. government information and services?
    Visit USA.gov