Bootstrap 栅格系统

栅格系统是 Bootstrap 的灵魂。它把页面横向虚拟成 12 等份,通过指定元素"占几份"来布局。掌握栅格,Bootstrap 就学会了一半。这一章带你彻底搞懂 12 列的原理和玩法。

1. 12 列是什么意思?

Bootstrap 把任何一行水平空间(从左到右)虚拟地切成 12 等份。一个元素如果"占 4 份",意思是它占据这一行的 4/12 = 33.33% 宽度。你可以放任意多个元素,只要它们的份数之和不超过 12,就会横向并排;超过 12 就自动换行。

为什么是 12 而不是 10?因为 12 能被 2、3、4、6 整除——既能做 2 列、3 列、4 列,也能做 6 列,灵活度最高。

2. 栅格三件套:container / row / col

任何栅格布局都由三层结构组成,缺一不可:

<!-- 栅格的"三件套":container > row > col -->
<div class="container">
  <div class="row">
    <div class="col">第一列</div>
    <div class="col">第二列</div>
    <div class="col">第三列</div>
  </div>
</div>

<!-- 渲染结果:三个等宽的列横向排列,自动占满容器宽度 -->

这三层就像"信封 > 文件夹 > 纸"——container 装着 row,row 装着 col。不要跳过 row 直接写 col,否则列之间不会有正确间距。

3. 自动等分:不写数字

最简单的用法是 col 不带数字——它会根据兄弟 col 的数量自动等分剩余空间:

<!-- 三个 .col 自动等分,每个占 4/12 = 33.33% -->
<div class="row">
  <div class="col">A (4)</div>
  <div class="col">B (4)</div>
  <div class="col">C (4)</div>
</div>

<!-- 四个 .col 也能等分,每个占 3/12 = 25% -->
<div class="row">
  <div class="col">A</div>
  <div class="col">B</div>
  <div class="col">C</div>
  <div class="col">D</div>
</div>

这种写法适合"我不知道几列,反正平分"的场景。注意:自动等分的列,内容多时会自动调整宽度——内容多的列会更宽。如果想强制等宽(无论内容多少),加 col-equal 或用 col-* 显式指定。

4. 指定列数:col-*

想精确控制每列宽度,用 col-N,N 是 1~12 的数字:

<!-- 主侧布局:8 + 4 = 12,刚好占满 -->
<div class="row">
  <div class="col-8">主内容(占 8 列)</div>
  <div class="col-4">侧边栏(占 4 列)</div>
</div>

<!-- 三种常见比例 -->
<div class="row">
  <div class="col-6">占一半</div>
  <div class="col-6">占一半</div>
</div>

<div class="row">
  <div class="col-3">1/4</div>
  <div class="col-3">1/4</div>
  <div class="col-3">1/4</div>
  <div class="col-3">1/4</div>
</div>

<!-- 不等分也可以,总和不必等于 12 -->
<div class="row">
  <div class="col-5">占 5</div>
  <div class="col-4">占 4</div>
  <div class="col-2">占 2,剩 1 列空白</div>
</div>

关键点:

5. 自动宽度:col-auto

有时你希望一列"按内容宽度"撑开,另一列占满剩余。用 col-auto:

<!-- 一列固定宽度,另一列自适应占满剩余 -->
<div class="row">
  <div class="col-auto">固定宽度(按内容计算)</div>
  <div class="col">自适应剩余空间</div>
</div>

<!-- 渲染:左侧按文字长度撑开,右侧自动填满 -->

常见场景:表单里"标签 + 输入框 + 按钮",标签和按钮用 col-auto,输入框用 col 占满剩余——这样无论屏幕多宽,布局都合理。

6. 嵌套栅格

在一个 col 里再放一个 row,就是嵌套栅格。内层 row 会重新分成 12 份,跟外层完全独立:

<!-- 嵌套栅格:在外层 col 里再放 row -->
<div class="row">
  <div class="col-8">
    外层主内容
    <!-- 嵌套时,内层 row 重新分成 12 列 -->
    <div class="row">
      <div class="col-6">内层左半</div>
      <div class="col-6">内层右半</div>
    </div>
  </div>
  <div class="col-4">外层侧边</div>
</div>

注意:嵌套时父 col 必须有 padding,否则内层 row 的负 margin 会让内容溢出。Bootstrap 默认 col 自带 padding,所以一般没问题,但如果你移除了 padding 又嵌套,就会出 bug。

7. 列偏移:offset

想让一列向右空出几格,用 offset-N:

<!-- coloffset-* 让列向右空出几格 -->
<div class="row">
  <div class="col-4">靠左</div>
  <div class="col-4 offset-4">右侧带 4 格偏移</div>
</div>

<!-- 居中一列:让 col-6 偏移 3 格,两边各空 3 -->
<div class="row">
  <div class="col-6 offset-3">水平居中</div>
</div>

用得最多的是"水平居中"——让 col-6 偏移 3 格,左右各空 3 格,视觉上居中。比写 margin: 0 auto 还简单。

8. 列排序:order

改变视觉顺序但不改 DOM(对 SEO 和读屏器友好),用 order-N:

<!-- colorder-* 改变视觉顺序,不改 DOM -->
<div class="row">
  <div class="col order-3">第一(显示最后)</div>
  <div class="col order-1">第二(显示第一)</div>
  <div class="col order-2">第三(显示中间)</div>
</div>

<!-- order-first / order-last 是快捷值 -->
<div class="row">
  <div class="col order-last">原本第一,挪到最后</div>
  <div class="col">原本第二</div>
</div>

1~5 是数字,另外有 order-firstorder-last 两个快捷值。响应式场景下用得最多——比如手机上图片在上、文字在下,桌面上文字在上、图片在下,就是用 order 配合断点后缀实现的。

小结

栅格系统的核心知识点:

下一篇我们看栅格的布局容器更深入的内容——container 的三种宽度变体,以及 row 的 gutter(列间距)控制。

← 上一篇 Bootstrap 环境引入

下一篇 布局容器

✈️💬