Flexbox 与 Grid 布局
布局是前端的核心日常。Tailwind 把 CSS 的两大布局系统——Flexbox(一维布局)和 Grid(二维布局)——封装成简洁的工具类,让你不写一行 CSS 规则就能完成复杂布局。本篇详解最常用的套路。
1. flex 容器的基础
给父元素加 flex,它就变成 flex 容器,子元素自动横向排列:
<!-- 启用 flex 容器 -->
<div class="flex">
<div>A</div>
<div>B</div>
<div>C</div>
</div>
<!-- 三个子元素默认横向排列,高度自动撑满容器 -->
<!-- 改成纵向排列 -->
<div class="flex flex-col">
<div>A</div>
<div>B</div>
</div>
<!-- flex-row 是默认值;flex-row-reverse / flex-col-reverse 反向 -->2. 主轴 / 交叉轴对齐
flex 布局的核心是两根轴:主轴(默认横向)用 justify-* 控制,交叉轴(默认纵向)用 items-* 控制。把这两个系列组合起来,可以表达几乎所有对齐方式:
<!-- 主轴对齐(横向布局时主轴是 X 轴):justify-* -->
<div class="flex justify-start"> <!-- 靠左(默认) -->
<div class="flex justify-center"> <!-- 居中 -->
<div class="flex justify-end"> <!-- 靠右 -->
<div class="flex justify-between"> <!-- 两端对齐,中间均分 -->
<div class="flex justify-around"> <!-- 每个元素左右间距相同 -->
<div class="flex justify-evenly"> <!-- 所有间隔完全相同 -->
<!-- 交叉轴对齐(横向布局时交叉轴是 Y 轴):items-* -->
<div class="flex items-start"> <!-- 顶对齐 -->
<div class="flex items-center"> <!-- 垂直居中 -->
<div class="flex items-end"> <!-- 底对齐 -->
<div class="flex items-stretch"> <!-- 拉伸到同高(默认) -->
<div class="flex items-baseline"> <!-- 文字基线对齐 -->记忆要点:
justify-*:沿主轴方向怎么排items-*:沿交叉轴怎么对齐- 改成
flex-col后,主轴变成纵向,这套对齐逻辑依然适用,只是"方向"换了。
3. 居中万能组合
整篇教程里最高频的写法:
<!-- 居中万能组合:水平+垂直居中 -->
<div class="flex items-center justify-center h-screen">
<div>我完美居中</div>
</div>
<!-- 这是 Tailwind 里最常见的居中写法,
99% 的场景都用这套 -->flex items-center justify-center 是水平 + 垂直居中的标准答案。看到设计稿里"那个图标在那个圆里居中","那段文字在那张图上居中",基本都是这套。
4. flex-1 / flex-none:控制占比
子元素的增长 / 收缩行为,通过这几个类控制:
<!-- flex-1:占据剩余空间 -->
<div class="flex">
<div class="w-20">固定宽</div>
<div class="flex-1">占据剩余空间</div>
</div>
<!-- flex-none:不收缩不增长 -->
<div class="flex">
<div class="flex-none w-24">永远 96px</div>
<div class="flex-1">自适应</div>
</div>
<!-- flex-grow-0 / flex-grow-1:控制是否增长 -->
<!-- flex-shrink-0:禁止收缩(图片防变形常用) -->
<img class="flex-shrink-0 w-16 h-16" src="avatar.png" />典型应用:顶部导航栏的"logo + 中间菜单 + 右侧按钮",中间菜单用 flex-1 占据剩余空间。
5. 换行:flex-wrap
默认 flex 不换行,子元素会被挤压。需要换行时:
<!-- 默认不换行,子元素会被挤压 -->
<div class="flex">
<div class="w-32">A</div>
<div class="w-32">B</div>
<div class="w-32">C</div>
<div class="w-32">D</div>
</div>
<!-- flex-wrap:超出自动换行 -->
<div class="flex flex-wrap gap-4">
<div class="w-32">A</div>
<div class="w-32">B</div>
<div class="w-32">C</div>
<div class="w-32">D</div>
</div>6. gap:子元素间距
现代 CSS 的 gap 属性是 flex/grid 子元素间距的最佳方案——比给每个子元素加 margin 干净得多。Tailwind 提供 gap-* 系列,数值遵循同一套 4px 比例尺:
<!-- gap-* 控制子元素间距,远比 margin 优雅 -->
<div class="flex gap-4">
<div>A</div>
<div>B</div>
<div>C</div>
</div>
<!-- 行列不同间距 -->
<div class="grid gap-x-8 gap-y-4 grid-cols-3">
<div>A</div><div>B</div><div>C</div>
<div>D</div><div>E</div><div>F</div>
</div>7. Grid:二维布局
Grid 适合"行 + 列"都复杂的二维布局。最常用的是 grid-cols-* 直接定义列数:
<!-- 固定列数 -->
<div class="grid grid-cols-3 gap-4">
<div>1</div><div>2</div><div>3</div>
<div>4</div><div>5</div><div>6</div>
</div>
<!-- 2 列 -->
<div class="grid grid-cols-2 gap-4">...</div>
<!-- 等宽 12 列(配合 col-span-* 做复杂网格) -->
<div class="grid grid-cols-12 gap-4">
<div class="col-span-8">主内容(占 8 列)</div>
<div class="col-span-4">侧栏(占 4 列)</div>
</div>
<!-- 跨行:row-span-* -->
<div class="grid grid-cols-3 grid-rows-3 gap-4">
<div class="row-span-2">高的</div>
<div>普通</div>
<div>普通</div>
</div>配合 col-span-* / row-span-*,可以拼出复杂的网格——比如"侧栏 + 主内容"的博客布局、仪表板、相册。
8. 响应式 Grid(常用模式)
Grid 最常见的实战模式——"手机单列、平板双列、桌面三列"——配合响应式前缀一行搞定:
<!-- 配合响应式前缀(后面专门一篇讲):
手机 1 列、平板 2 列、桌面 3 列 -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
<div>卡片 1</div>
<div>卡片 2</div>
<div>卡片 3</div>
<div>卡片 4</div>
<div>卡片 5</div>
<div>卡片 6</div>
</div>响应式前缀的具体规则后面专门讲。这里只需记住:grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 这种组合是卡片墙、相册、商品列表的标准答案。
9. flex 还是 grid?怎么选
- 一维布局(一行或一列)用 flex:导航栏、按钮组、表单项横向排列。
- 二维布局(同时是行列网格)用 grid:卡片墙、相册、复杂 dashboard。
- 不确定时:大部分场景 flex 更灵活,grid 更结构化。复杂网格优先 grid。
小结
记住这几套万能组合,90% 的布局都能解决:
- 居中:
flex items-center justify-center - 导航栏:
flex items-center justify-between - 左右两栏:
flex+flex-1 - 卡片墙:
grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 - 博客布局:
grid grid-cols-12+col-span-8+col-span-4
下一篇我们学颜色与背景,让布局"上色"。
← 上一篇 间距与尺寸
下一篇 颜色与背景 →