grid.md 14.8 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
4
group: layout
Mark Otto's avatar
Mark Otto committed
5
---
Mark Otto's avatar
Mark Otto committed
6

Mark Otto's avatar
Mark Otto committed
7
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
8

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

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

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

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

Mark Otto's avatar
Mark Otto committed
18
19
20
21
22
23
24
25
26
27
- 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
28

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

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

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

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

51
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
52

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

55
56
57
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).

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;544px</small>
Mark Otto's avatar
Mark Otto committed
68
        </th>
69
        <th class="text-xs-center">
70
          Small<br>
71
          <small>&ge;544px</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>
Mark Otto's avatar
Mark Otto committed
94
        <th class="text-nowrap" scope="row">Container width</th>
Mark Otto's avatar
Mark Otto committed
95
        <td>None (auto)</td>
96
97
98
99
        <td>576px</td>
        <td>720px</td>
        <td>940px</td>
        <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">1.875rem / 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
139
140
141

Variables 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.

{% highlight scss %}
Mark Otto's avatar
Mark Otto committed
142
143
144
145
$grid-breakpoints: (
  // Extra small screen / phone
  xs: 0,
  // Small screen / phone
146
  sm: 544px,
Mark Otto's avatar
Mark Otto committed
147
  // Medium screen / tablet
148
  md: 768px,
Mark Otto's avatar
Mark Otto committed
149
  // Large screen / desktop
150
  lg: 992px,
Mark Otto's avatar
Mark Otto committed
151
  // Extra large screen / wide desktop
152
  xl: 1200px
153
);
Mark Otto's avatar
Mark Otto committed
154

155

156
$grid-columns:      12;
157
$grid-gutter-width: 1.875rem;
Mark Otto's avatar
Mark Otto committed
158
159
{% endhighlight %}

Mark Otto's avatar
Mark Otto committed
160
### Mixins
Mark Otto's avatar
Mark Otto committed
161
162
163
164
165

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
166
@mixin make-row($gutter: $grid-gutter-width) {
167
168
169
170
171
172
  @if $enable-flex {
    display: flex;
    flex-wrap: wrap;
  } @else {
    @include clearfix();
  }
173
174
  margin-left:  ($gutter / -2);
  margin-right: ($gutter / -2);
Mark Otto's avatar
Mark Otto committed
175
176
177
}

// Make the element grid-ready (applying everything but the width)
178
@mixin make-col($gutter: $grid-gutter-width) {
Mark Otto's avatar
Mark Otto committed
179
  position: relative;
180
181
182
183
184
  @if $enable-flex {
    flex: 1;
  } @else {
    float: left;
  }
Mark Otto's avatar
Mark Otto committed
185
  min-height: 1px;
186
187
  padding-left:  ($gutter / 2);
  padding-right: ($gutter / 2);
Mark Otto's avatar
Mark Otto committed
188
189
}

190
191
192
193
194
195
196
197
198
199
200
@mixin make-col-span($size, $columns: $grid-columns) {
  // Set a width (to be used in or out of media queries)
  @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 {
    width: percentage($size / $columns);
  }
Mark Otto's avatar
Mark Otto committed
201
202
203
}

// Get fancy by offsetting, or changing the sort order
204
205
@mixin make-col-offset($columns) {
  margin-left: percentage(($columns / $grid-columns));
Mark Otto's avatar
Mark Otto committed
206
}
207
208
@mixin make-col-push($columns) {
  left: percentage(($columns / $grid-columns));
Mark Otto's avatar
Mark Otto committed
209
}
210
211
@mixin make-col-pull($columns) {
  right: percentage(($columns / $grid-columns));
Mark Otto's avatar
Mark Otto committed
212
213
214
}
{% endhighlight %}

Mark Otto's avatar
Mark Otto committed
215
### Example usage
Mark Otto's avatar
Mark Otto committed
216
217
218

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.

219
See it in action in <a href="http://jsbin.com/ruxona/edit">this rendered example</a>.
Mark Otto's avatar
Mark Otto committed
220
221
222
223

{% highlight scss %}
.container {
  max-width: 60em;
224
  @include make-container();
Mark Otto's avatar
Mark Otto committed
225
226
}
.row {
227
  @include make-row();
Mark Otto's avatar
Mark Otto committed
228
229
}
.content-main {
230
  @include make-col();
Mark Otto's avatar
Mark Otto committed
231
232

  @media (max-width: 32em) {
233
    @include make-col-span(6);
Mark Otto's avatar
Mark Otto committed
234
235
  }
  @media (min-width: 32.1em) {
236
    @include make-col-span(8);
Mark Otto's avatar
Mark Otto committed
237
238
239
  }
}
.content-secondary {
240
  @include make-col();
Mark Otto's avatar
Mark Otto committed
241
242

  @media (max-width: 32em) {
243
    @include make-col-span(6);
Mark Otto's avatar
Mark Otto committed
244
245
  }
  @media (min-width: 32.1em) {
246
    @include make-col-span(4);
Mark Otto's avatar
Mark Otto committed
247
248
249
250
251
252
253
254
255
256
257
258
259
  }
}
{% endhighlight %}

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

260
261
262
263
## 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
264
265
### Example: Stacked-to-horizontal

266
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 with the `.col` base class and a modifier within any `.row`.
Mark Otto's avatar
Mark Otto committed
267

Mark Otto's avatar
Mark Otto committed
268
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
269
270
{% example html %}
<div class="row">
271
272
273
274
275
276
277
278
279
280
281
282
  <div class="col-md-1">md-1</div>
  <div class="col-md-1">md-1</div>
  <div class="col-md-1">md-1</div>
  <div class="col-md-1">md-1</div>
  <div class="col-md-1">md-1</div>
  <div class="col-md-1">md-1</div>
  <div class="col-md-1">md-1</div>
  <div class="col-md-1">md-1</div>
  <div class="col-md-1">md-1</div>
  <div class="col-md-1">md-1</div>
  <div class="col-md-1">md-1</div>
  <div class="col-md-1">md-1</div>
Mark Otto's avatar
Mark Otto committed
283
284
</div>
<div class="row">
285
286
  <div class="col-md-8">md-8</div>
  <div class="col-md-4">md-4</div>
Mark Otto's avatar
Mark Otto committed
287
288
</div>
<div class="row">
289
290
291
  <div class="col-md-4">md-4</div>
  <div class="col-md-4">md-4</div>
  <div class="col-md-4">md-4</div>
Mark Otto's avatar
Mark Otto committed
292
293
</div>
<div class="row">
294
295
  <div class="col-md-6">md-6</div>
  <div class="col-md-6">md-6</div>
Mark Otto's avatar
Mark Otto committed
296
297
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
298
</div>
Mark Otto's avatar
Mark Otto committed
299
300
301
302
303

### 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
304
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
305
306
307
{% example html %}
<!-- Stack the columns on mobile by making one full-width and the other half-width -->
<div class="row">
308
309
  <div class="col-xs-12 col-md-8">.col-xs-12 .col-md-8</div>
  <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
Mark Otto's avatar
Mark Otto committed
310
311
312
313
</div>

<!-- Columns start at 50% wide on mobile and bump up to 33.3% wide on desktop -->
<div class="row">
314
315
316
  <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
  <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
  <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
Mark Otto's avatar
Mark Otto committed
317
318
319
320
</div>

<!-- Columns are always 50% wide, on mobile and desktop -->
<div class="row">
321
322
  <div class="col-xs-6">.col-xs-6</div>
  <div class="col-xs-6">.col-xs-6</div>
Mark Otto's avatar
Mark Otto committed
323
324
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
325
</div>
Mark Otto's avatar
Mark Otto committed
326

Mark Otto's avatar
Mark Otto committed
327
### Example: Mobile, tablet, desktop
Mark Otto's avatar
Mark Otto committed
328
329
330

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
331
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
332
333
{% example html %}
<div class="row">
334
335
  <div class="col-xs-12 col-sm-6 col-md-8">.col-xs-12 .col-sm-6 .col-md-8</div>
  <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
Mark Otto's avatar
Mark Otto committed
336
337
</div>
<div class="row">
338
339
  <div class="col-xs-6 col-sm-4">.col-xs-6 .col-sm-4</div>
  <div class="col-xs-6 col-sm-4">.col-xs-6 .col-sm-4</div>
Mark Otto's avatar
Mark Otto committed
340
  <!-- Optional: clear the XS cols if their content doesn't match in height -->
341
  <div class="clearfix hidden-sm-up"></div>
342
  <div class="col-xs-6 col-sm-4">.col-xs-6 .col-sm-4</div>
Mark Otto's avatar
Mark Otto committed
343
344
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
345
</div>
Mark Otto's avatar
Mark Otto committed
346
347
348
349
350

### 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
351
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
352
353
{% example html %}
<div class="row">
354
355
356
  <div class="col-xs-9">.col-xs-9</div>
  <div class="col-xs-4">.col-xs-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-xs-6">.col-xs-6<br>Subsequent columns continue along the new line.</div>
Mark Otto's avatar
Mark Otto committed
357
358
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
359
</div>
Mark Otto's avatar
Mark Otto committed
360
361
362

### Example: Responsive column resets

363
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
364

Mark Otto's avatar
Mark Otto committed
365
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
366
367
{% example html %}
<div class="row">
368
369
  <div class="col-xs-6 col-sm-3">.col-xs-6 .col-sm-3</div>
  <div class="col-xs-6 col-sm-3">.col-xs-6 .col-sm-3</div>
Mark Otto's avatar
Mark Otto committed
370
371

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

374
375
  <div class="col-xs-6 col-sm-3">.col-xs-6 .col-sm-3</div>
  <div class="col-xs-6 col-sm-3">.col-xs-6 .col-sm-3</div>
Mark Otto's avatar
Mark Otto committed
376
377
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
378
</div>
Mark Otto's avatar
Mark Otto committed
379

Heinrich Fenkart's avatar
Heinrich Fenkart committed
380
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
381

Mark Otto's avatar
Mark Otto committed
382
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
383
384
{% example html %}
<div class="row">
385
386
  <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
387
388
389
</div>

<div class="row">
390
391
  <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
392
393
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
394
</div>
Mark Otto's avatar
Mark Otto committed
395
396
397

### Example: Offsetting columns

398
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
399

Mark Otto's avatar
Mark Otto committed
400
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
401
402
{% example html %}
<div class="row">
403
404
  <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
405
406
</div>
<div class="row">
407
408
  <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
409
410
</div>
<div class="row">
411
  <div class="col-md-6 offset-md-3">.col-md-6 .offset-md-3</div>
Mark Otto's avatar
Mark Otto committed
412
413
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
414
</div>
Mark Otto's avatar
Mark Otto committed
415
416
417

### Example: Nesting columns

Mark Otto's avatar
Mark Otto committed
418
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
419

Mark Otto's avatar
Mark Otto committed
420
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
421
422
{% example html %}
<div class="row">
423
424
  <div class="col-sm-9">
    Level 1: .col-sm-9
Mark Otto's avatar
Mark Otto committed
425
    <div class="row">
426
427
      <div class="col-xs-8 col-sm-6">
        Level 2: .col-xs-8 .col-sm-6
Mark Otto's avatar
Mark Otto committed
428
      </div>
429
430
      <div class="col-xs-4 col-sm-6">
        Level 2: .col-xs-4 .col-sm-6
Mark Otto's avatar
Mark Otto committed
431
432
433
434
435
      </div>
    </div>
  </div>
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
436
</div>
Mark Otto's avatar
Mark Otto committed
437
438
439
440
441

### Example: Column ordering

Easily change the order of our built-in grid columns with `.col-md-push-*` and `.col-md-pull-*` modifier classes.

Mark Otto's avatar
Mark Otto committed
442
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
443
444
{% example html %}
<div class="row">
445
446
  <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
447
448
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
449
</div>