Bootstrap 4 网格系统详解

一、核心原理

Bootstrap 4 网格系统基于 12 列 Flexbox 布局,通过预定义的 CSS 类实现响应式页面结构。

三大核心元素

Container → Row → Column
  容器      行     列
  • Container:提供宽度约束和水平居中
  • Row:行的直接子元素,用于包裹列,负 margin 抵消 container 的 padding
  • Column:实际内容区域,通过列数控制宽度比例

二、响应式断点

Bootstrap 4 定义了 5 个断点,对应 5 种屏幕尺寸:

断点 类前缀 尺寸范围 典型设备
Extra small col- < 576px 手机竖屏
Small col-sm- >= 576px 手机横屏
Medium col-md- >= 768px 平板
Large col-lg- >= 992px 笔记本
Extra large col-xl- >= 1200px 桌面显示器

规则:设定的断点样式会向上继承。例如 col-md-6 在 md/lg/xl 下都生效,除非被更大断点的类覆盖。


三、Container 容器

两种类型

<!-- 固定宽度容器:每个断点有不同 max-width -->
<div class="container">
  <!-- xs: 100% | sm: 540px | md: 720px | lg: 960px | xl: 1140px -->
</div>

<!-- 流式容器:始终 100% 宽度 -->
<div class="container-fluid">
  <!-- 所有断点都是 100% -->
</div>

各断点固定容器宽度

断点 max-width 两侧 padding
< 576px 100% 15px
>= 576px 540px 15px
>= 768px 720px 15px
>= 992px 960px 15px
>= 1200px 1140px 15px

四、列(Column)用法

1. 等宽列

不指定列数,自动平分 12 列:

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

2. 指定列数

<div class="row">
  <div class="col-8">8/12</div>
  <div class="col-4">4/12</div>
</div>

常用比例速查

比例 类名组合
1:1 col-6 + col-6
1:2 col-4 + col-8
1:3 col-3 + col-9
1:1:1 col-4 + col-4 + col-4
2:3:5 col-2 + col-3 + col-5(不常用但可行)
侧边栏+主内容 col-md-3 + col-md-9

3. 响应式混合列

不同断点使用不同布局:

<div class="row">
  <!-- 手机全宽,平板各占一半,桌面 8:4 -->
  <div class="col-12 col-sm-6 col-lg-8">主内容</div>
  <div class="col-12 col-sm-6 col-lg-4">侧边栏</div>
</div>

效果

手机 (<576px):  ┌──────────────┐  ┌──────────────┐
                 │   主内容     │  │   侧边栏     │  各占一行
                 └──────────────┘  └──────────────┘

平板 (>=576px): ┌──────┬──────┐
                 │主内容│侧边栏│  各占 50%
                 └──────┴──────┘

桌面 (>=992px): ┌──────────┬────┐
                 │  主内容  │侧栏│  8:4
                 └──────────┴────┘

4. 设定一列宽度,其余自适应

<div class="row">
  <div class="col">自适应</div>
  <div class="col-5">固定 5 列</div>
  <div class="col">自适应</div>
</div>
<!-- 结果:自适应各占 (12-5)/2 = 3.5 列 -->

5. 换行

超过 12 列自动换行:

<div class="row">
  <div class="col-9">9 列</div>
  <div class="col-4">4 列 → 换到下一行</div>
  <div class="col-6">6 列</div>
</div>

手动换行(使用 .w-100):

<div class="row">
  <div class="col-6">第一行左</div>
  <div class="col-6">第一行右</div>
  <div class="w-100"></div>  <!-- 强制换行 -->
  <div class="col-6">第二行左</div>
  <div class="col-6">第二行右</div>
</div>

五、偏移(Offset)

向右推 N 列的距离:

<div class="row">
  <div class="col-md-4">左侧</div>
  <div class="col-md-4 offset-md-4">右侧(偏移4列)</div>
</div>

<!-- 居中效果 -->
<div class="row">
  <div class="col-md-6 offset-md-3">水平居中(6列宽,偏移3列)</div>
</div>

Offset 速查

列宽 居中 offset 效果
col-4 offset-4 4+4+4
col-6 offset-3 3+6+3
col-8 offset-2 2+8+2
col-3 offset-1 1+3+8

六、对齐

1. 垂直对齐(在 .row 上设置)

<!-- 顶部对齐 -->
<div class="row align-items-start">
  <div class="col">高内容<br>更多行</div>
  <div class="col">短内容</div>
</div>

<!-- 居中对齐 -->
<div class="row align-items-center">
  <div class="col">高内容<br>更多行</div>
  <div class="col">短内容</div>
</div>

<!-- 底部对齐 -->
<div class="row align-items-end">...</div>

单列垂直对齐(在 .col 上设置):

<div class="row align-items-start" style="height:200px">
  <div class="col align-self-center">我垂直居中</div>
  <div class="col">我在顶部</div>
</div>

2. 水平对齐(在 .row 上设置)

<div class="row justify-content-start">  <!-- 左对齐(默认) -->
<div class="row justify-content-center">  <!-- 居中 -->
<div class="row justify-content-end">     <!-- 右对齐 -->
<div class="row justify-content-around">  <!-- 等间距(两侧有间距) -->
<div class="row justify-content-between"> <!-- 两端对齐(两侧无间距) -->
start:    ■■ ■■ ■■
center:         ■■ ■■ ■■
end:                  ■■ ■■ ■■
around:   ■■    ■■    ■■       (两侧有半间距)
between:  ■■       ■■       ■■ (两侧无间距)

七、列排序(Order)

1. 使用 order 类

<div class="row">
  <div class="col order-3">第一(显示排第三)</div>
  <div class="col order-2">第二(显示排第二)</div>
  <div class="col order-1">第三(显示排第一)</div>
</div>

2. 首尾快捷类

<div class="row">
  <div class="col order-last">排最后</div>
  <div class="col">中间</div>
  <div class="col order-first">排最前</div>
</div>

3. 响应式排序

<div class="col order-md-2 order-lg-1">
  <!-- md 下排第2,lg 下排第1 -->
</div>

典型场景:移动端侧边栏在下方,桌面端侧边栏在左侧:

<div class="row">
  <div class="col-md-9 order-2 order-md-1">主内容</div>
  <div class="col-md-3 order-1 order-md-2">侧边栏</div>
</div>
<!-- 手机:侧边栏在上,主内容在下 -->
<!-- 桌面:主内容在左,侧边栏在右 -->

八、嵌套网格

在列中再放 row + col,嵌套的 row 重新拥有 12 列:

<div class="row">
  <div class="col-sm-9">
    外层 9 列
    <div class="row">
      <div class="col-8">内层 8/12</div>
      <div class="col-4">内层 4/12</div>
    </div>
  </div>
  <div class="col-sm-3">外层 3 列</div>
</div>

九、Gutter 控制(列间距)

Bootstrap 4 的列间距通过 row 的负 margin 和 col 的 padding 实现,默认 30px(每侧 15px)。

去除间距

<div class="row no-gutters">
  <div class="col-6">无间距</div>
  <div class="col-6">无间距</div>
</div>

自定义间距

/* 增大间距 */
.row.gutter-lg {
  margin-left: -20px;
  margin-right: -20px;
}
.row.gutter-lg > [class*="col-"] {
  padding-left: 20px;
  padding-right: 20px;
}

十、完整实战示例

典型博客布局

<div class="container">
  <!-- 头部 -->
  <div class="row mb-4">
    <div class="col-12">
      <h1>我的博客</h1>
    </div>
  </div>

  <!-- 主体 -->
  <div class="row">
    <!-- 文章列表 -->
    <div class="col-12 col-md-8 col-lg-9">
      <div class="row">
        <div class="col-12 col-sm-6 mb-3">
          <div class="card"><div class="card-body">文章1</div></div>
        </div>
        <div class="col-12 col-sm-6 mb-3">
          <div class="card"><div class="card-body">文章2</div></div>
        </div>
        <div class="col-12 col-sm-6 mb-3">
          <div class="card"><div class="card-body">文章3</div></div>
        </div>
        <div class="col-12 col-sm-6 mb-3">
          <div class="card"><div class="card-body">文章4</div></div>
        </div>
      </div>
    </div>

    <!-- 侧边栏 -->
    <div class="col-12 col-md-4 col-lg-3 order-first order-md-last">
      <div class="card mb-3"><div class="card-body">关于我</div></div>
      <div class="card"><div class="card-body">标签云</div></div>
    </div>
  </div>
</div>

布局效果

手机:                平板:                 桌面:
┌──────────────┐     ┌────────┬──────┐     ┌──────────┬────┐
│   关于我      │     │ 文章1  │文章2 │     │ 文章1 文章2│关于│
├──────────────┤     │ 文章3  │文章4 │     │ 文章3 文章4│标签│
│   标签云      │     │        │关于  │     │           │    │
├──────────────┤     │        │标签  │     │           │    │
│   文章1      │     └────────┴──────┘     └──────────┴────┘
├──────────────┤
│   文章2      │
└──────────────┘

十一、常见问题与技巧

问题 解决方案
列之间有空白间隙 正常行为,由 padding 产生;用 no-gutters 去除
列高度不一致 给 row 加 align-items-stretch(默认行为)或使用等高卡片
12 列不够用 使用嵌套网格,内层重新拥有 12 列
想要 5 等分 用等宽 .col + max-width: 20% 自定义,或用 flex 方案
列内容超出 给列加 text-truncateoverflow-hidden
想精确控制像素 网格系统是百分比布局,精确像素需自定义 CSS
col vs col-auto col 等分剩余空间,col-auto 按内容宽度自适应
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐