row-cols-2 是 bootstrap 5+ 的行级列数控制类,使整行子元素自动等宽分为2列;col-6 是列级宽度类,需每个子元素单独设置且总和为12才稳定等宽。

row-cols-2 是什么,和 col-6 有什么区别
row-cols-2 是 Bootstrap 5+ 提供的「行级列数控制类」,直接加在 row 上,表示该行内所有子元素(无论是否带 col 类)自动按 2 列等宽排列。它不关心子元素有没有写 col,也不依赖子元素数量总和为 12。
而 col-6 是「列级宽度类」,必须每个子元素单独加,且需满足“同一行下所有 col-* 数字之和为 12”才稳定等宽;若只写 col-6 但只有两个子项,它只是“占一半宽度”,不是“强制两列布局”——这点常被混淆。
关键差异:
-
row-cols-2管的是“这一行最多显示几列”,内容超了会自动换行(类似 CSSgrid-template-columns: repeat(2, 1fr)) -
col-6管的是“这个元素占多少格”,不处理换行逻辑,得靠父row的 flex 换行行为或手动加flex-wrap -
row-cols-2对子元素无 class 要求:哪怕子元素是<div>、<code><p></p>或没写任何col类,也能生效为什么加了 row-cols-2 还是一列堆叠
常见错误现象:
<div class="row row-cols-2"> <div>A</div> <div>B</div> </div>在小屏下仍垂直堆叠,不是左右并排。根本原因:
row-cols-2默认只在 ≥576px(sm断点)生效,它的完整类名其实是row-cols-sm-2。Bootstrap 源码中,未带断点前缀的row-cols-*实际不存在 —— 所有文档里写的row-cols-2都是简写,真实生效的是带sm前缀的版本。解决办法:
- 要全尺寸(包括 xs)两列等宽,必须显式写
row-cols-2(Bootstrap 5.3+ 支持),或降级兼容写法:row-cols-2 row-cols-sm-2 row-cols-md-2 - 检查是否漏了
container或container-fluid包裹 —— 虽然row-cols不强依赖容器,但没容器时视口过窄会导致列宽不足,触发 flex 换行 - 确认子元素没设
width: 100%、display: block强制撑满,或min-width过大导致无法并排
row-cols-2 和 gap、flex-wrap 的关系
row-cols-2本身不控制间距,它只设置列数;视觉上“不等宽”或“错位”,大概率是gap或flex-wrap干扰。默认情况下,Bootstrap 5+ 的
row自带gap: 1rem(即g-3),这个间隙会占用空间,导致两列内容区实际宽度 ≠ 50%。实操建议:
- 要去掉间隙干扰,给
row加g-0:<div class="row row-cols-2 g-0"> <li>如果内容项高度不一致,<code>row-cols-2下的子项默认align-items: stretch,但若父row高度受限,可能引发截断 —— 此时可加h-100到子项,或对内容容器加min-height: 0防 flex 项目不收缩 -
row-cols-2自动启用flex-wrap: wrap,所以当子项超过 2 个时,第 3 个会换到下一行 —— 这是预期行为,不是 bug - 动态渲染列表(如 Vue/React 映射数组),你不知道最终有几个子项,但希望“每行最多 2 个”,且保持等宽
- 子元素结构不统一(有的带
col,有的没写),又想快速统一列数 - 需要响应式列数切换,比如
row-cols-1 row-cols-md-2 row-cols-xl-3,比逐个改每个col类更简洁 - 需要精确控制某一项跨列(如广告 banner 占满整行),此时必须混用
col-12和col-6 - 要配合 offset、order 等高级栅格功能,
row-cols-*不支持这些修饰 - 项目已用 Bootstrap 4(不支持
row-cols-*),只能退回到col-6+row手动管理
什么时候该用 row-cols-2,而不是 col-6
选
row-cols-2的典型场景:选
col-6的典型场景:最易被忽略的一点:
row-cols-2的换行是基于“项数”,不是“内容宽度”;而col-6的换行是基于“剩余空间”。前者更适合卡片流布局,后者更适合表单字段对齐。 - 要全尺寸(包括 xs)两列等宽,必须显式写











