grid.md 17.2 KB
Newer Older
Mark Otto's avatar
Mark Otto committed
1
---
Mark Otto's avatar
Mark Otto committed
2
layout: docs
Mark Otto's avatar
Mark Otto committed
3
title: Grid system
Mark Otto's avatar
Mark Otto committed
4
description: Documentation and examples for using Bootstrap's powerful, responsive, and mobile-first grid system.
5
group: layout
Mark Otto's avatar
Mark Otto committed
6
---
Mark Otto's avatar
Mark Otto committed
7

Mark Otto's avatar
Mark Otto committed
8
Bootstrap includes a powerful mobile-first grid system for building layouts of all shapes and sizes. It's based on a 12 column layout and has multiple tiers, one for each [media query range]({{ site.baseurl }}/layout/overview/#responsive-breakpoints). You can use it with Sass mixins or our predefined classes.
Mark Otto's avatar
Mark Otto committed
9

Mark Otto's avatar
Mark Otto committed
10
11
12
13
14
## Contents

* Will be replaced with the ToC, excluding the "Contents" header
{:toc}

Mark Otto's avatar
Mark Otto committed
15
## How it works
Mark Otto's avatar
Mark Otto committed
16

Mark Otto's avatar
Mark Otto committed
17
At a high level, here's how the grid system works:
Mark Otto's avatar
Mark Otto committed
18

Mark Otto's avatar
Mark Otto committed
19
20
21
22
23
24
25
26
27
28
- There are three major components—containers, rows, and columns.
- Containers—`.container` for fixed width or `.container-fluid` for full width—center your site's contents and help align your grid content.
- Rows are horizontal groups of columns that ensure your columns are lined up properly.
- Content should be placed within columns, and only columns may be immediate children of rows.
- Column classes indicate the number of columns you'd like to use out of the possible 12 per row. So if you want three equal-width columns, you'd use `.col-sm-4`.
- Column `width`s are set in percentages, so they're always fluid and sized relative to their parent element.
- Columns have horizontal `padding` to create the gutters between individual columns.
- There are five grid tiers, one for each [responsive breakpoint]({{ site.baseurl }}/layout/overview/#responsive-breakpoints): extra small, small, medium, large, and extra large.
- Grid tiers are based on minimum widths, meaning they apply to that one tier and all those above it (e.g., `.col-sm-4` applies to small, medium, large, and extra large devices).
- You can use predefined grid classes or Sass mixins for more semantic markup.
Mark Otto's avatar
Mark Otto committed
29

Mark Otto's avatar
Mark Otto committed
30
Sounds good? Great, let's move on to seeing all that in an example.
Mark Otto's avatar
Mark Otto committed
31

Mark Otto's avatar
Mark Otto committed
32
## Quick start example
Mark Otto's avatar
Mark Otto committed
33

Mark Otto's avatar
Mark Otto committed
34
35
36
If you're using Bootstrap's compiled CSS, this the example you'll want to start with.

{% example html %}
Mark Otto's avatar
Mark Otto committed
37
<div class="container">
Mark Otto's avatar
Mark Otto committed
38
  <div class="row">
39
    <div class="col-sm-4">
Mark Otto's avatar
Mark Otto committed
40
      One of three columns
Mark Otto's avatar
Mark Otto committed
41
    </div>
42
    <div class="col-sm-4">
Mark Otto's avatar
Mark Otto committed
43
      One of three columns
Mark Otto's avatar
Mark Otto committed
44
    </div>
45
    <div class="col-sm-4">
Mark Otto's avatar
Mark Otto committed
46
47
48
49
50
51
      One of three columns
    </div>
  </div>
</div>
{% endexample %}

52
The above example creates three equal-width columns on small, medium, large, and extra large devices using our [predefined grid classes](#predefined-classes). Those columns are centered in the page with the parent `.container`.
Mark Otto's avatar
Mark Otto committed
53

Mark Otto's avatar
Mark Otto committed
54
## Grid options
Mark Otto's avatar
Mark Otto committed
55

Mark Otto's avatar
Mark Otto committed
56
While Bootstrap uses `em`s or `rem`s for defining most sizes, `px`s are used for grid breakpoints and container widths. This is because the viewport width is in pixels and does not change with the [font size](https://drafts.csswg.org/mediaqueries-3/#units).
57

Mark Otto's avatar
Mark Otto committed
58
59
60
61
62
63
64
See how aspects of the Bootstrap grid system work across multiple devices with a handy table.

<div class="table-responsive">
  <table class="table table-bordered table-striped">
    <thead>
      <tr>
        <th></th>
65
        <th class="text-xs-center">
66
          Extra small<br>
67
          <small>&lt;576px</small>
Mark Otto's avatar
Mark Otto committed
68
        </th>
69
        <th class="text-xs-center">
70
          Small<br>
71
          <small>&ge;576px</small>
Mark Otto's avatar
Mark Otto committed
72
        </th>
73
        <th class="text-xs-center">
74
          Medium<br>
75
          <small>&ge;768px</small>
Mark Otto's avatar
Mark Otto committed
76
        </th>
77
        <th class="text-xs-center">
78
          Large<br>
79
          <small>&ge;992px</small>
80
        </th>
81
        <th class="text-xs-center">
82
          Extra large<br>
83
          <small>&ge;1200px</small>
Mark Otto's avatar
Mark Otto committed
84
85
86
87
88
        </th>
      </tr>
    </thead>
    <tbody>
      <tr>
Mark Otto's avatar
Mark Otto committed
89
        <th class="text-nowrap" scope="row">Grid behavior</th>
Mark Otto's avatar
Mark Otto committed
90
        <td>Horizontal at all times</td>
91
        <td colspan="4">Collapsed to start, horizontal above breakpoints</td>
Mark Otto's avatar
Mark Otto committed
92
93
      </tr>
      <tr>
94
        <th class="text-nowrap" scope="row">Max container width</th>
Mark Otto's avatar
Mark Otto committed
95
        <td>None (auto)</td>
96
        <td>540px</td>
97
        <td>720px</td>
98
        <td>960px</td>
99
        <td>1140px</td>
Mark Otto's avatar
Mark Otto committed
100
101
      </tr>
      <tr>
Mark Otto's avatar
Mark Otto committed
102
        <th class="text-nowrap" scope="row">Class prefix</th>
Mark Otto's avatar
Mark Otto committed
103
104
105
106
        <td><code>.col-xs-</code></td>
        <td><code>.col-sm-</code></td>
        <td><code>.col-md-</code></td>
        <td><code>.col-lg-</code></td>
107
        <td><code>.col-xl-</code></td>
Mark Otto's avatar
Mark Otto committed
108
109
      </tr>
      <tr>
Mark Otto's avatar
Mark Otto committed
110
        <th class="text-nowrap" scope="row"># of columns</th>
111
        <td colspan="5">12</td>
Mark Otto's avatar
Mark Otto committed
112
113
      </tr>
      <tr>
Mark Otto's avatar
Mark Otto committed
114
        <th class="text-nowrap" scope="row">Gutter width</th>
115
        <td colspan="5">30px (15px on each side of a column)</td>
Mark Otto's avatar
Mark Otto committed
116
117
      </tr>
      <tr>
Mark Otto's avatar
Mark Otto committed
118
        <th class="text-nowrap" scope="row">Nestable</th>
119
        <td colspan="5">Yes</td>
Mark Otto's avatar
Mark Otto committed
120
121
      </tr>
      <tr>
Mark Otto's avatar
Mark Otto committed
122
        <th class="text-nowrap" scope="row">Offsets</th>
123
        <td colspan="5">Yes</td>
Mark Otto's avatar
Mark Otto committed
124
125
      </tr>
      <tr>
Mark Otto's avatar
Mark Otto committed
126
        <th class="text-nowrap" scope="row">Column ordering</th>
127
        <td colspan="5">Yes</td>
Mark Otto's avatar
Mark Otto committed
128
129
130
131
132
      </tr>
    </tbody>
  </table>
</div>

Mark Otto's avatar
Mark Otto committed
133
## Sass mixins
Mark Otto's avatar
Mark Otto committed
134

135
When using Bootstrap's source Sass files, you have the option of using Sass variables and mixins to create custom, semantic, and responsive page layouts. Our [predefined grid classes](#predefined-classes) use these same variables and mixins to provide a whole suite of ready-to-use classes for fast responsive layouts.
Mark Otto's avatar
Mark Otto committed
136

Mark Otto's avatar
Mark Otto committed
137
### Variables
Mark Otto's avatar
Mark Otto committed
138

Mark Otto's avatar
Mark Otto committed
139
Variables and maps determine the number of columns, the gutter width, and the media query point at which to begin floating columns. We use these to generate the predefined grid classes documented above, as well as for the custom mixins listed below.
Mark Otto's avatar
Mark Otto committed
140
141

{% highlight scss %}
Mark Otto's avatar
Mark Otto committed
142
$grid-columns:      12;
Kovah's avatar
Kovah committed
143
144
145
146
147
148
149
150
151
$grid-gutter-width-base: 30px;

$grid-gutter-widths: (
  xs: $grid-gutter-width-base, // 30px
  sm: $grid-gutter-width-base, // 30px
  md: $grid-gutter-width-base, // 30px
  lg: $grid-gutter-width-base, // 30px
  xl: $grid-gutter-width-base  // 30px
)
Mark Otto's avatar
Mark Otto committed
152

Mark Otto's avatar
Mark Otto committed
153
154
155
156
$grid-breakpoints: (
  // Extra small screen / phone
  xs: 0,
  // Small screen / phone
157
  sm: 576px,
Mark Otto's avatar
Mark Otto committed
158
  // Medium screen / tablet
159
  md: 768px,
Mark Otto's avatar
Mark Otto committed
160
  // Large screen / desktop
161
  lg: 992px,
Mark Otto's avatar
Mark Otto committed
162
  // Extra large screen / wide desktop
163
  xl: 1200px
164
);
Mark Otto's avatar
Mark Otto committed
165

Mark Otto's avatar
Mark Otto committed
166
$container-max-widths: (
167
  sm: 540px,
Mark Otto's avatar
Mark Otto committed
168
  md: 720px,
169
  lg: 960px,
Mark Otto's avatar
Mark Otto committed
170
  xl: 1140px
171
);
Mark Otto's avatar
Mark Otto committed
172
173
{% endhighlight %}

Mark Otto's avatar
Mark Otto committed
174
### Mixins
Mark Otto's avatar
Mark Otto committed
175
176
177
178
179

Mixins are used in conjunction with the grid variables to generate semantic CSS for individual grid columns.

{% highlight scss %}
// Creates a wrapper for a series of columns
Kovah's avatar
Kovah committed
180
@mixin make-row($gutters: $grid-gutter-widths) {
181
182
183
184
185
186
  @if $enable-flex {
    display: flex;
    flex-wrap: wrap;
  } @else {
    @include clearfix();
  }
Kovah's avatar
Kovah committed
187
188
189
190
191
192
193
194

  @each $breakpoint in map-keys($gutters) {
    @include media-breakpoint-up($breakpoint) {
      $gutter: map-get($gutters, $breakpoint);
      margin-right: ($gutter / -2);
      margin-left:  ($gutter / -2);
    }
  }
Mark Otto's avatar
Mark Otto committed
195
196
197
}

// Make the element grid-ready (applying everything but the width)
Kovah's avatar
Kovah committed
198
@mixin make-col-ready($gutters: $grid-gutter-widths) {
Mark Otto's avatar
Mark Otto committed
199
  position: relative;
200
201
202
203
204
  min-height: 1px; // Prevent collapsing

  // Prevent columns from becoming too narrow when at smaller grid tiers by
  // always setting `width: 100%;`. This works because we use `flex` values
  // later on to override this initial width.
205
  @if $enable-flex {
206
    width: 100%;
207
  }
Kovah's avatar
Kovah committed
208
209
210
211
212
213
214
215

  @each $breakpoint in map-keys($gutters) {
    @include media-breakpoint-up($breakpoint) {
      $gutter: map-get($gutters, $breakpoint);
      padding-right: ($gutter / 2);
      padding-left:  ($gutter / 2);
    }
  }
Mark Otto's avatar
Mark Otto committed
216
217
}

218
@mixin make-col($size, $columns: $grid-columns) {
219
220
221
222
223
224
225
  @if $enable-flex {
    flex: 0 0 percentage($size / $columns);
    // Add a `max-width` to ensure content within each column does not blow out
    // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari
    // do not appear to require this.
    max-width: percentage($size / $columns);
  } @else {
226
    float: left;
227
228
    width: percentage($size / $columns);
  }
Mark Otto's avatar
Mark Otto committed
229
230
231
}

// Get fancy by offsetting, or changing the sort order
232
233
@mixin make-col-offset($size, $columns: $grid-columns) {
  margin-left: percentage($size / $columns);
Mark Otto's avatar
Mark Otto committed
234
}
235
236
237

@mixin make-col-push($size, $columns: $grid-columns) {
  left: if($size > 0, percentage($size / $columns), auto);
Mark Otto's avatar
Mark Otto committed
238
}
239
240
241

@mixin make-col-pull($size, $columns: $grid-columns) {
  right: if($size > 0, percentage($size / $columns), auto);
Mark Otto's avatar
Mark Otto committed
242
243
244
}
{% endhighlight %}

Mark Otto's avatar
Mark Otto committed
245
### Example usage
Mark Otto's avatar
Mark Otto committed
246
247
248

You can modify the variables to your own custom values, or just use the mixins with their default values. Here's an example of using the default settings to create a two-column layout with a gap between.

249
See it in action in <a href="https://jsbin.com/ruxona/edit?html,output">this rendered example</a>.
Mark Otto's avatar
Mark Otto committed
250
251
252
253

{% highlight scss %}
.container {
  max-width: 60em;
254
  @include make-container();
Mark Otto's avatar
Mark Otto committed
255
256
}
.row {
257
  @include make-row();
Mark Otto's avatar
Mark Otto committed
258
259
}
.content-main {
260
  @include make-col-ready();
Mark Otto's avatar
Mark Otto committed
261
262

  @media (max-width: 32em) {
263
    @include make-col(6);
Mark Otto's avatar
Mark Otto committed
264
265
  }
  @media (min-width: 32.1em) {
266
    @include make-col(8);
Mark Otto's avatar
Mark Otto committed
267
268
269
  }
}
.content-secondary {
270
  @include make-col-ready();
Mark Otto's avatar
Mark Otto committed
271
272

  @media (max-width: 32em) {
273
    @include make-col(6);
Mark Otto's avatar
Mark Otto committed
274
275
  }
  @media (min-width: 32.1em) {
276
    @include make-col(4);
Mark Otto's avatar
Mark Otto committed
277
278
279
280
281
282
283
284
285
286
287
288
289
  }
}
{% endhighlight %}

{% highlight html %}
<div class="container">
  <div class="row">
    <div class="content-main">...</div>
    <div class="content-secondary">...</div>
  </div>
</div>
{% endhighlight %}

290
291
292
293
## Predefined classes

In addition to our semantic mixins, Bootstrap includes an extensive set of prebuilt classes for quickly creating grid columns. It includes options for device-based column sizing, reordering columns, and more.

Mark Otto's avatar
Mark Otto committed
294
295
### Example: Stacked-to-horizontal

296
Using a single set of `.col-md-*` grid classes, you can create a basic grid system that starts out stacked on mobile devices and tablet devices (the extra small to small range) before becoming horizontal on desktop (medium) devices. Place grid columns within any `.row`.
Mark Otto's avatar
Mark Otto committed
297

Mark Otto's avatar
Mark Otto committed
298
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
299
300
{% example html %}
<div class="row">
301
302
303
304
305
306
307
308
309
310
311
312
  <div class="col-md-1">col-md-1</div>
  <div class="col-md-1">col-md-1</div>
  <div class="col-md-1">col-md-1</div>
  <div class="col-md-1">col-md-1</div>
  <div class="col-md-1">col-md-1</div>
  <div class="col-md-1">col-md-1</div>
  <div class="col-md-1">col-md-1</div>
  <div class="col-md-1">col-md-1</div>
  <div class="col-md-1">col-md-1</div>
  <div class="col-md-1">col-md-1</div>
  <div class="col-md-1">col-md-1</div>
  <div class="col-md-1">col-md-1</div>
Mark Otto's avatar
Mark Otto committed
313
314
</div>
<div class="row">
315
316
  <div class="col-md-8">col-md-8</div>
  <div class="col-md-4">col-md-4</div>
Mark Otto's avatar
Mark Otto committed
317
318
</div>
<div class="row">
319
320
321
  <div class="col-md-4">col-md-4</div>
  <div class="col-md-4">col-md-4</div>
  <div class="col-md-4">col-md-4</div>
Mark Otto's avatar
Mark Otto committed
322
323
</div>
<div class="row">
324
325
  <div class="col-md-6">col-md-6</div>
  <div class="col-md-6">col-md-6</div>
Mark Otto's avatar
Mark Otto committed
326
327
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
328
</div>
Mark Otto's avatar
Mark Otto committed
329
330
331
332
333

### Example: Mobile and desktop

Don't want your columns to simply stack in smaller devices? Use the extra small and medium device grid classes by adding `.col-xs-*` and `.col-md-*` to your columns. See the example below for a better idea of how it all works.

Mark Otto's avatar
Mark Otto committed
334
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
335
336
337
{% example html %}
<!-- Stack the columns on mobile by making one full-width and the other half-width -->
<div class="row">
338
339
  <div class="col-12 col-md-8">.col-12 .col-md-8</div>
  <div class="col-6 col-md-4">.col-6 .col-md-4</div>
Mark Otto's avatar
Mark Otto committed
340
341
342
343
</div>

<!-- Columns start at 50% wide on mobile and bump up to 33.3% wide on desktop -->
<div class="row">
344
345
346
  <div class="col-6 col-md-4">.col-6 .col-md-4</div>
  <div class="col-6 col-md-4">.col-6 .col-md-4</div>
  <div class="col-6 col-md-4">.col-6 .col-md-4</div>
Mark Otto's avatar
Mark Otto committed
347
348
349
350
</div>

<!-- Columns are always 50% wide, on mobile and desktop -->
<div class="row">
351
352
  <div class="col-6">.col-6</div>
  <div class="col-6">.col-6</div>
Mark Otto's avatar
Mark Otto committed
353
354
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
355
</div>
Mark Otto's avatar
Mark Otto committed
356

Mark Otto's avatar
Mark Otto committed
357
### Example: Mobile, tablet, desktop
Mark Otto's avatar
Mark Otto committed
358
359
360

Build on the previous example by creating even more dynamic and powerful layouts with tablet `.col-sm-*` classes.

Mark Otto's avatar
Mark Otto committed
361
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
362
363
{% example html %}
<div class="row">
364
365
  <div class="col-12 col-sm-6 col-md-8">.col-12 .col-sm-6 .col-md-8</div>
  <div class="col-6 col-md-4">.col-6 .col-md-4</div>
Mark Otto's avatar
Mark Otto committed
366
367
</div>
<div class="row">
368
369
  <div class="col-6 col-sm-4">.col-6 .col-sm-4</div>
  <div class="col-6 col-sm-4">.col-6 .col-sm-4</div>
Mark Otto's avatar
Mark Otto committed
370
  <!-- Optional: clear the XS cols if their content doesn't match in height -->
371
  <div class="clearfix hidden-sm-up"></div>
372
  <div class="col-6 col-sm-4">.col-6 .col-sm-4</div>
Mark Otto's avatar
Mark Otto committed
373
374
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
375
</div>
Mark Otto's avatar
Mark Otto committed
376
377
378
379
380

### Example: 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.

Mark Otto's avatar
Mark Otto committed
381
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
382
383
{% example html %}
<div class="row">
384
385
386
  <div class="col-9">.col-9</div>
  <div class="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.</div>
  <div class="col-6">.col-6<br>Subsequent columns continue along the new line.</div>
Mark Otto's avatar
Mark Otto committed
387
388
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
389
</div>
Mark Otto's avatar
Mark Otto committed
390
391
392

### Example: Responsive column resets

393
With the four tiers of grids available you're bound to run into issues where, at certain breakpoints, your columns don't clear quite right as one is taller than the other. To fix that, use a combination of a `.clearfix` and our [responsive utility classes]({{ site.baseurl }}/layout/responsive-utilities/).
Mark Otto's avatar
Mark Otto committed
394

Mark Otto's avatar
Mark Otto committed
395
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
396
397
{% example html %}
<div class="row">
398
399
  <div class="col-6 col-sm-3">.col-6 .col-sm-3</div>
  <div class="col-6 col-sm-3">.col-6 .col-sm-3</div>
Mark Otto's avatar
Mark Otto committed
400
401

  <!-- Add the extra clearfix for only the required viewport -->
402
  <div class="clearfix hidden-sm-up"></div>
Mark Otto's avatar
Mark Otto committed
403

404
405
  <div class="col-6 col-sm-3">.col-6 .col-sm-3</div>
  <div class="col-6 col-sm-3">.col-6 .col-sm-3</div>
Mark Otto's avatar
Mark Otto committed
406
407
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
408
</div>
Mark Otto's avatar
Mark Otto committed
409

Heinrich Fenkart's avatar
Heinrich Fenkart committed
410
In addition to column clearing at responsive breakpoints, you may need to **reset offsets, pushes, or pulls**. See this in action in [the grid example]({{ site.baseurl }}/examples/grid/).
Mark Otto's avatar
Mark Otto committed
411

Mark Otto's avatar
Mark Otto committed
412
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
413
414
{% example html %}
<div class="row">
415
416
  <div class="col-sm-5 col-md-6">.col-sm-5 .col-md-6</div>
  <div class="col-sm-5 offset-sm-2 col-md-6 offset-md-0">.col-sm-5 .offset-sm-2 .col-md-6 .offset-md-0</div>
Mark Otto's avatar
Mark Otto committed
417
418
419
</div>

<div class="row">
420
421
  <div class="col-sm-6 col-md-5 col-lg-6">.col.col-sm-6.col-md-5.col-lg-6</div>
  <div class="col-sm-6 col-md-5 offset-md-2 col-lg-6 offset-lg-0">.col-sm-6 .col-md-5 .offset-md-2 .col-lg-6 .offset-lg-0</div>
Mark Otto's avatar
Mark Otto committed
422
423
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
424
</div>
Mark Otto's avatar
Mark Otto committed
425
426
427

### Example: Offsetting columns

428
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.
Mark Otto's avatar
Mark Otto committed
429

Mark Otto's avatar
Mark Otto committed
430
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
431
432
{% example html %}
<div class="row">
433
434
  <div class="col-md-4">.col-md-4</div>
  <div class="col-md-4 offset-md-4">.col-md-4 .offset-md-4</div>
Mark Otto's avatar
Mark Otto committed
435
436
</div>
<div class="row">
437
438
  <div class="col-md-3 offset-md-3">.col-md-3 .offset-md-3</div>
  <div class="col-md-3 offset-md-3">.col-md-3 .offset-md-3</div>
Mark Otto's avatar
Mark Otto committed
439
440
</div>
<div class="row">
441
  <div class="col-md-6 offset-md-3">.col-md-6 .offset-md-3</div>
Mark Otto's avatar
Mark Otto committed
442
443
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
444
</div>
Mark Otto's avatar
Mark Otto committed
445
446
447

### Example: Nesting columns

Mark Otto's avatar
Mark Otto committed
448
To nest your content with the default grid, add a new `.row` and set of `.col-sm-*` columns within an existing `.col-sm-*` column. Nested rows should include a set of columns that add up to 12 or fewer (it is not required that you use all 12 available columns).
Mark Otto's avatar
Mark Otto committed
449

Mark Otto's avatar
Mark Otto committed
450
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
451
452
{% example html %}
<div class="row">
453
454
  <div class="col-sm-9">
    Level 1: .col-sm-9
Mark Otto's avatar
Mark Otto committed
455
    <div class="row">
456
457
      <div class="col-8 col-sm-6">
        Level 2: .col-8 .col-sm-6
Mark Otto's avatar
Mark Otto committed
458
      </div>
459
460
      <div class="col-4 col-sm-6">
        Level 2: .col-4 .col-sm-6
Mark Otto's avatar
Mark Otto committed
461
462
463
464
465
      </div>
    </div>
  </div>
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
466
</div>
Mark Otto's avatar
Mark Otto committed
467
468
469

### Example: Column ordering

470
Easily change the order of our built-in grid columns with `.push-md-*` and `.pull-md-*` modifier classes.
Mark Otto's avatar
Mark Otto committed
471

Mark Otto's avatar
Mark Otto committed
472
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
473
474
{% example html %}
<div class="row">
475
476
  <div class="col-md-9 push-md-3">.col-md-9 .push-md-3</div>
  <div class="col-md-3 pull-md-9">.col-md-3 .pull-md-9</div>
Mark Otto's avatar
Mark Otto committed
477
478
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
479
</div>
480
481
482
483
484

## Customizing the grid

Using our built-in grid Sass variables and maps, it's possible to completely customize the predefined grid classes. Change the number of tiers, the media query dimensions, and the container widths—then recompile.

485
486
### Columns and gutters

Kovah's avatar
Kovah committed
487
The number of grid columns and their horizontal padding (aka, gutters) can be modified via Sass variables. `$grid-columns` is used to generate the widths (in percent) of each individual column while `$grid-gutter-widths` allows breakpoint-specific widths that are divided evenly across `padding-left` and `padding-right` for the column gutters.
488
489

{% highlight scss %}
Kovah's avatar
Kovah committed
490
491
492
493
494
495
496
497
498
$grid-columns:               12 !default;
$grid-gutter-width-base:     30px !default;
$grid-gutter-widths: (
  xs: $grid-gutter-width-base,
  sm: $grid-gutter-width-base,
  md: $grid-gutter-width-base,
  lg: $grid-gutter-width-base,
  xl: $grid-gutter-width-base
) !default;
499
500
501
502
503
{% endhighlight %}

### Grid tiers

Moving beyond the columns themselves, you may also customize the number of grid tiers. If you wanted just three grid tiers, you'd update the `$grid-breakpoints` and `$container-max-widths` to something like this:
504
505
506
507
508
509
510
511
512
513
514

{% highlight scss %}
$grid-breakpoints: (
  sm: 480px,
  md: 768px,
  lg: 1024px
);

$container-max-widths: (
  sm: 420px,
  md: 720px,
515
  lg: 960px
516
);
517
518
{% endhighlight %}

519
When making any changes to the Sass variables or maps, you'll need to save your changes and recompile. Doing so will out a brand new set of predefined grid classes for column widths, offsets, pushes, and pulls. Responsive visibility utilities will also be updated to use the custom breakpoints.