[toc]
| 单词 | 词性 | 音标 | 含义 |
|---|---|---|---|
| Flex | n. | /fleks/ | 弹性布局(Flexible Box),在一行/一列内排列与对齐子元素 |
| display | n. | /dɪˈspleɪ/ | CSS 属性,display: flex 把元素变成弹性容器 |
| justify-content | n. | /ˈdʒʌstɪfaɪ ˈkɒntent/ | 主轴方向的分布方式(左/中/右/两端/均匀) |
| align-items | n. | /əˈlaɪn ˈaɪtəmz/ | 交叉轴上的对齐方式(顶部/居中/底部/拉伸) |
| gap | n. | /ɡæp/ | 弹性容器内子元素的统一间距 |
| scoped | adj. | /ˈskəʊpt/ | 样式作用域限定,只作用于当前组件、防止污染 |
| Grid | n. | /ɡrɪd/ | 二维网格布局,适合行列交叉的复杂排布 |
Lecture13-Flex 布局与 Scoped
1、本节讲什么
掌握"排盒子"的两个核心技能:Flex 布局(页面局部怎么排)+ Scoped(样式隔离)。布局的整体骨架交给 Element Plus,Flex 管骨架内的细节。
2、概念速览
什么是 CSS:给页面"化妆"的语言,管颜色、大小、布局。HTML 是骨架,CSS 是外观。
什么是盒模型:每个元素都是一个"盒子"(内容 + 内边距 + 边框 + 外边距),间距就是排这些盒子。

Flex 和 Grid 一句话:Flex 排"一行/一列",Grid 排"二维网格"。常规项目 Flex 用得远比 Grid 多。
Element Plus 布局 vs Flex:各管一段
上一节讲过 el-row/el-col 管"页面骨架",它底层本身就是 Flex 实现的。Flex 不是要取代它,而是在同一套 flex 思想下不同层级各管一段:
| 层级 | 用什么 | 管什么 | 例子 |
|---|---|---|---|
| ① 页面骨架 | el-row 和 el-col | 划分大区域(宽度、行、间距) | 顶栏、侧边、内容区 |
| ② 区域内部 | el-col 里 display: flex | 列内元素并排 / 居中 / 对齐 | 工具栏的按钮排成一行 |
| ③ 细节间距 | 盒模型(gap / margin / padding) | 元素之间的距离 | 按钮间距、卡片内边距 |
Grid 认识即可:它适合"既按行、又按列精确排列"的复杂网格(卡片墙、日历、看板)。后台管理系统里骨架被 el-row/el-col 接管、局部用 Flex 就够,所以手写 Grid 很少——AI 生成了你能看懂、会改 grid-template-columns 那一行就行。
正确 vs 误区:先写结构(HTML),再管外观(CSS);别用 margin 硬怼位置,优先 Flex 自动排;别层层嵌套 el-row/el-col,骨架两层 + 列内 flex 就够。
3、先看效果
一个 el-col 内的"工具栏",用 Flex 排三个按钮——改一行 justify-content,按钮的分布就变:
<template>
<el-row>
<el-col :span="24">
<!-- 列内用 flex 排三个按钮:justify-content 决定它们怎么分布 -->
<div class="toolbar">
<el-button>新增</el-button>
<el-button>编辑</el-button>
<el-button type="danger">删除</el-button>
</div>
</el-col>
</el-row>
</template>
<style scoped>
.toolbar {
display: flex;
gap: 8px; /* 按钮间距 */
justify-content: flex-start; /* 改成下面 5 个值看效果 */
}
</style>
把 justify-content 依次改成这 5 个值,看按钮在页面上的分布变化:
| 值 | 页面上长什么样 |
|---|---|
flex-start | 按钮们挤在左边(默认) |
center | 按钮们挤在中间 |
flex-end | 按钮们挤在右边(如页面右上角放"退出") |
space-between | 首尾贴两边、中间均匀分散 |
space-evenly | 按钮间距完全相等(最均匀) |
4、照着做
Flex 的细节分两类:写在容器上的管"整排怎么排",写在项目上的管"每个元素自己"。
实验 1:容器属性(写在父元素上)
| 属性 | 作用 | 页面上的具体体现 |
|---|---|---|
flex-direction | 主轴方向 | row=子元素横排(默认);column=竖排 |
justify-content | 主轴分布 | 横排时:靠左 / 居中 / 靠右 / 两端分散(见"先看效果"表) |
align-items | 交叉轴对齐(单行) | 横排时:顶部对齐 / 垂直居中 / 底部对齐 / 拉伸等高 |
flex-wrap | 是否换行 | 放不下折到下一行(默认不换行) |
gap | 元素间距 | 元素之间留空隙,不用挨个加 margin |
试试:把工具栏改成竖排(flex-direction: column),或加 align-items: center 看垂直居中。
实验 2:项目属性(写在子元素上)
| 属性 | 作用 | 页面上的具体体现 |
|---|---|---|
flex: 1 | 放大占满剩余空间 | 如"搜索框"自动撑满剩余宽度,按钮固定在右侧(AI 生成最高频写法) |
order | 显示顺序 | 打乱 HTML 顺序也能换显示先后 |
align-self | 单个元素对齐 | 只调这一个,覆盖父级的 align-items |
试试:给工具栏第一个按钮加 style="flex: 1",看它撑满剩余宽度。
Scoped 样式隔离
上面所有 <style> 都带着 scoped,这是 Vue 每个组件都该有的:
<style scoped>
.toolbar { display: flex; gap: 8px; }
</style>
scoped 的作用:这里的样式只作用于当前组件,不会串到别的组件里去。删掉它,.toolbar 就会变成全局样式,可能污染别的页面——这是防"屎山"的关键一环。
高内聚、低耦合
AI 生成的每个组件几乎都带 <style scoped>,你认得它、别随手删就行。
5、常见疑问
- Q:Flex 和 Grid 到底怎么选? A:一行内排列、对齐用 Flex(90% 场景);"行列交叉、要跨行列"的复杂网格才用 Grid。常规项目 Flex 为主。
- Q:想居中一个东西怎么最快?
A:
display: flex; justify-content: center; align-items: center;三件套,解决 90% 居中。 - Q:
gap和margin有啥区别? A:gap是 flex/grid 容器内统一设子元素间距,不用挨个加;margin是单个元素自己往外推。同一排多个元素优先用gap。 - Q:盒模型(margin / padding / border)怎么记?
A:
padding是内边距(内容到边框),margin是外边距(盒子到外面),border是边框。改错位置时先分清这三个。
6、规范要点
- 骨架用
el-row/el-col,局部用 Flex,别用margin硬怼位置。 flex: 1是"撑满剩余空间"的常用写法,AI 代码里高频出现,要认得。- 样式一律写在
<style scoped>里,防止污染别的组件。 - 常用布局(居中、横向排列)形成自己的"小抄",让 AI 生成的样式你一眼能看懂。
7、本节验证
- 会在 el-col 内用 display: flex 排列元素 ✅
- 会用 justify-content 控制主轴分布、align-items 控制交叉轴对齐 ✅
- 会用 gap 统一设置子元素间距,而不是挨个加 margin ✅
- 知道样式要写在