3、Flexbox实战:骰子布局、圣杯布局、导航栏布局、卡片列表布局

Flexbox这东西,说实话刚出来的时候我还有点抵触。心想「不就布局嘛,float加定位也能搞定」。直到我在一个移动端项目里被各种百分比和负margin折磨得够呛,才老老实实去啃了Flexbox规范。嗯,真香。

今天咱们直接上硬菜——四个最经典的实战场景。你把这四个吃透了,市面上90%的界面布局都能手到擒来。

3.1 骰子布局:Flexbox的「点」到为止

骰子布局是理解Flexbox对齐机制的最佳入门。说白了,就是在一个容器里把几个点(圆点)摆到指定位置。

先看一个最简单的——骰子「1」点:

.dice-one {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100px;
  height: 100px;
  border: 2px solid #333;
  border-radius: 12px;
}

.dot {
  width: 20px;
  height: 20px;
  background: #333;
  border-radius: 50%;
}

就三行核心代码,点就居中了对吧?justify-content管水平,align-items管垂直。

那骰子「2」点呢?两个点要斜对角分布。这时候就要用到flex-direction和justify-content的组合了:

.dice-two {
  display: flex;
  justify-content: space-between;
  width: 100px;
  height: 100px;
  border: 2px solid #333;
  border-radius: 12px;
}

.dice-two .dot:first-child {
  align-self: flex-start;
}

.dice-two .dot:last-child {
  align-self: flex-end;
}

这里有个小技巧——align-self可以覆盖父容器的align-items,让单个子元素独立对齐。我在做表单校验图标对齐时经常用这招。

核心要点:Flexbox的对齐体系分两层——容器级(justify-content / align-items)和项目级(align-self / justify-self)。掌握这个,任何点阵布局都不在话下。

3.2 圣杯布局:三栏结构的终极解法

圣杯布局,就是左右固定宽度、中间自适应的三栏结构。以前用float做,要写一堆清除浮动的代码。用Flexbox?几行搞定。

.holy-grail {
  display: flex;
  min-height: 100vh;
}

.holy-grail .sidebar-left {
  width: 200px;
  background: #f0f0f0;
}

.holy-grail .sidebar-right {
  width: 200px;
  background: #f0f0f0;
}

.holy-grail .main {
  flex: 1;
  background: #fff;
}

注意看flex: 1这行。它是flex-grow: 1; flex-shrink: 1; flex-basis: 0%的缩写。意思是「把剩余空间全吃下」。左右各200px固定,中间自动填满。

避坑指南:我曾经在圣杯布局里给中间栏加了width: 100%,结果左右栏被挤到下一行了。记住,用了flex: 1就别再设宽度,否则会打架。

如果要做响应式,加个媒体查询就行:

@media (max-width: 768px) {
  .holy-grail {
    flex-direction: column;
  }
  
  .holy-grail .sidebar-left,
  .holy-grail .sidebar-right {
    width: 100%;
  }
}

小屏时变成上下堆叠,完美。

3.3 导航栏布局:Logo + 菜单 + 按钮

导航栏是每个网站的门面。常见的结构是:左边Logo,中间菜单项,右边登录/注册按钮。用Flexbox做这个,简直不要太舒服。

.navbar {
  display: flex;
  align-items: center;
  padding: 0 20px;
  height: 60px;
  background: #2c3e50;
}

.navbar .logo {
  font-size: 24px;
  font-weight: bold;
  color: #fff;
}

.navbar .menu {
  display: flex;
  gap: 20px;
  margin: 0 auto;  /* 关键:让菜单居中 */
  list-style: none;
}

.navbar .actions {
  display: flex;
  gap: 10px;
}

这里有个细节——margin: 0 auto在Flexbox里会让元素在主轴方向居中。左边Logo固定,右边按钮固定,中间菜单自动居中。你想想看,用float做这个得多费劲?

注意:如果菜单项太多,记得加flex-wrap: wrap或者overflow-x: auto。我见过一个项目,导航栏在1920屏上好好的,到1366屏上按钮就跑到菜单下面去了——就是因为没处理溢出。

3.4 卡片列表布局:网格与流式布局

卡片列表是Flexbox的拿手好戏。不管是商品列表、文章列表还是用户卡片,核心就两个需求:等高等宽、自动换行。

.card-list {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
  padding: 20px;
}

.card {
  flex: 1 1 300px;  /* 基础宽度300px,可伸缩 */
  max-width: 400px;
  border: 1px solid #e0e0e0;
  border-radius: 8px;
  padding: 16px;
  background: #fff;
}

flex: 1 1 300px的意思是:flex-grow: 1(可以放大)、flex-shrink: 1(可以缩小)、flex-basis: 300px(理想宽度300px)。配合flex-wrap: wrap,卡片会自动换行,而且每一行的高度会自动对齐。

为什么卡片能等高?因为Flexbox默认align-items: stretch,所有子元素在交叉轴方向会被拉伸到同一高度。这个特性在做卡片列表时特别有用——你不用再手动计算高度了。

实战经验:我在做一个电商项目时,商品卡片里文字长度不一,导致卡片高度参差不齐。用Flexbox后,所有卡片自动等高,视觉上整齐多了。但要注意——如果卡片内容太多,记得加overflow: hidden或text-overflow: ellipsis,否则内容会撑破卡片。

知识体系总览

下面这张图帮你理清Flexbox实战的核心脉络:

Flexbox 实战四大场景 🎲 骰子布局 justify-content align-items / align-self 点阵对齐控制 🏆 圣杯布局 flex: 1 自适应 固定 + 弹性组合 三栏经典结构 🧭 导航栏布局 margin: auto 居中 gap 间距控制 Logo + 菜单 + 按钮 📇 卡片列表 flex-wrap: wrap flex-basis 基准宽度 自动换行等高 💡 核心心法 主轴方向:flex-direction 决定 对齐控制:justify-content(主轴) + align-items(交叉轴) 弹性伸缩:flex-grow / flex-shrink / flex-basis 三剑客

这四个布局覆盖了Flexbox最核心的应用场景。骰子布局练对齐,圣杯布局练自适应,导航栏练居中与间距,卡片列表练换行与等高。你把这四个吃透了,以后遇到任何布局需求,第一反应就是「用Flexbox能不能搞定?」——大部分情况下,答案是肯定的。

个人建议:初学者别急着背属性。打开浏览器控制台,拿这四个布局反复调参数。把justify-content的值从flex-start换到space-evenly,亲眼看看每个值的效果。肌肉记忆比死记硬背管用多了。

好了,这一章就到这儿。代码都给你了,去试试吧。

可可精品资料库