flex: 1 1 auto 中三个值依次对应 flex-grow、flex-shrink、flex-basis;flex-grow 为 1 表示等比放大剩余空间,flex-shrink 为 1 表示允许等比缩小,flex-basis 为 auto 表示初始尺寸由内容或显式宽高决定。
这三个值依次是 flex-grow、flex-shrink、flex-basis,顺序固定,不能调换。省略时按规则补全:只写一个值(如 flex: 1)时,它被当作 flex-grow,flex-shrink 默认为 1,flex-basis 默认为 auto;写两个值(如 flex: 1 0)时,第二个是 flex-shrink,flex-basis 回退为 auto。
关键在 flex-basis 的取值差异:
flex: 1 等价于 flex: 1 1 auto:项目基准宽度取内容宽或显式 width,剩余空间 = 容器宽 − 所有项目的 flex-basis 之和flex: 1 1 0 中 flex-basis: 0:所有项目初始宽度视为 0,剩余空间 = 容器宽,直接按 flex-grow 比例瓜分整块容器宽度flex: 1,结果因文字内容宽度不同导致不均等;应改用 flex: 1 1 0 或显式设 flex-basis: 0
这是最容易误解的一点。当项目总宽度超出容器时,浏览器不会简单地按 flex-shrink 数值比来缩:flex-shrink: 2 的项目并不一定比 flex-shrink: 1 的项目少一半宽度。
flex-shrink × flex-basis) / 所有项目 (flex-shrink × flex-basis) 之和flex-basis 越大、flex-shrink 越高,该项目承担的压缩量就越大flex-shrink: 0 和明确 flex-basis(比如 flex: 0 0 200px),仅设 flex-shrink: 0 不够,因为 flex-basis: auto 可能随内容变化它们是语义化简写,但展开后行为差异明显,不能混用:
立即学习“前端免费学习笔记(深入)”;
flex: none → flex: 0 0 auto:不放大、不缩小、基准宽度由内容决定。适合图标、按钮等“固定尺寸”元素flex: auto → flex: 1 1 auto:可放大可缩小,基准宽度仍由内容决定。适合需要响应式伸缩的文本区域flex-basis: auto,所以如果项目内有长单词或未断行内容,仍可能溢出;此时需配合 min-width: 0 或 overflow-wrap: break-word
flex 缩写看着简洁,但每个参数都在参与真实的空间分配逻辑。最常被忽略的是 flex-basis 的隐式取值 —— 它不像 width 那样直观可见,却直接决定 flex-grow 和 flex-shrink 的计算起点。