flex: 1 和 flex: auto 是 CSS Flexbox 中两种不同的简写属性,它们的行为有本质区别。
简写属性组成
flex 是 flex-grow、flex-shrink、flex-basis 的简写:
flex: grow shrink basis;
两者的实际展开值
| 属性 | 展开值 | 含义 |
|---|
flex: 1 | flex-grow: 1
flex-shrink: 1
flex-basis: 0% | 初始尺寸为 0,按比例分配剩余空间 |
flex: auto | flex-grow: 1
flex-shrink: 1
flex-basis: auto | 初始尺寸为内容大小,按比例分配剩余空间 |
核心区别
flex: 1
- 基准尺寸为
0%,所有弹性项从 0 开始竞争空间
- 完全忽略内容原始尺寸,纯粹按比例分配
- 多个
flex: 1 的项会严格等分空间
.container > div {
flex: 1;
}
flex: auto
- 基准尺寸为
auto(内容本身的大小)
- 先占据内容所需空间,再将剩余空间按比例分配
- 内容多的项会占据更多总空间
.container > div {
flex: auto;
}
对比示例
<div class="container">
<div class="item">短</div>
<div class="item">中等内容</div>
<div class="item">很长很长的内容文字</div>
</div>
| 样式 | 结果 |
|---|
flex: 1 | 三个元素宽度完全相等,内容可能溢出或换行 |
flex: auto | 三个元素宽度与内容比例相关,内容多的更宽 |
其他常用值
| 值 | 含义 |
|---|
flex: none | 0 0 auto — 不伸缩,固定内容宽度 |
flex: initial | 0 1 auto — 默认值,可收缩不可扩展 |
flex: 0 | 0 1 0% — 可收缩,基准为 0 |
选择建议
- 需要等分空间(如栅格布局)→ 用
flex: 1
- 需要内容优先(如导航菜单项)→ 用
flex: auto
- 需要固定宽度不伸缩→ 用
flex: none 或直接设置 width