4. Flex弹性布局(上)

Flex布局,说白了就是CSS里最让我省心的布局方案。以前做浮动布局时,每次都要清浮动、算宽度,稍不留神就崩了。自从用了Flex,我写布局的效率至少翻了一倍。今天咱们就先把容器属性吃透,这是Flex布局的根基。

核心概念:Flex容器(父元素)控制着内部所有Flex项目(子元素)的排列方式。你只需要在父元素上设置 display: flex,子元素就会自动变成Flex项目。

4.1 flex-direction:主轴方向

这个属性决定了子元素是横着排还是竖着排。我刚开始学的时候总搞混主轴和交叉轴,后来记住一句话:flex-direction 控制的就是主轴方向。

属性值 效果 实际场景
row(默认) 水平从左到右 导航栏、按钮组
row-reverse 水平从右到左 右侧对齐的操作栏
column 垂直从上到下 表单、列表
column-reverse 垂直从下到上 聊天消息列表(最新在底部)
/* 水平排列,最常用 */
.container {
  display: flex;
  flex-direction: row;
}

/* 垂直排列,做表单时常用 */
.form-container {
  display: flex;
  flex-direction: column;
}

我的经验:做移动端页面时,我习惯把 flex-direction 和媒体查询配合使用。大屏用 row,小屏切到 column,一行代码就能搞定响应式。

4.2 flex-wrap:换行控制

默认情况下,Flex项目会挤在一行里,哪怕内容被压缩得不成样子。我曾经就踩过这个坑——做卡片列表时,所有卡片挤成了一团,文字都叠在一起了。

.card-list {
  display: flex;
  flex-wrap: wrap;  /* 允许换行 */
  gap: 16px;        /* 项目间距,比margin好用多了 */
}
属性值 说明 避坑指南
nowrap(默认) 不换行,项目被压缩 内容过多时会溢出
wrap 换行,从上到下排列 记得配合 gap 使用
wrap-reverse 换行,从下到上排列 用得少,但做倒序布局时很香

注意:用了 wrap 之后,align-content 才会生效。我之前调试了半天才发现这个问题——项目明明换行了,但多行对齐就是没反应。

4.3 justify-content:主轴对齐

这个属性控制的是项目在主轴上的分布方式。说白了就是「怎么分钱」——是大家挤在左边,还是均匀分摊。

.toolbar {
  display: flex;
  justify-content: space-between;  /* 两端对齐,中间自动留空 */
}
属性值 效果 适用场景
flex-start 左对齐(默认) 常规布局
flex-end 右对齐 操作按钮靠右
center 居中对齐 弹窗、提示信息
space-between 两端对齐,项目间间距相等 导航栏、标签页
space-around 每个项目两侧间距相等 卡片网格
space-evenly 所有间距完全相等 均匀分布的图标栏

我的习惯:做后台管理系统时,space-between 是我用得最多的。比如表格操作栏,「编辑」「删除」「查看」三个按钮,两端对齐刚刚好。

4.4 align-items:交叉轴对齐

如果说 justify-content 管的是「横着怎么排」,那 align-items 管的就是「竖着怎么对齐」。这个属性在项目高度不一致时特别有用。

.avatar-group {
  display: flex;
  align-items: center;  /* 所有头像垂直居中 */
}
属性值 效果 实际案例
stretch(默认) 拉伸填满容器高度 等高列布局
flex-start 顶部对齐 文字标签
flex-end 底部对齐 底部固定信息
center 垂直居中 图标+文字组合
baseline 基线对齐 不同字号文字的排版

我曾经踩过的坑:做表单时,输入框和按钮高度不一样,用了 align-items: center 后,按钮总是偏上。后来发现是按钮本身有 padding 影响了高度计算。解决办法是统一设置 height 或者用 line-height 控制。

4.5 align-content:多行对齐

这个属性很多人会忽略,但它其实很重要。记住一句话:只有多行(即 flex-wrap: wrap 生效时),align-content 才有用。

.grid-container {
  display: flex;
  flex-wrap: wrap;
  align-content: space-around;  /* 多行之间均匀分布 */
}
属性值 效果 说明
stretch(默认) 拉伸行高填满容器 行与行之间没有空隙
flex-start 所有行靠顶部 内容少时顶部对齐
flex-end 所有行靠底部 内容少时底部对齐
center 所有行垂直居中 内容少时居中显示
space-between 行之间间距相等 首行贴顶,末行贴底
space-around 每行上下间距相等 所有行均匀分布

核心区别:align-items 管的是「一行内」项目的对齐,align-content 管的是「多行之间」的分布。两者不冲突,可以同时使用。

知识体系总览

下面这张图是我自己总结的Flex容器属性关系,你看一眼就能记住它们各自管什么:

Flex 容器属性知识体系 Flex 容器 (display: flex) flex-direction row / column / reverse flex-wrap nowrap / wrap / wrap-reverse justify-content 主轴方向对齐 align-items 单行交叉轴对齐 align-content 多行交叉轴分布 使用口诀: 1. 先定主轴方向(flex-direction) 2. 再决定是否换行(flex-wrap) 3. 主轴对齐用 justify-content 4. 交叉轴对齐用 align-items / align-content 提示:align-content 仅在 flex-wrap: wrap 时生效

我的建议:刚开始学Flex时,别急着背属性值。打开浏览器开发者工具,在样式面板里一个一个试,看效果变化。我当年就是这么学会的——动手试一遍,比看十遍文档都管用。

好了,这五个容器属性就是Flex布局的「五虎上将」。你想想看,只要掌握了它们,大部分布局需求都能搞定。下一节咱们再聊项目属性,到时候配合起来用,效果会更惊艳。

一句话总结:容器属性管的是「怎么排」,项目属性管的是「怎么长」。先把容器属性练熟,后面就水到渠成了。