grid.md 14 KB
Newer Older
Mark Otto's avatar
Mark Otto committed
1
2
3
---
layout: page
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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">
    <div class="col-sm-4">
      One of three columns
    </div>
    <div class="col-sm-4">
      One of three columns
    </div>
    <div class="col-sm-4">
      One of three columns
    </div>
  </div>
</div>
{% endexample %}

The above example creates three equal-width columns on small, medium, large, and extra large devices using our [predefined grid 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
58
59
60
61
62

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

Mark Otto's avatar
Mark Otto committed
130
## Sass mixins
Mark Otto's avatar
Mark Otto committed
131

Mark Otto's avatar
Mark Otto committed
132
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 [prebuilt grid classes](#grid-example-basic) 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
133

Mark Otto's avatar
Mark Otto committed
134
### Variables
Mark Otto's avatar
Mark Otto committed
135
136
137
138

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
139
140
141
142
143
144
145
146
147
148
149
150
151
$grid-breakpoints: (
  // Extra small screen / phone
  xs: 0,
  // Small screen / phone
  sm: 34em,
  // Medium screen / tablet
  md: 48em,
  // Large screen / desktop
  lg: 62em,
  // Extra large screen / wide desktop
  xl: 75em
) !default;

152
153
$grid-columns:      12;
$grid-gutter-width: 1.5rem;
Mark Otto's avatar
Mark Otto committed
154
155
{% endhighlight %}

Mark Otto's avatar
Mark Otto committed
156
### Mixins
Mark Otto's avatar
Mark Otto committed
157
158
159
160
161

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
162
163
164
165
@mixin make-row($gutter: $grid-gutter-width) {
  margin-left:  ($gutter / -2);
  margin-right: ($gutter / -2);
  @include clearfix();
Mark Otto's avatar
Mark Otto committed
166
167
168
}

// Make the element grid-ready (applying everything but the width)
169
@mixin make-col($gutter: $grid-gutter-width) {
Mark Otto's avatar
Mark Otto committed
170
171
172
  position: relative;
  float: left;
  min-height: 1px;
173
174
  padding-left:  ($gutter / 2);
  padding-right: ($gutter / 2);
Mark Otto's avatar
Mark Otto committed
175
176
177
}

// Set a width (to be used in or out of media queries)
178
179
@mixin make-col-span($columns) {
  width: percentage(($columns / $grid-columns));
Mark Otto's avatar
Mark Otto committed
180
181
182
}

// Get fancy by offsetting, or changing the sort order
183
184
@mixin make-col-offset($columns) {
  margin-left: percentage(($columns / $grid-columns));
Mark Otto's avatar
Mark Otto committed
185
}
186
187
@mixin make-col-push($columns) {
  left: percentage(($columns / $grid-columns));
Mark Otto's avatar
Mark Otto committed
188
}
189
190
@mixin make-col-pull($columns) {
  right: percentage(($columns / $grid-columns));
Mark Otto's avatar
Mark Otto committed
191
192
193
}
{% endhighlight %}

Mark Otto's avatar
Mark Otto committed
194
### Example usage
Mark Otto's avatar
Mark Otto committed
195
196
197
198
199
200
201
202

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.

See it in action in <a href="http://jsbin.com/qiqet/3/edit">this rendered example</a>.

{% highlight scss %}
.container {
  max-width: 60em;
203
  @include make-container();
Mark Otto's avatar
Mark Otto committed
204
205
}
.row {
206
  @include make-row();
Mark Otto's avatar
Mark Otto committed
207
208
}
.content-main {
209
  @include make-col();
Mark Otto's avatar
Mark Otto committed
210
211

  @media (max-width: 32em) {
212
    @include make-col-span(6);
Mark Otto's avatar
Mark Otto committed
213
214
  }
  @media (min-width: 32.1em) {
215
    @include make-col-span(8);
Mark Otto's avatar
Mark Otto committed
216
217
218
  }
}
.content-secondary {
219
  @include make-col();
Mark Otto's avatar
Mark Otto committed
220
221

  @media (max-width: 32em) {
222
    @include make-col-span(6);
Mark Otto's avatar
Mark Otto committed
223
224
  }
  @media (min-width: 32.1em) {
225
    @include make-col-span(4);
Mark Otto's avatar
Mark Otto committed
226
227
228
229
230
231
232
233
234
235
236
237
238
  }
}
{% endhighlight %}

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

239
240
241
242
## 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
243
244
245
246
### Example: Stacked-to-horizontal

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 in any `.row`.

Mark Otto's avatar
Mark Otto committed
247
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
{% example html %}
<div class="row">
  <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>
</div>
<div class="row">
  <div class="col-md-8">.col-md-8</div>
  <div class="col-md-4">.col-md-4</div>
</div>
<div class="row">
  <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>
</div>
<div class="row">
  <div class="col-md-6">.col-md-6</div>
  <div class="col-md-6">.col-md-6</div>
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
277
</div>
Mark Otto's avatar
Mark Otto committed
278
279
280
281
282

### 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
283
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
{% example html %}
<!-- Stack the columns on mobile by making one full-width and the other half-width -->
<div class="row">
  <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>
</div>

<!-- Columns start at 50% wide on mobile and bump up to 33.3% wide on desktop -->
<div class="row">
  <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>
</div>

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

Mark Otto's avatar
Mark Otto committed
306
### Example: Mobile, tablet, desktop
Mark Otto's avatar
Mark Otto committed
307
308
309

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
310
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
311
312
313
314
315
316
317
318
319
320
321
322
323
{% example html %}
<div class="row">
  <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>
</div>
<div class="row">
  <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>
  <!-- Optional: clear the XS cols if their content doesn't match in height -->
  <div class="clearfix visible-xs-block"></div>
  <div class="col-xs-6 col-sm-4">.col-xs-6 .col-sm-4</div>
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
324
</div>
Mark Otto's avatar
Mark Otto committed
325
326
327
328
329

### 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
330
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
331
332
333
334
335
336
337
{% example html %}
<div class="row">
  <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>
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
338
</div>
Mark Otto's avatar
Mark Otto committed
339
340
341
342
343

### Example: Responsive column resets

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](#responsive-utilities).

Mark Otto's avatar
Mark Otto committed
344
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
345
346
347
348
349
350
351
352
353
354
355
356
{% example html %}
<div class="row">
  <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>

  <!-- Add the extra clearfix for only the required viewport -->
  <div class="clearfix visible-xs-block"></div>

  <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>
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
357
</div>
Mark Otto's avatar
Mark Otto committed
358
359
360

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](../examples/grid/).

Mark Otto's avatar
Mark Otto committed
361
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
362
363
364
365
366
367
368
369
370
371
372
{% example html %}
<div class="row">
  <div class="col-sm-5 col-md-6">.col-sm-5 .col-md-6</div>
  <div class="col-sm-5 col-sm-offset-2 col-md-6 col-md-offset-0">.col-sm-5 .col-sm-offset-2 .col-md-6 .col-md-offset-0</div>
</div>

<div class="row">
  <div class="col-sm-6 col-md-5 col-lg-6">.col-sm-6 .col-md-5 .col-lg-6</div>
  <div class="col-sm-6 col-md-5 col-md-offset-2 col-lg-6 col-lg-offset-0">.col-sm-6 .col-md-5 .col-md-offset-2 .col-lg-6 .col-lg-offset-0</div>
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
373
</div>
Mark Otto's avatar
Mark Otto committed
374
375
376
377
378

### Example: Offsetting columns

Move columns to the right using `.col-md-offset-*` classes. These classes increase the left margin of a column by `*` columns. For example, `.col-md-offset-4` moves `.col-md-4` over four columns.

Mark Otto's avatar
Mark Otto committed
379
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
380
381
382
383
384
385
386
387
388
389
390
391
392
{% example html %}
<div class="row">
  <div class="col-md-4">.col-md-4</div>
  <div class="col-md-4 col-md-offset-4">.col-md-4 .col-md-offset-4</div>
</div>
<div class="row">
  <div class="col-md-3 col-md-offset-3">.col-md-3 .col-md-offset-3</div>
  <div class="col-md-3 col-md-offset-3">.col-md-3 .col-md-offset-3</div>
</div>
<div class="row">
  <div class="col-md-6 col-md-offset-3">.col-md-6 .col-md-offset-3</div>
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
393
</div>
Mark Otto's avatar
Mark Otto committed
394
395
396

### Example: Nesting columns

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

Mark Otto's avatar
Mark Otto committed
399
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
{% example html %}
<div class="row">
  <div class="col-sm-9">
    Level 1: .col-sm-9
    <div class="row">
      <div class="col-xs-8 col-sm-6">
        Level 2: .col-xs-8 .col-sm-6
      </div>
      <div class="col-xs-4 col-sm-6">
        Level 2: .col-xs-4 .col-sm-6
      </div>
    </div>
  </div>
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
415
</div>
Mark Otto's avatar
Mark Otto committed
416
417
418
419
420

### 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
421
<div class="bd-example-row">
Mark Otto's avatar
Mark Otto committed
422
423
424
425
426
427
{% example html %}
<div class="row">
  <div class="col-md-9 col-md-push-3">.col-md-9 .col-md-push-3</div>
  <div class="col-md-3 col-md-pull-9">.col-md-3 .col-md-pull-9</div>
</div>
{% endexample %}
Mark Otto's avatar
Mark Otto committed
428
</div>