Lecture13-Flex 布局与 Scoped

文章目录

    [toc]

    单词词性音标含义
    Flexn./fleks/弹性布局(Flexible Box),在一行/一列内排列与对齐子元素
    displayn./dɪˈspleɪ/CSS 属性,display: flex 把元素变成弹性容器
    justify-contentn./ˈdʒʌstɪfaɪ ˈkɒntent/主轴方向的分布方式(左/中/右/两端/均匀)
    align-itemsn./əˈlaɪn ˈaɪtəmz/交叉轴上的对齐方式(顶部/居中/底部/拉伸)
    gapn./ɡæp/弹性容器内子元素的统一间距
    scopedadj./ˈskəʊpt/样式作用域限定,只作用于当前组件、防止污染
    Gridn./ɡrɪd/二维网格布局,适合行列交叉的复杂排布

    Lecture13-Flex 布局与 Scoped

    1、本节讲什么

    掌握"排盒子"的两个核心技能:Flex 布局(页面局部怎么排)+ Scoped(样式隔离)。布局的整体骨架交给 Element Plus,Flex 管骨架内的细节。

    2、概念速览

    什么是 CSS:给页面"化妆"的语言,管颜色、大小、布局。HTML 是骨架,CSS 是外观。

    什么是盒模型:每个元素都是一个"盒子"(内容 + 内边距 + 边框 + 外边距),间距就是排这些盒子。 image-20261008165113290

    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 ✅
    • 知道样式要写在