flex容器通过主轴和交叉轴的弹性属性控制子元素尺寸。设置display:flex后,子元素成为flex项目,其主轴尺寸由flex-basis、width、flex-grow和flex-shrink共同决定;默认不换行,主轴为水平方向。flex-grow分配剩余空间,flex-shrink在空间不足时收缩项目,flex-basis作为初始尺寸基准。交叉轴上,项目高度由内容或height属性决定,align-items控制对齐方式,默认stretch会拉伸项目至容器高度(需容器有明确高度)。使用flex:1等同于flex:1 1 0%,即flex-basis为0,按比例分摊剩余空间。子元素无width且flex-grow为0时仅包裹内容。关键在于理解flex-basis为起点,grow和shrink为动态调节机制。

在 css 中,flex 容器与其子元素(flex 项目)的尺寸关系由弹性布局的特性决定。理解这些关系有助于更好地控制页面结构和响应式设计。
flex 容器如何影响子元素尺寸
当一个元素设置为 display: flex 或 display: inline-flex 后,其直接子元素变成 flex 项目,它们的尺寸不再完全由自身 content 或 width 决定,而是受容器主轴方向、对齐方式以及弹性属性共同影响。
关键点:
- flex 项目默认沿主轴方向排列,主轴默认是水平方向(row)
- 项目不会自动换行,除非设置 flex-wrap: wrap
- 项目的主轴尺寸会受到 flex-basis、width 和 flex-grow/flex-shrink 影响
主轴方向上的尺寸计算
在主轴上,每个项目占据的空间由以下属性协同决定:
- flex-basis:定义项目在分配多余空间前的初始主轴尺寸,默认值为 auto。若设置了 width,则 flex-basis 默认取 width 的值
- flex-grow:决定项目如何拉伸以填充剩余空间。值为 0 表示不拉伸;大于 0 则按比例分配多余空间
- flex-shrink:当空间不足时,项目是否收缩及收缩比例
例如:
若容器宽度 500px,两个子元素各设 width: 100px,且都设置 flex-grow: 1,则它们会平分剩余空间(各再加 150px),最终各占 250px。
交叉轴上的尺寸行为
交叉轴通常是垂直方向(当主轴为 row 时)。在这个方向上:
立即学习“前端免费学习笔记(深入)”;
- 项目高度默认由内容决定,或由 height / min-height / max-height 控制
- 可通过容器的 align-items 控制所有项目在交叉轴上的对齐和尺寸表现(如 stretch 会使项目拉伸到容器高度)
- 单个项目可用 align-self 覆盖 align-items 的设置
注意:如果未设置 height,且父容器也无明确高度,align-items: stretch 不会产生拉伸效果。
常见尺寸场景说明
- 子元素不设 width,容器有空余空间 → 取决于 flex-grow 是否启用。若都为 0,则只包裹内容
- 子元素设了 width → width 成为 flex-basis 基准,再根据 flex-grow/shrink 调整
- 使用 flex: 1 相当于 flex: 1 1 0%,此时 flex-basis 为 0,项目将均分剩余空间
- 多个不同 flex-grow 值 → 按权重分配多余空间
基本上就这些。掌握 flex 容器主/交叉轴的行为,以及 flex 属性对尺寸的影响,就能准确预判子元素的实际大小。关键是理解 flex-basis 是起点,grow 和 shrink 是调节机制。不复杂但容易忽略细节。


