【HTML+CSS】day07-flex-core

作者:mario 发布时间: 2026-08-18 阅读量:17 评论数:0

第七天: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│           │
│  └─────┘ └─────┘ └─────┘ └─────┘           │
│  ↑ 交叉轴(垂直于主轴,默认从上到下)            │
│                                              │
└──────────────────────────────────────────────┘

术语

含义

默认方向

容器

设置了 display: flex 的父元素

项目

容器的直接子元素

主轴

项目排列的主要方向

水平(→)

交叉轴

垂直于主轴的方向

垂直(↓)

🧠 核心规则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 用法

  1. .navbardisplay: flex + justify-content: space-between:Logo 和菜单分居两端

  2. .navbaralign-items: center:内容垂直居中

  3. .nav-menudisplay: flex + gap: 24px:菜单项水平排列,间距统一

验证:照敲 → 把 justify-content 改成 centerflex-startflex-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 题

  1. display: flex 加在哪个元素上?容器还是项目?

  2. 主轴和交叉轴分别是什么?默认方向是什么?

  3. justify-contentalign-items 分别控制哪个轴的对齐?

  4. justify-content: space-betweenspace-around 的区别是什么?

  5. 写出让子元素水平居中的 Flex 代码(两行)。

  6. 写出让子元素水平垂直都居中的 Flex 代码(三行)。

  7. flex-wrap: wrap 的作用是什么?什么场景用?

  8. gap: 16px 的作用是什么?和 margin 比有什么优势?

  9. 把导航栏的 flex-direction 改成 column,观察效果。

  10. 用 F12 把导航栏的 justify-content 值逐个切换,观察变化。

加分挑战:在导航栏中增加一个搜索框(<input>),让它和菜单一起在右侧,用 gap 保持间距。


十一、总结

今天学完,你应该能做到:

  • [x] 解释 Flex 的容器和项目概念

  • [x] 说出主轴和交叉轴的含义

  • [x] 写出 justify-content 的 6 个值并知道各自效果

  • [x] 写出 align-items 的 5 个值

  • [x] 使用 flex-wrapgap

  • [x] 独立做出水平导航栏(logo 左 + 菜单右)

一句话带走:Flex 让布局从"手动摆放"变成"自动排队"——justify-content 管主轴,align-items 管交叉轴,gap 管间距。三行代码解决过去需要几十行才能搞定的对齐问题。


📎 本文为"蜗牛往上爬"学习博客系列 · 阶段 0(HTML+CSS)第 3 周 · 第 1 篇

评论