第七天:Flex 弹性布局 — 让盒子"自觉排队"
蜗牛往上爬 · 前端工业可视化学习笔记 第 7 篇
前两周学了 HTML 骨架和 CSS 基础的"单盒子"样式。但从今天开始,我们进入 CSS 最核心的章节——布局。Flex 是当下使用率最高的 CSS 布局方案,三行代码就能让盒子水平居中、垂直居中、两端对齐。今天先搞懂 Flex 的核心概念和容器属性。
目录
一、为什么需要 Flex?
在 Flex 出现之前,CSS 做水平排列、垂直居中非常痛苦:
/* 旧时代:让三个盒子水平居中 */
/* 方法1:float + 清除浮动(代码多、容易出 bug) */
/* 方法2:display: inline-block + text-align(不够灵活) */
/* 方法3:position: absolute + transform(计算复杂) */
Flex 时代:三行代码搞定水平垂直居中。
.container {
display: flex; /* 开启 Flex 容器 */
justify-content: center; /* 主轴(水平)居中 */
align-items: center; /* 交叉轴(垂直)居中 */
}
Flex 的使命:让元素排列从"手动摆放"变成"自动排队"。
二、核心概念:主轴与交叉轴
Flex 布局中,所有排列都围绕两个轴:
┌──────────────────────────────────────────────┐
│ Flex 容器 (display: flex) │
│ │
│ 主轴方向 → (默认水平,从左到右) │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │项目1│ │项目2│ │项目3│ │项目4│ │
│ └─────┘ └─────┘ └─────┘ └─────┘ │
│ ↑ 交叉轴(垂直于主轴,默认从上到下) │
│ │
└──────────────────────────────────────────────┘
🧠 核心规则:
justify-content控制主轴对齐,align-items控制交叉轴对齐。记住这条,Flex 就懂了一半。
三、容器属性速查
.container {
display: flex; /* ① 开启 Flex */
/* ② 主轴方向 */
flex-direction: row; /* row(→) | row-reverse(←) | column(↓) | column-reverse(↑) */
/* ③ 主轴对齐 */
justify-content: flex-start; /* flex-start | center | flex-end | space-between | space-around | space-evenly */
/* ④ 交叉轴对齐 */
align-items: stretch; /* stretch | flex-start | center | flex-end | baseline */
/* ⑤ 是否换行 */
flex-wrap: nowrap; /* nowrap | wrap | wrap-reverse */
/* ⑥ 间距 */
gap: 16px; /* 项目之间统一间距,超级好用 */
}
四、六个 justify-content 值图解
假设容器宽 600px,内有 3 个各宽 100px 的项目,剩余空间 300px:
flex-start(默认): [A][B][C]················ 靠左
center: ······[A][B][C]·········· 居中
flex-end: ················[A][B][C] 靠右
space-between: [A]··········[B]··········[C] 两端贴边,中间均分
space-around: ··[A]····[B]····[C]·· 每个项目两侧间距相等(两端间距是中间的一半)
space-evenly: ···[A]···[B]···[C]··· 所有间距相等(包括两端)
代码示例
/* 导航栏:logo 左 + 菜单右 → space-between */
.navbar { justify-content: space-between; }
/* 按钮组:居中 → center */
.btn-group { justify-content: center; }
/* 标签列表:等距排列 → space-evenly */
.tag-list { justify-content: space-evenly; }
五、五个 align-items 值图解
假设容器高 200px,项目高度不一:
stretch(默认): ┌────┐┌──┐┌──────┐ 项目被拉伸到容器高度
flex-start: ┌────┐┌──┐┌──────┐ 顶部对齐
center: ┌────┐┌──┐┌──────┐ 垂直居中
flex-end: ┌────┐┌──┐┌──────┐ 底部对齐
baseline: 以文字基线对齐
代码示例
/* 导航栏内容垂直居中 */
.navbar { align-items: center; }
/* 卡片顶部对齐 */
.card-list { align-items: flex-start; }
六、flex-wrap 与 gap
6.1 flex-wrap:换行
/* 默认不换行:所有项目挤在一行,可能被压缩 */
.container { flex-wrap: nowrap; }
/* 换行:空间不够就换到下一行 */
.container { flex-wrap: wrap; }
什么时候用 wrap? 卡片列表、产品网格、照片墙——一行放不下时自动折行。
6.2 gap:间距
/* 所有项目之间统一 16px 间距 */
.container { gap: 16px; }
/* 行间距和列间距不同 */
.container { gap: 16px 24px; } /* 行间距 16px,列间距 24px */
gap 是 Flex 布局中最简洁的间距方案——不需要给每个项目设 margin-right,不用担心最后一个项目多出右边距。
七、动手练:水平导航栏
用 Flex 做一个常见的网站导航栏:Logo 在左,菜单在右。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Flex 水平导航栏</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: "Microsoft YaHei", sans-serif;
background: #f0f2f5;
}
/* 导航栏容器 */
.navbar {
display: flex; /* 开启 Flex */
justify-content: space-between; /* 两端对齐:logo 在左,菜单在右 */
align-items: center; /* 垂直居中 */
background: #1a3a5c;
padding: 0 40px;
height: 60px;
}
.navbar .logo {
color: white;
font-size: 20px;
font-weight: bold;
}
/* 菜单列表也用 Flex */
.nav-menu {
display: flex;
list-style: none;
gap: 24px;
}
.nav-menu a {
color: #8ecae6;
text-decoration: none;
font-size: 15px;
transition: color 0.2s;
}
.nav-menu a:hover {
color: #ffb703;
}
</style>
</head>
<body>
<nav class="navbar">
<div class="logo">智慧工厂</div>
<ul class="nav-menu">
<li><a href="#">设备监控</a></li>
<li><a href="#">产量统计</a></li>
<li><a href="#">告警中心</a></li>
<li><a href="#">报表管理</a></li>
<li><a href="#">系统设置</a></li>
</ul>
</nav>
</body>
</html>
分析三个 Flex 用法:
.navbar用display: flex+justify-content: space-between:Logo 和菜单分居两端.navbar用align-items: center:内容垂直居中.nav-menu用display: flex+gap: 24px:菜单项水平排列,间距统一
验证:照敲 → 把 justify-content 改成 center、flex-start、flex-end 看变化 → 把 flex-direction 改成 column 看变化。
八、常见坑点与最佳实践
坑 1:Flex 只影响直接子元素
<!-- ✅ Flex 只影响 .container 的直接子元素 .item -->
<div class="container">
<div class="item">子元素1</div>
<div class="item">子元素2</div>
</div>
<!-- ❌ .item 内部的元素不受 Flex 影响 -->
<div class="container">
<div class="item">
<span>这个 span 不受 Flex 影响</span>
</div>
</div>
坑 2:设了 flex 但没效果
/* ❌ 忘记写 display: flex */
.container {
justify-content: center; /* 没效果!必须先 display: flex */
}
/* ✅ 正确 */
.container {
display: flex;
justify-content: center;
}
坑 3:overflow 时内容被压缩
/* 默认 flex-shrink: 1,空间不够时项目会被压缩 */
/* 如果不想压缩,给项目加 flex-shrink: 0 */
.item { flex-shrink: 0; }
最佳实践清单
[x] 容器先
display: flex,再设对齐属性[x]
justify-content控制主轴,align-items控制交叉轴[x] 项目间距用
gap,不用margin[x] 卡片列表用
flex-wrap: wrap+gap[x] 导航栏用
space-between实现两端对齐
九、这些知识在工业可视化里用在哪?
大屏顶部标题栏 = Flex 导航栏
.screen-header {
display: flex;
justify-content: space-between;
align-items: center;
height: 60px;
background: linear-gradient(135deg, #0a1628, #1a3a5c);
padding: 0 24px;
}
数据面板网格 = Flex 卡片列表
.panel-grid {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
.data-panel {
flex: 0 0 380px; /* 每个面板 380px 宽 */
background: rgba(10, 20, 40, 0.8);
}
大屏统计数字行 = Flex 均分
.stats-bar {
display: flex;
gap: 16px;
}
.stat-item {
flex: 1; /* 均分 */
text-align: center;
}
十、自测挑战 10 题
display: flex加在哪个元素上?容器还是项目?主轴和交叉轴分别是什么?默认方向是什么?
justify-content和align-items分别控制哪个轴的对齐?justify-content: space-between和space-around的区别是什么?写出让子元素水平居中的 Flex 代码(两行)。
写出让子元素水平垂直都居中的 Flex 代码(三行)。
flex-wrap: wrap的作用是什么?什么场景用?gap: 16px的作用是什么?和margin比有什么优势?把导航栏的
flex-direction改成column,观察效果。用 F12 把导航栏的
justify-content值逐个切换,观察变化。
加分挑战:在导航栏中增加一个搜索框(<input>),让它和菜单一起在右侧,用 gap 保持间距。
十一、总结
今天学完,你应该能做到:
[x] 解释 Flex 的容器和项目概念
[x] 说出主轴和交叉轴的含义
[x] 写出
justify-content的 6 个值并知道各自效果[x] 写出
align-items的 5 个值[x] 使用
flex-wrap和gap[x] 独立做出水平导航栏(logo 左 + 菜单右)
一句话带走:Flex 让布局从"手动摆放"变成"自动排队"——justify-content 管主轴,align-items 管交叉轴,gap 管间距。三行代码解决过去需要几十行才能搞定的对齐问题。
📎 本文为"蜗牛往上爬"学习博客系列 · 阶段 0(HTML+CSS)第 3 周 · 第 1 篇