Bootstrap 用 container > row > col-- 的 12 列栅格体系组织页面。常规等宽分栏直接写 col,需要随屏幕宽度变化则写 col-md-* 这类响应式断点类。务必先套一层 container(或 container-fluid)再写 row,否则列会溢出视口。栅格的本质是把一行切成 12 等分,再让每列声明自己占几份,断点则决定“到某个屏幕宽度才生效”。理解了这个心智模型,后面三种做法都只是它的具体落地。

很多前端新手在第一次用 Bootstrap 时,最容易犯的错就是把 div 直接铺开、忘了套 container,结果页面出现横向滚动条、内容贴边、列与列之间没有合理的间距。本文不堆砌概念,而是从“结论先行”的角度,先把三种做法适合什么场景讲清楚,再逐一给出可复制的代码,最后用一张排错表帮你把线上常见的栅格故障一次性解决掉。无论你用的是 Bootstrap 3、4 还是 5,栅格这套核心规则几乎一致,可以放心套用。
一、先看结论:Bootstrap 栅格怎么选
在写任何一行布局代码之前,先回答一个问题:你这一行到底要不要“随屏幕变”。如果答案是否定的,用等宽列最省事;如果需要手机一列、平板两列、桌面四列,那就必须用响应式断点。下面这张表把所有常见做法收敛成唯一推荐顺序,建议收藏后照着选。
| 做法 | 适用场景 | 不推荐场景 | 推荐顺序 |
|---|---|---|---|
| 等宽列 col | 卡片列表、按钮组、几个等分模块,不需要区分屏幕 | 需要在手机/桌面显示不同列数的页面 | 1(最简单优先) |
| 响应式断点 col-md-* | 官网首页、后台布局、要适配手机平板的页面 | 纯固定宽度的内部系统大屏 | 2(绝大多数项目落点) |
| 偏移与排序 offset/order | 需要留白、调整列顺序、做非对称布局 | 简单等分、对顺序无要求的场景 | 3(进阶按需) |
一句话总结:先用 col 把东西排出来,发现“手机上太挤”,再升级到 col-md-*,最后才用偏移和排序去抠细节。这个顺序也对应了学习成本从低到高。
要注意,很多人会把“栅格”和“flex 布局”混为一谈。Bootstrap 的栅格底层确实依赖 flex,但它在 flex 之上封装了 12 列语义和断点系统。你不需要手写 flex 属性,只要会写 col-md-4 这种类即可。这也是为什么我们强调主关键词 bootstrap 栅格布局 其实是“带语义的 flex 封装”,理解这一点能少走很多弯路。英文社区习惯把这套 12 列体系称为 Bootstrap grid,二者指的是同一套栅格机制。
二、环境与最小示例
下面给你一个能在浏览器直接打开的最小可运行骨架。它引入了 Bootstrap 的 CSS,然后在 container 里放一个 row,row 里放三个等宽的 col。注意看注释里 container、row、col 三者各自的职责。
<!DOCTYPE html> <!-- 声明 HTML5 文档类型 -->
<html lang="zh-CN"> <!-- 语言设为简体中文 -->
<head>
<meta charset="UTF-8"> <!-- 字符编码,避免中文乱码 -->
<!-- 引入 Bootstrap 官方 CSS,栅格类都定义在这里 -->
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<title>最小栅格示例</title>
</head>
<body>
<!-- container:固定宽度并居中,是栅格的最外层容器 -->
<div class="container">
<!-- row:代表一行,内部只能直接放 col,并负责清除负边距 -->
<div class="row">
<!-- col:自动等分的一列,这里三个 col 会各占 1/3 -->
<div class="col">第一列</div>
<div class="col">第二列</div>
<div class="col">第三列</div>
</div>
</div>
</body>
</html>
(以下为说明性代码,未在本机执行;预期结果:浏览器中显示一行三等分的三个区块,每个区块宽度相同、左右留有 container 提供的页面边距。)
最关键的三层结构是:container 负责“页面边界与居中”,row 负责“把列排成一行并抵消列间距造成的溢出”,col 负责“声明自己占几份”。只要记住“container 包 row、row 包 col”这个套娃顺序,90% 的栅格问题都不会出现。顺序一旦写反,比如 col 直接裸放在 body 下,就会丢失 container 的约束而溢出。
三、做法一:等宽列 col
等宽列是最省心的方案:你写几个 col 列,Bootstrap 就把一行 12 等分后平均分配给它们。比如写 4 个 col,每个就占 3 份(12÷4=3);写 6 个 col,每个占 2 份。它完全不需要你关心数字,适合内容数量固定、且各块地位平等的布局,例如标签云、功能入口、统计卡片。
<div class="container"> <!-- 外层容器,提供居中和安全边距 -->
<div class="row"> <!-- 一行开始 -->
<div class="col">A</div> <!-- 第1列,自动占 1/4 宽 -->
<div class="col">B</div> <!-- 第2列,自动占 1/4 宽 -->
<div class="col">C</div> <!-- 第3列,自动占 1/4 宽 -->
<div class="col">D</div> <!-- 第4列,自动占 1/4 宽 -->
</div> <!-- 一行结束 -->
</div>
(以下为说明性代码,未在本机执行;预期结果:四个等宽列横向排列,窗口变窄时仍保持等分,直到极小屏也不会单独断行,因为等宽的 col 没有断点限制。)
等宽列还有两个实用变体。其一是 col-auto,它让列的宽度由内容决定而不是均分,适合放“按钮+文字”这种长度不一的元素;其二是用 row-cols-* 在 row 上直接声明“每行几列”,例如 row-cols-3 表示这一行里的子元素每 3 个换一行,等价于给每个子元素写 col。当你在做图片墙、商品网格时,row-cols-2 / row-cols-3 / row-cols-4 会非常顺手。
需要提醒的是,等宽列在“列数 × 单份宽度”超过 12 时并不会报错,而是自动换行到下一行。也就是说,如果你写了 5 个 col,前 4 个各占 1/4(合计 12 份正好一行),第 5 个会被挤到第二行独占一整行。这种“意外换行”常被误认为是 bug,其实正是栅格的正常行为。理解响应式网格 的 12 列本质,就能预判这类结果。
四、做法二:响应式断点 col-md-*
等宽列的问题在于:它在手机上也会强行 4 等分,导致每个块窄到看不清。响应式断点就是为此而生。Bootstrap 预定义了五个断点:xs(<576px,默认无前缀)、sm(≥576px)、md(≥768px)、lg(≥992px)、xl(≥1200px),以及 xxl(≥1400px,Bootstrap 5 新增)。你写的 col-md-4 意思是“在 md 及以上宽度时占 4 份,低于 md 时自动变为整行堆叠”。
<div class="container"> <!-- 外层容器 -->
<div class="row"> <!-- 一行 -->
<!-- 手机整行;平板 md 起每列占 6 份(一行两个) -->
<div class="col-12 col-md-6">块1</div>
<div class="col-12 col-md-6">块2</div>
<!-- 手机整行;桌面 lg 起每列占 4 份(一行三个) -->
<div class="col-12 col-md-6 col-lg-4">块3</div>
</div>
</div>
(以下为说明性代码,未在本机执行;预期结果:在手机屏(<768px)三个块各占满一行纵向堆叠;在平板(≥768px)块1、块2 并排各占一半、块3 单独一行;在桌面(≥992px)块1、块2 各半行、块3 占三分之一宽。)
断点类的组合遵循“小断点写小值、大断点写大值”的原则。常见错误是只写 col-md-4 却忘了写 col-12,导致在手机上四列挤成一团。正确姿势通常是以最小屏为基准先写一个 col-12(或 col-*),再用更大的断点去“升级”列宽。
关于断点选取,经验值是:内容卡片类用 col-sm- 或 col-md- 起步,因为手机用户更习惯纵向滚动;后台管理类两栏布局常用 col-lg-3 + col-lg-9,把侧边栏固定窄、主区占宽;大屏数据看板才需要用到 xl/xxl。无论怎么组合,所有断点类的总和不要超过 12,否则会触发换行。这套 12 列布局 的运算规则,配合断点表能让布局行为完全可预测。
如果你想系统补齐这些类名的语义,建议先看 Bootstrap 教程 里的栅格章节打底,对照 4 与 5 的差异,避免被旧文章的写法带偏。
五、做法三:偏移与排序及排错
当基础分栏满足不了“要留白、要换顺序”的需求时,就要上偏移(offset)和排序(order)。offset 通过给列左侧加“空白份数”来实现居中或右对齐,例如 col-md-4 offset-md-4 表示“占 4 份、左边空 4 份”,结果就是该列在中间。order 则控制列在视觉上的先后顺序,常用于“移动端把次要内容排到后面”。
<div class="container"> <!-- 外层容器 -->
<div class="row"> <!-- 一行 -->
<!-- 占4份,左侧空4份,实现水平居中 -->
<div class="col-md-4 offset-md-4">居中块</div>
</div>
<div class="row"> <!-- 另一行 -->
<!-- order 控制顺序:小屏时先显示“次”,大屏时排后面 -->
<div class="col order-2 order-md-1">主要内容</div>
<div class="col order-1 order-md-2">次要内容</div>
</div>
</div>
(以下为说明性代码,未在本机执行;预期结果:第一段在平板及以上居中显示;第二段在手机上“次要内容”在前、“主要内容”在后,在平板及以上顺序反转。)
排错是栅格最容易被忽略、却最影响交付的环节。下面这张表汇总了线上最常见的四种故障,照着“现象→原因→修复”逐条排查即可。
| 现象 | 常见原因 | 修复方向 |
|---|---|---|
| 列不换行、挤在一行超出屏幕 | 单行列数 × 份数 >12,或写了 col 又强行塞太多内容 | 控制每行合计 ≤12,或改用自动换行的 row-cols-* |
| 没套 container 导致横向溢出、出现滚动条 | row/col 直接裸放在 body 或父级无约束 | 在最外层补一个 container 或 container-fluid |
| 偏移不生效 | offset 与 col 断点前缀不一致(如 col-md-4 配 offset-4) | 偏移类也要带相同断点,写 offset-md-4 |
| Bootstrap 未引入或版本错 | 只写了 class 没引 CSS,或引了 Bootstrap 3 却用 4/5 的类 | 确认 link 引入正确版本的 bootstrap.min.css |
最后补充三个高频坑:第一,Bootstrap 5 取消了 jQuery 依赖,但栅格纯 CSS 不受影响,别因为“怕 5 不兼容”而拒绝升级;第二,col 内部再嵌 row 是允许的,这叫“嵌套栅格”,适合做复杂的卡片内布局;第三,用 container-fluid 可让内容占满整宽,适合大屏后台,但别忘了它内部依然要先写 row 再写 col。

总结
回顾全文,bootstrap 栅格布局 的核心只有三句话:container 包 row、row 包 col 是铁律;等宽用 col、适配用 col-md-;偏移排序是进阶调味而非主菜。从选择表到最小示例,再到三种做法与排错表,你已经拥有了一套从“选型”到“排障”的完整方法论。实际项目里,约八成页面用 col 加 col-md- 就能解决,剩下两成才需要 offset/order 去抠细节。把本文的排错表放进你的自查清单,下次栅格出问题先对照表,而不是盲目改数字。建议把示例在浏览器本地运行一遍,验证栅格是否按断点生效,若某列不换行或溢出,检查 container 配置并修复即可。想对照 Bootstrap 4 与 5 的差异,可以再看 Bootstrap4 教程。
延伸学习
- Bootstrap 入门课程 :编程狮上的交互式Bootstrap课程,边练边学。
- CSS 垂直居中 :栅格里常见的列内对齐问题,这篇笔记给了解法。
- CSS3 教程 :想理解栅格底层的 flex 与媒体查询,先看这份 CSS3 基础。
常见问题
Q:col 和 col-md-4 能混着写吗?
可以。常见写法是一个元素同时带 col-12 col-md-4,表示手机整行、平板起占 4 份。底层是“移动优先”,小断点样式会被大断点覆盖,所以先写小屏基准再写大屏升级最稳妥。
Q:一行写了多少份会换行?
当同一 row 内各列份数累计超过 12 时,多出的列会自动折到下一行。这不算错误,而是 12 列布局 的正常流式行为。若想强制不换行可用 row-cols-* 或 flex-nowrap,但多数场景顺其自然即可。
Q:Bootstrap 5 的栅格和 3、4 差别大吗?
栅格语法几乎一致,都是 container/row/col 加断点类。差异主要在:5 移除了 jQuery、新增 xxl 断点与 g- 间距工具类、offset 改为独立工具类。老的 col-xs- 在 4/5 里应写成无前缀 col-*。掌握响应式网格 的核心后,跨版本迁移成本很低。

TRAE-AI编程



