Bootstrap 栅格系统 #

栅格系统是 Bootstrap 的核心,它提供了一套响应式、移动优先的布局方案,帮助你轻松创建各种复杂的页面布局。

栅格系统概述 #

什么是栅格系统? #

栅格系统是一种通过行(row)和列(column)来创建页面布局的系统。Bootstrap 使用 12 列栅格系统,将页面水平分成 12 个等宽的列。

text
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                                                                                         12 列栅格系统                                                                                                         │
├──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┤
│  1   │  2   │  3   │  4   │  5   │  6   │  7   │  8   │  9   │  10  │  11  │  12  │
└──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┘

栅格系统的组成 #

栅格系统由三个主要部分组成:

text
┌─────────────────────────────────────────────────┐
│                 Container(容器)                 │
│  ┌───────────────────────────────────────────┐  │
│  │              Row(行)                      │  │
│  │  ┌─────────┬─────────┬─────────┐          │  │
│  │  │ Column  │ Column  │ Column  │          │  │
│  │  │  (列)   │  (列)   │  (列)   │          │  │
│  │  └─────────┴─────────┴─────────┘          │  │
│  └───────────────────────────────────────────┘  │
└─────────────────────────────────────────────────┘
组件 类名 作用
容器 .container 包裹内容,提供响应式宽度
.row 创建列的水平组
.col-* 定义每列的宽度

响应式断点 #

Bootstrap 定义了 6 个响应式断点:

断点 类前缀 最小宽度 最大容器宽度
Extra small - < 576px 自动
Small sm ≥ 576px 540px
Medium md ≥ 768px 720px
Large lg ≥ 992px 960px
Extra large xl ≥ 1200px 1140px
Extra extra large xxl ≥ 1400px 1320px

断点可视化 #

text
Extra Small (xs)          Small (sm)              Medium (md)             Large (lg)              Extra Large (xl)        Extra Extra Large (xxl)
< 576px                   ≥ 576px                 ≥ 768px                 ≥ 992px                 ≥ 1200px                ≥ 1400px
├─────────────────────────┼───────────────────────┼───────────────────────┼───────────────────────┼───────────────────────┼───────────────────────┤
       手机竖屏                   手机横屏                  平板                    桌面                    大桌面                  超大屏幕

容器类型 #

固定容器 #

html
<div class="container">
  <p>固定宽度容器,在不同断点有不同的最大宽度</p>
</div>
断点 容器宽度
< 576px 100%
≥ 576px 540px
≥ 768px 720px
≥ 992px 960px
≥ 1200px 1140px
≥ 1400px 1320px

流式容器 #

html
<div class="container-fluid">
  <p>始终占满视口宽度</p>
</div>

响应式容器 #

html
<!-- 在 sm 断点前 100% 宽度,之后固定 -->
<div class="container-sm">Small 容器</div>
<div class="container-md">Medium 容器</div>
<div class="container-lg">Large 容器</div>
<div class="container-xl">Extra Large 容器</div>
<div class="container-xxl">Extra Extra Large 容器</div>

基础用法 #

等宽列 #

html
<div class="container">
  <div class="row">
    <div class="col">1/2</div>
    <div class="col">1/2</div>
  </div>
  <div class="row">
    <div class="col">1/3</div>
    <div class="col">1/3</div>
    <div class="col">1/3</div>
  </div>
</div>

指定列宽 #

html
<div class="container">
  <div class="row">
    <div class="col-8">占 8 列</div>
    <div class="col-4">占 4 列</div>
  </div>
  <div class="row">
    <div class="col-4">占 4 列</div>
    <div class="col-4">占 4 列</div>
    <div class="col-4">占 4 列</div>
  </div>
</div>

混合布局 #

html
<div class="container">
  <div class="row">
    <div class="col-12">占满整行</div>
  </div>
  <div class="row">
    <div class="col-6">占 6 列</div>
    <div class="col-6">占 6 列</div>
  </div>
  <div class="row">
    <div class="col-3">占 3 列</div>
    <div class="col-6">占 6 列</div>
    <div class="col-3">占 3 列</div>
  </div>
</div>

响应式布局 #

单断点 #

html
<div class="container">
  <div class="row">
    <!-- 手机上占满 12 列,平板及以上占 6 列 -->
    <div class="col-12 col-md-6">内容 1</div>
    <div class="col-12 col-md-6">内容 2</div>
  </div>
</div>

多断点 #

html
<div class="container">
  <div class="row">
    <!--
      手机:占满 12 列
      平板:占 6 列
      桌面:占 4 列
      大桌面:占 3 列
    -->
    <div class="col-12 col-sm-6 col-lg-4 col-xl-3">内容</div>
    <div class="col-12 col-sm-6 col-lg-4 col-xl-3">内容</div>
    <div class="col-12 col-sm-6 col-lg-4 col-xl-3">内容</div>
    <div class="col-12 col-sm-6 col-lg-4 col-xl-3">内容</div>
  </div>
</div>

常见布局模式 #

两栏布局(侧边栏 + 主内容) #

html
<div class="container">
  <div class="row">
    <aside class="col-12 col-md-3">
      侧边栏(手机占满,桌面占 3 列)
    </aside>
    <main class="col-12 col-md-9">
      主内容(手机占满,桌面占 9 列)
    </main>
  </div>
</div>

三栏布局 #

html
<div class="container">
  <div class="row">
    <aside class="col-12 col-md-2">左侧栏</aside>
    <main class="col-12 col-md-8">主内容</main>
    <aside class="col-12 col-md-2">右侧栏</aside>
  </div>
</div>

圣杯布局 #

html
<div class="container">
  <header class="row">
    <div class="col-12">页头</div>
  </header>
  <div class="row">
    <nav class="col-12 col-md-3 order-md-1">导航</nav>
    <main class="col-12 col-md-6 order-md-2">主内容</main>
    <aside class="col-12 col-md-3 order-md-3">侧边栏</aside>
  </div>
  <footer class="row">
    <div class="col-12">页脚</div>
  </footer>
</div>

高级特性 #

自动布局列 #

使用 .col-auto 让列宽度根据内容自动调整:

html
<div class="row">
  <div class="col">自动填充剩余空间</div>
  <div class="col-auto">根据内容宽度</div>
</div>

列偏移 #

使用 .offset-* 类将列向右偏移:

html
<div class="row">
  <div class="col-4">占 4 列</div>
  <div class="col-4 offset-4">占 4 列,偏移 4 列</div>
</div>

<div class="row">
  <div class="col-3 offset-3">偏移 3 列</div>
  <div class="col-3 offset-3">偏移 3 列</div>
</div>

响应式偏移:

html
<div class="row">
  <div class="col-md-4 offset-md-4">
    在 md 断点及以上偏移 4 列
  </div>
</div>

列排序 #

使用 .order-* 类改变列的显示顺序:

html
<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

html
<div class="row">
  <div class="col">第一个</div>
  <div class="col order-first">显示在最前</div>
  <div class="col order-last">显示在最后</div>
</div>

响应式排序:

html
<div class="row">
  <div class="col-12 col-md-4 order-2 order-md-1">
    手机上排第二,桌面排第一
  </div>
  <div class="col-12 col-md-8 order-1 order-md-2">
    手机上排第一,桌面排第二
  </div>
</div>

列嵌套 #

在列中嵌套新的行和列:

html
<div class="row">
  <div class="col-8">
    外层列 8
    <div class="row">
      <div class="col-6">嵌套列 6</div>
      <div class="col-6">嵌套列 6</div>
    </div>
  </div>
  <div class="col-4">
    外层列 4
  </div>
</div>

间距工具 #

行间距(Gutters) #

Bootstrap 5 使用 g-* 类控制列间距:

html
<!-- 默认间距 -->
<div class="row">
  <div class="col-6">列 1</div>
  <div class="col-6">列 2</div>
</div>

<!-- 无间距 -->
<div class="row g-0">
  <div class="col-6">列 1</div>
  <div class="col-6">列 2</div>
</div>

<!-- 大间距 -->
<div class="row g-5">
  <div class="col-6">列 1</div>
  <div class="col-6">列 2</div>
</div>

水平和垂直间距 #

html
<!-- 水平间距 -->
<div class="row gx-5">
  <div class="col-6">列 1</div>
  <div class="col-6">列 2</div>
</div>

<!-- 垂直间距 -->
<div class="row gy-5">
  <div class="col-6">列 1</div>
  <div class="col-6">列 2</div>
</div>

响应式间距 #

html
<div class="row g-2 g-md-4 g-lg-5">
  <div class="col-6">列 1</div>
  <div class="col-6">列 2</div>
</div>

实战案例 #

图片画廊 #

html
<div class="container">
  <div class="row g-3">
    <div class="col-6 col-md-4 col-lg-3">
      <img src="image1.jpg" class="img-fluid" alt="">
    </div>
    <div class="col-6 col-md-4 col-lg-3">
      <img src="image2.jpg" class="img-fluid" alt="">
    </div>
    <div class="col-6 col-md-4 col-lg-3">
      <img src="image3.jpg" class="img-fluid" alt="">
    </div>
    <div class="col-6 col-md-4 col-lg-3">
      <img src="image4.jpg" class="img-fluid" alt="">
    </div>
  </div>
</div>

产品列表 #

html
<div class="container">
  <div class="row row-cols-1 row-cols-sm-2 row-cols-md-3 row-cols-lg-4 g-4">
    <div class="col">
      <div class="card h-100">
        <img src="product.jpg" class="card-img-top">
        <div class="card-body">
          <h5 class="card-title">产品名称</h5>
          <p class="card-text">¥99.00</p>
        </div>
      </div>
    </div>
  </div>
</div>

表单布局 #

html
<form>
  <div class="row g-3">
    <div class="col-md-6">
      <label class="form-label">姓</label>
      <input type="text" class="form-control">
    </div>
    <div class="col-md-6">
      <label class="form-label">名</label>
      <input type="text" class="form-control">
    </div>
    <div class="col-12">
      <label class="form-label">地址</label>
      <input type="text" class="form-control">
    </div>
    <div class="col-md-6">
      <label class="form-label">城市</label>
      <input type="text" class="form-control">
    </div>
    <div class="col-md-4">
      <label class="form-label">省份</label>
      <select class="form-select">
        <option>选择...</option>
      </select>
    </div>
    <div class="col-md-2">
      <label class="form-label">邮编</label>
      <input type="text" class="form-control">
    </div>
  </div>
</form>

仪表盘布局 #

html
<div class="container-fluid">
  <div class="row">
    <!-- 侧边栏 -->
    <nav class="col-md-3 col-lg-2 d-md-block bg-light sidebar collapse">
      <div class="position-sticky pt-3">
        <ul class="nav flex-column">
          <li class="nav-item"><a class="nav-link active" href="#">概览</a></li>
          <li class="nav-item"><a class="nav-link" href="#">报表</a></li>
          <li class="nav-item"><a class="nav-link" href="#">分析</a></li>
        </ul>
      </div>
    </nav>
    
    <!-- 主内容 -->
    <main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
      <div class="row">
        <div class="col-md-3 mb-4">
          <div class="card">
            <div class="card-body">
              <h6 class="card-title">总用户</h6>
              <h2>12,345</h2>
            </div>
          </div>
        </div>
        <div class="col-md-3 mb-4">
          <div class="card">
            <div class="card-body">
              <h6 class="card-title">总收入</h6>
              <h2>¥98,765</h2>
            </div>
          </div>
        </div>
      </div>
    </main>
  </div>
</div>

栅格系统原理 #

CSS 实现 #

Bootstrap 栅格系统基于 Flexbox 实现:

css
.row {
  display: flex;
  flex-wrap: wrap;
  margin-right: calc(-0.5 * var(--bs-gutter-x));
  margin-left: calc(-0.5 * var(--bs-gutter-x));
}

.col {
  flex: 1 0 0%;
}

.col-6 {
  flex: 0 0 auto;
  width: 50%;
}

Sass 变量 #

scss
$grid-columns: 12;
$grid-gutter-width: 1.5rem;
$grid-row-columns: 6;

$grid-breakpoints: (
  xs: 0,
  sm: 576px,
  md: 768px,
  lg: 992px,
  xl: 1200px,
  xxl: 1400px
);

$container-max-widths: (
  sm: 540px,
  md: 720px,
  lg: 960px,
  xl: 1140px,
  xxl: 1320px
);

最佳实践 #

1. 始终使用容器 #

html
<!-- 推荐 -->
<div class="container">
  <div class="row">...</div>
</div>

<!-- 不推荐 -->
<div class="row">...</div>

2. 行内只放列 #

html
<!-- 推荐 -->
<div class="row">
  <div class="col">内容</div>
</div>

<!-- 不推荐 -->
<div class="row">
  <div>直接内容</div>
</div>

3. 移动优先 #

html
<!-- 推荐:从移动端开始 -->
<div class="col-12 col-md-6 col-lg-4">内容</div>

<!-- 不推荐:从桌面端开始 -->
<div class="col-lg-4 col-md-6 col-12">内容</div>

4. 合理使用嵌套 #

html
<!-- 推荐:适度嵌套 -->
<div class="row">
  <div class="col-8">
    <div class="row">
      <div class="col-6">嵌套内容</div>
    </div>
  </div>
</div>

<!-- 避免:过度嵌套 -->
<div class="row">
  <div class="col">
    <div class="row">
      <div class="col">
        <div class="row">
          <div class="col">过度嵌套</div>
        </div>
      </div>
    </div>
  </div>
</div>

常见问题 #

1. 列没有正确对齐? #

确保使用了容器和行:

html
<div class="container">
  <div class="row">
    <div class="col">内容</div>
  </div>
</div>

2. 列间距太大或太小? #

使用 g-* 类调整间距:

html
<div class="row g-2">小间距</div>
<div class="row g-5">大间距</div>
<div class="row g-0">无间距</div>

3. 列高度不一致? #

使用 h-100 类或 Flexbox:

html
<div class="row">
  <div class="col">
    <div class="card h-100">等高卡片</div>
  </div>
</div>

下一步 #

现在你已经掌握了栅格系统,接下来学习 排版,了解 Bootstrap 的文本样式!

最后更新:2026-03-28