Columns

Learn how to modify columns with a handful of options for alignment, ordering, and offsetting thanks to our flexbox grid system. Plus, see how to use column properties to manage widths of non-grid elements.

On this page

Alignment

Use align utilities to vertically and horizontally align columns.

Vertical alignment

One of three cols
One of three cols
One of three cols
One of three cols
One of three cols
One of three cols
One of three cols
One of three cols
One of three cols
vue
<template>
  <Container>
    <Row align-items="start">
      <Col>One of three cols</Col>
      <Col>One of three cols</Col>
      <Col>One of three cols</Col>
    </Row>
    <Row align-items="center">
      <Col>One of three cols</Col>
      <Col>One of three cols</Col>
      <Col>One of three cols</Col>
    </Row>
    <Row align-items="end">
      <Col>One of three cols</Col>
      <Col>One of three cols</Col>
      <Col>One of three cols</Col>
    </Row>
  </Container>
</template>

.self-start
.self-center
.self-end
vue
<template>
  <Container>
    <Row>
      <Col align-self="start">
        .self-start
      </Col>
      <Col align-self="center">
        .self-center
      </Col>
      <Col align-self="end">
        .self-end
      </Col>
    </Row>
  </Container>
</template>

Horizontal alignment

justify-start
One of two cols
One of two cols
justify-center
One of two cols
One of two cols
justify-end
One of two cols
One of two cols
justify-around
One of two cols
One of two cols
justify-between
One of two cols
One of two cols
justify-evenly
One of two cols
One of two cols
vue
<template>
  <Container>
    <Badge>justify-start</Badge>
    <Row justify-content="start">
      <Col col="4">
        One of two cols
      </Col>
      <Col col="4">
        One of two cols
      </Col>
    </Row>
    <Badge>justify-center</Badge>
    <Row justify-content="center">
      <Col col="4">
        One of two cols
      </Col>
      <Col col="4">
        One of two cols
      </Col>
    </Row>
    <Badge>justify-end</Badge>
    <Row justify-content="end">
      <Col col="4">
        One of two cols
      </Col>
      <Col col="4">
        One of two cols
      </Col>
    </Row>
    <Badge>justify-around</Badge>
    <Row justify-content="around">
      <Col col="4">
        One of two cols
      </Col>
      <Col col="4">
        One of two cols
      </Col>
    </Row>
    <Badge>justify-between</Badge>
    <Row justify-content="between">
      <Col col="4">
        One of two cols
      </Col>
      <Col col="4">
        One of two cols
      </Col>
    </Row>
    <Badge>justify-evenly</Badge>
    <Row justify-content="evenly">
      <Col col="4">
        One of two cols
      </Col>
      <Col col="4">
        One of two cols
      </Col>
    </Row>
  </Container>
</template>

Column wrapping

If more than 12 columns are placed within a single row, each group of extra columns will, as one unit, wrap onto a new line.

.col-9
.col-4
Since 9 + 4 = 13 > 12, this 4-column-wide div gets wrapped onto a new line as one contiguous unit.
.col-6
Subsequent columns continue along the new line.
vue
<template>
  <Container>
    <Row>
      <Col col="9">
        .col-9
      </Col>
      <Col col="4">
        .col-4
        <br>
        Since 9 + 4 = 13 &gt; 12, this 4-column-wide div gets wrapped onto a new
        line as one contiguous unit.
      </Col>
      <Col col="6">
        .col-6
        <br>
        Subsequent columns continue along the new line.
      </Col>
    </Row>
  </Container>
</template>

<!-- <style lang="sass" scoped>
.row > div
  padding: 10px 15px
  background: rgba(86,61,124,.15)
  border: 1px solid rgba(86,61,124,.2)
.row + .row
  margin-top: 1rem
.row
  background: rgba(255,0,0,.1)
</style> -->

Column breaks

Breaking columns to a new line in flexbox requires a small hack:

add an element with width="100" wherever you want to wrap your columns to a new line.

Normally this is accomplished with multiple <Row></Row>s, but not every implementation method can account for this.

.col-6 .col-sm-3
.col-6 .col-sm-3
.col-6 .col-sm-3
.col-6 .col-sm-3
vue
<template>
  <Container>
    <Row>
      <Col col="6 sm-3">
        .col-6 .col-sm-3
      </Col>
      <Col col="6 sm-3">
        .col-6 .col-sm-3
      </Col>
      <b-div relative-width="100" />
      <Col col="6 sm-3">
        .col-6 .col-sm-3
      </Col>
      <Col col="6 sm-3">
        .col-6 .col-sm-3
      </Col>
    </Row>
  </Container>
</template>

You may also apply this break at specific breakpoints with our responsive display utilities.

.col-6 .col-sm-4
.col-6 .col-sm-4
.col-6 .col-sm-4
.col-6 .col-sm-4
vue
<template>
  <Container>
    <Row>
      <Col col="6 sm-4">
        .col-6 .col-sm-4
      </Col>
      <Col col="6 sm-4">
        .col-6 .col-sm-4
      </Col>
      <b-div
        relative-width="100"
        display="none md-block"
      />
      <Col col="6 sm-4">
        .col-6 .col-sm-4
      </Col>
      <Col col="6 sm-4">
        .col-6 .col-sm-4
      </Col>
    </Row>
  </Container>
</template>

Reordering

Order classes

Use order attribute for controlling the visual order of your content.

These classes are responsive, so you can set the order by breakpoint (e.g., order="1 md-2").

Includes support for 1 through 5 across all six grid tiers.

First in DOM, no order applied
Second in DOM, with a larger order
Third in DOM, with an order of 1
vue
<template>
  <Container>
    <Row>
      <Col>First in DOM, no order applied</Col>
      <Col order="5">
        Second in DOM, with a larger order
      </Col>
      <Col order="1">
        Third in DOM, with an order of 1
      </Col>
    </Row>
  </Container>
</template>

There are also responsive order="first" and order="last" classes that change the order of an element by applying order: -1 and order: 6, respectively.

These classes can also be intermixed with the numbered order="* classes as needed.

First in DOM, ordered last
Second in DOM, unordered
Third in DOM, ordered first
vue
<template>
  <Container>
    <Row>
      <Col order="last">
        First in DOM, ordered last
      </Col>
      <Col>Second in DOM, unordered</Col>
      <Col order="first">
        Third in DOM, ordered first
      </Col>
    </Row>
  </Container>
</template>

Offsetting columns

You can offset grid columns in two ways: our responsive offset grid attributes and our margin utilities .

Grid attributes are sized to match columns while margins are more useful for quick layouts where the width of the offset is variable.

Offset classes

Move columns to the right using offset="md-*" classes.

These classes increase the left margin of a column by * columns. For example, offset="md-4"moves col="md-4" over four columns.

.col-md-4
.col-md-4 .offset-md-4
.col-md-3 .offset-md-3
.col-md-3 .offset-md-3
.col-md-6 .offset-md-3
vue
<template>
  <Container>
    <Row>
      <Col col="md-4">
        .col-md-4
      </Col>
      <Col
        col="md-4"
        offset="md-4"
      >
        .col-md-4 .offset-md-4
      </Col>
    </Row>
    <Row>
      <Col
        col="md-3"
        offset="md-3"
      >
        .col-md-3 .offset-md-3
      </Col>
      <Col
        col="md-3"
        offset="md-3"
      >
        .col-md-3 .offset-md-3
      </Col>
    </Row>
    <Row>
      <Col
        col="md-6"
        offset="md-3"
      >
        .col-md-6 .offset-md-3
      </Col>
    </Row>
  </Container>
</template>
.col-sm-5 .col-md-6
.col-md-4 .offset-md-4
.col-sm-6 .col-md-5 .col-lg-6
.col-sm-6 .col-md-5 .offset-md-2 .col-lg-6 .offset-lg-0
vue
<template>
  <Container>
    <Row>
      <Col col="sm-5 md-6">
        .col-sm-5 .col-md-6
      </Col>
      <Col
        col="sm-5 md-6"
        offset="sm-2 md-0"
      >
        .col-md-4 .offset-md-4
      </Col>
    </Row>
    <Row>
      <Col col="sm-6 md-5 lg-6">
        .col-sm-6 .col-md-5 .col-lg-6
      </Col>
      <Col
        col="sm-6 md-5 lg-6"
        offset="md-2 lg-0"
      >
        .col-sm-6 .col-md-5 .offset-md-2 .col-lg-6 .offset-lg-0
      </Col>
    </Row>
  </Container>
</template>

Margin utilities

you can use margin utilities like margin="e-auto" to force sibling columns away from one another.

.col-md-4
.col-md-4 .ms-auto
.col-md-3 .ms-md-auto
.col-md-3 .ms-md-auto
.col-auto .me-auto
.col-auto
vue
<template>
  <Container>
    <Row>
      <Col col="md-4">
        .col-md-4
      </Col>
      <Col
        col="md-4"
        margin="s-auto"
      >
        .col-md-4 .ms-auto
      </Col>
    </Row>
    <Row>
      <Col
        col="md-3"
        margin="s-md-auto"
      >
        .col-md-3 .ms-md-auto
      </Col>
      <Col
        col="md-3"
        margin="s-md-auto"
      >
        .col-md-3 .ms-md-auto
      </Col>
    </Row>
    <Row>
      <Col
        col="auto"
        margin="e-auto"
      >
        .col-auto .me-auto
      </Col>
      <Col col="auto">
        .col-auto
      </Col>
    </Row>
  </Container>
</template>

Standalone column classes

The col="*" classes can also be used outside a row to give an element a specific width.

Whenever column classes are used as non direct children of a row, the paddings are omitted.

.col-3: width of 25%
.col-sm-9: width of 75% above sm breakpoint
vue
<template>
  <Col
    col="3"
    background-color="light"
    padding="3"
    border
  >
    .col-3: width of 25%
  </Col>
  <Col
    col="sm-9"
    background-color="light"
    padding="3"
    border
  >
    .col-sm-9: width of 75% above sm breakpoint
  </Col>
</template>

The attributes can be used together with utilities to create responsive floated images.

Make sure to wrap the content in a clearfix wrapper to clear the float if the text is shorter.

A paragraph of placeholder text. We're using it here to show the use of the clearfix class. We're adding quite a few meaningless phrases here to demonstrate how the columns interact here with the floated image.

As you can see the paragraphs gracefully wrap around the floated image. Now imagine how this would look with some actual content in here, rather than just this boring placeholder text that goes on and on, but actually conveys no tangible information at. It simply takes up space and should not really be read.

And yet, here you are, still persevering in reading this placeholder text, hoping for some more insights, or some hidden easter egg of content. A joke, perhaps. Unfortunately, there's none of that here.

vue
<template>
  <b-div clearfix>
    <b-img
      src="https://dummyimage.com/377x210/868e96/ffffff&text=Responsive floated image"
      col="md-6"
      float="md-end"
      margin="b-3 s-md-3"
    />
    <b-p>
      A paragraph of placeholder text. We're using it here to show the use of
      the clearfix class. We're adding quite a few meaningless phrases here to
      demonstrate how the columns interact here with the floated image.
    </b-p>
    <b-p>
      As you can see the paragraphs gracefully wrap around the floated image.
      Now imagine how this would look with some actual content in here, rather
      than just this boring placeholder text that goes on and on, but actually
      conveys no tangible information at. It simply takes up space and should
      not really be read.
    </b-p>
    <b-p>
      And yet, here you are, still persevering in reading this placeholder text,
      hoping for some more insights, or some hidden easter egg of content. A
      joke, perhaps. Unfortunately, there's none of that here.
    </b-p>
  </b-div>
</template>