flex: 1 详解与 Flex 子项属性解析
一、flex: 1 的完整含义
flex: 1 是 flex-grow、flex-shrink 和 flex-basis 的简写形式,其完整等价于:
1 | flex: 1 1 0; |
二、三大核心属性详解
1. flex-grow(扩展比例)
定义:当容器有剩余空间时,子项的分配比例
特点:
- 默认值:
0(不扩展) - 必须是非负数字
- 按比例分配剩余空间
示例:
1 | .item1 { flex-grow: 1; } |
→ 剩余空间按 1:2 分配
2. flex-shrink(收缩比例)
定义:当空间不足时,子项的收缩比例
特点:
- 默认值:
1(允许收缩) - 必须是非负数字
0表示不收缩(类似flex-shrink: none)
计算方式:
实际收缩量 = (子项原始尺寸 × flex-shrink值) / ∑(所有子项原始尺寸 × flex-shrink值) × 溢出空间
3. flex-basis(基准尺寸)
定义:子项在分配多余空间之前的初始尺寸
特点:
- 默认值:
auto(取元素自身尺寸) - 可设为具体值(
200px、20%等)或0 - 当设置为
0时,会忽略元素自身尺寸
三、flex 简写形式对照表
| 简写形式 | 等价完整形式 | 说明 |
|---|---|---|
flex: initial |
0 1 auto |
默认值,不扩展但可收缩 |
flex: auto |
1 1 auto |
完全弹性,基准为内容尺寸 |
flex: none |
0 0 auto |
完全刚性,不伸缩 |
flex: 1 |
1 1 0 |
完全弹性,基准为0 |
flex: 2 1 |
2 1 0 |
扩展系数2,基准为0 |
flex: 1 100px |
1 1 100px |
基准100px,可伸缩 |
四、深度解析 flex: 1 的特性
1. 空间分配机制
1 | <div class="container"> |
- 总比例:1 + 2 + 1 = 4
- 剩余空间分配:
- A 获得 1/4
- B 获得 2/4
- C 获得 1/4
2. 与 flex-basis: 0 的关系
flex: 1 的 flex-basis: 0 会导致:
- 忽略元素内容宽度
- 完全按比例分配空间
- 实现真正均匀分布(不同于
flex: auto)
3. 与 flex-grow: 1 的区别
1 | /* 情况1 */ |
区别:
- 情况1 会受元素内容影响
- 情况2 完全按比例分配
五、常见应用场景
1. 等分布局
1 | .container { |
2. 主内容自适应
1 | .sidebar { |
3. 响应式网格
1 | .grid-item { |
六、常见误区与注意事项
flex-basis与width的优先级:- 在Flex布局中,
flex-basis会覆盖width - 除非
flex-basis: auto
- 在Flex布局中,
最小内容尺寸限制:
- 即使
flex-basis: 0,也不会小于内容最小宽度 - 可加
min-width: 0强制收缩
- 即使
性能考虑:
- 避免过度嵌套Flex容器
flex: 1比flex-grow: 1性能稍优(浏览器优化)
IE11 兼容性:
- IE11 对
flex-basis: 0支持有问题 - 需写成
flex: 1 1 0px
- IE11 对
通过深入理解这些属性,可以精准控制Flex布局中的空间分配,实现各种复杂的自适应布局效果。