源本科技 | 码上会

Tailwind CSS 弹性盒子 & 网格

2026/03/12
47
0

学习目标

  • 精通 Flexbox 布局模型,能够灵活运用方向、换行、对齐及间距属性构建一维响应式界面。

  • 掌握 Grid 网格系统的核心类名,学会定义行列结构及处理单元格跨越(Span)以构建复杂二维布局。

  • 理解 flex-growflex-shrink 的工作原理,实现自适应宽度的动态布局。

  • 熟练区分主轴(Main Axis)与交叉轴(Cross Axis)的对齐控制,解决常见的居中与分布难题。

  • 通过组合使用 Gap、Direction 和 Alignment 属性,高效还原现代 Web 设计稿。


弹性布局

Flexbox 是一种一维布局模型,专为在容器内分配空间和 align 项目而设计。它在处理导航栏、卡片列表和垂直居中等场景时表现卓越。

主轴方向

Flex Direction

决定子元素是水平排列还是垂直排列。

  • flex-row: 默认值,从左到右水平排列。

  • flex-row-reverse: 从右到左水平排列。

  • flex-col: 从上到下垂直排列。

  • flex-col-reverse: 从下到上垂直排列。

换行控制

Flex Wrap

当子元素总宽度超过容器时,是否换行。

  • flex-nowrap: 默认值,不换行(可能导致溢出或压缩子元素)。

  • flex-wrap: 允许换行,新行从上到下添加。

  • flex-wrap-reverse: 允许换行,新行从下到上添加(较少用)。

弹性伸缩

Flex Grow / Shrink

控制子元素在剩余空间中的增长或在空间不足时的收缩行为。

  • grow: 等同于 flex-grow: 1,允许元素增长以填充剩余空间。

  • grow-0: 禁止元素增长。

  • shrink: 等同于 flex-shrink: 1,允许元素在空间不足时收缩。

  • shrink-0: 禁止元素收缩(常用于固定宽度的头像或图标)。

代码示例

自适应侧边栏布局

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <title>Tailwind Auto Cols 对比演示</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>

<body>
    <div class="flex flex-row h-64 border border-gray-300">
        <!-- 固定宽度的侧边栏,禁止收缩 -->
        <aside class="w-48 bg-blue-100 shrink-0 p-4">
            <h3 class="font-bold">导航菜单</h3>
            <ul class="mt-4 space-y-2">
                <li>首页</li>
                <li>产品</li>
                <li>联系</li>
            </ul>
        </aside>

        <!-- 主要内容区,自动占据剩余空间 -->
        <main class="flex-1 bg-white p-4 overflow-y-auto">
            <h2 class="text-xl font-bold mb-2">主要内容区域</h2>
            <p>当窗口缩小时,侧边栏保持宽度,此区域会自动收缩。</p>
            <p class="mt-2 text-gray-500">尝试调整浏览器宽度观察效果。</p>
        </main>

        <!-- 右侧广告位,允许增长 -->
        <div class="w-32 bg-yellow-50 grow p-4 hidden md:block">
            <p class="text-xs text-center text-gray-500">广告位</p>
        </div>
    </div>
</body>

</html>

对齐与间距

对齐是 Flexbox 最强大的功能之一,分为“主轴对齐”和“交叉轴对齐”。

主轴对齐

Justify Content

控制子元素在主轴(由 flex-direction 决定)上的分布方式。

  • justify-start: 起始端对齐(默认)。

  • justify-end: 末端对齐。

  • justify-center: 居中对齐。

  • justify-between: 两端对齐,中间元素均匀分布。

  • justify-around: 每个元素两侧间距相等(边缘间距为中间的一半)。

  • justify-evenly: 所有间距完全相等(包括边缘)。

交叉轴对齐

Align Items & Align Self

控制子元素在交叉轴(垂直于主轴的方向)上的对齐方式。

  • items-start / end / center: 交叉轴的起始、末端或居中对齐。

  • items-baseline: 基于文本基线对齐(适用于字号不同的文本行)。

  • items-stretch: 默认值,拉伸子元素以填满容器高度(需子元素未设置固定高度)。

  • self-*: align-self 的映射,用于单独覆盖某个子元素的对齐方式(如 self-center, self-end)。

间隙控制

Gap

直接在容器上设置子元素间的间距,无需使用 margin

  • gap-4: 行和列间距均为 1rem (16px)。

  • gap-x-4: 仅水平方向(列)间距。

  • gap-y-4: 仅垂直方向(行)间距。

代码示例

完美的居中与分布

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <title>Tailwind Auto Cols 对比演示</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>

<body>
    <!-- 场景 1: 水平垂直居中 -->
    <div class="flex items-center justify-center h-40 bg-gray-100 border mb-4">
        <div class="bg-blue-500 text-white px-4 py-2 rounded">绝对居中</div>
    </div>

    <!-- 场景 2: 两端对齐,中间自动推开 -->
    <div class="flex justify-between items-center h-40 bg-gray-100 border mb-4 px-4">
        <span class="font-bold">Logo</span>
        <nav class="flex gap-4">
            <a href="#">链接 1</a>
            <a href="#">链接 2</a>
            <a href="#">链接 3</a>
        </nav>
    </div>

    <!-- 场景 3: 基线对齐 (不同字号) -->
    <div class="flex items-baseline gap-4 h-40 bg-gray-100 border mb-4 px-4">
        <span class="text-3xl font-bold">大标题</span>
        <span class="text-sm text-gray-500">副标题说明文字</span>
        <span class="text-lg">中等内容</span>
    </div>

    <!-- 场景 4: 单独覆盖对齐 (self-end) -->
    <div class="flex items-center h-40 bg-gray-100 border px-4 gap-4">
        <div class="h-20 w-20 bg-red-200">默认拉伸/居中</div>
        <div class="h-32 w-20 bg-green-200 self-end">底部对齐</div>
        <div class="h-24 w-20 bg-blue-200 self-center">再次居中</div>
    </div>
</body>

</html>

网格布局系统

Grid 是二维布局模型,能同时处理行和列,非常适合构建复杂的页面骨架、仪表盘和图片画廊。

定义列与行

Template Columns / Rows

Tailwind 默认提供 1 到 12 列的快捷类,也支持自定义行数。

  • grid-cols-n: 创建 n 列等宽网格(如 grid-cols-1, grid-cols-2, grid-cols-12)。

  • grid-rows-n: 创建 n 行等高网格(如 grid-rows-1, grid-rows-3)。

  • : 若需非等分列(如 1fr 2fr),可使用任意值语法 grid-cols-[1fr_2fr]

单元格跨越

Column / Row Span

让单个元素跨越多个列或行。

  • col-span-n: 横跨 n 列(如 col-span-2, col-span-full 占满整行)。

  • row-span-n: 纵跨 n 行(如 row-span-2, row-span-full 占满整列)。

代码示例

响应式仪表盘布局

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <title>Tailwind Auto Cols 对比演示</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>

<body>
    <div class="grid grid-cols-1 md:grid-cols-4 gap-6 p-6 bg-gray-50">

        <!-- 头部统计卡:在小屏占满,中屏以上占 1 列 -->
        <div class="col-span-1 md:col-span-1 bg-white p-4 rounded shadow border-l-4 border-blue-500">
            <h4 class="text-gray-500 text-sm">总访问量</h4>
            <p class="text-2xl font-bold">12,345</p>
        </div>

        <div class="col-span-1 md:col-span-1 bg-white p-4 rounded shadow border-l-4 border-green-500">
            <h4 class="text-gray-500 text-sm">新用户</h4>
            <p class="text-2xl font-bold">892</p>
        </div>

        <div class="col-span-1 md:col-span-1 bg-white p-4 rounded shadow border-l-4 border-purple-500">
            <h4 class="text-gray-500 text-sm">转化率</h4>
            <p class="text-2xl font-bold">3.2%</p>
        </div>

        <div class="col-span-1 md:col-span-1 bg-white p-4 rounded shadow border-l-4 border-orange-500">
            <h4 class="text-gray-500 text-sm">服务器负载</h4>
            <p class="text-2xl font-bold">45%</p>
        </div>

        <!-- 主图表区域:跨 3 列 -->
        <div class="col-span-1 md:col-span-3 bg-white p-6 rounded shadow min-h-[300px]">
            <h3 class="font-bold text-lg mb-4">流量趋势图</h3>
            <div class="h-48 bg-gray-100 flex items-center justify-center text-gray-400">
                [图表占位符]
            </div>
        </div>

        <!-- 侧边通知栏:跨 1 列,跨 2 行高度(需配合 grid-rows 定义) -->
        <!-- 此处为了演示 span,假设父容器有足够行高 -->
        <div class="col-span-1 md:col-span-1 row-span-2 bg-white p-4 rounded shadow">
            <h3 class="font-bold text-lg mb-2">系统通知</h3>
            <ul class="space-y-2 text-sm text-gray-600">
                <li class="border-b pb-2">• 系统维护完成</li>
                <li class="border-b pb-2">• 新版本上线</li>
                <li>• 安全补丁已应用</li>
            </ul>
        </div>

        <!-- 底部日志:跨满全行 -->
        <div class="col-span-full bg-white p-4 rounded shadow">
            <h3 class="font-bold text-sm text-gray-500">最新日志</h3>
            <p class="text-xs font-mono mt-1 text-gray-400">2026-03-12 16:28:00 INFO System started successfully...</p>
        </div>

    </div>
</body>

</html>