flex-grow按权重分配剩余空间而非均分父容器宽度,仅在有剩余空间时生效;flex-shrink控制溢出时的收缩比例,以flex-basis为基准;flex-basis优先级高于width,min-width为收缩下限。
flex-grow 是怎么分配剩余空间的
flex-grow 不是按比例“瓜分”父容器宽度,而是按权重“分配剩余空间”。它只在父容器有剩余空间(即子项总基础尺寸小于容器)时才起作用。
- 如果所有子项设置了
flex-grow: 1,剩余空间被均分,每个子项额外获得相同宽度 - 如果一个子项设
flex-grow: 2,另一个设flex-grow: 1,剩余空间按 2:1 分配(不是最终宽度比为 2:1) -
flex-grow对已溢出的子项无效——它不压缩内容,只扩展
常见误解:以为 flex-grow: 2 就能让元素占满两倍宽度。实际结果还取决于它们的 flex-basis(默认是 auto,即内容宽度)。如果某项文字很长,flex-basis 就大,即使 flex-grow 小,它也可能更宽。
flex-shrink 怎么影响缩小时的行为
flex-shrink 控制当容器空间不足时,子项是否以及按什么比例缩小。它的默认值是 1,意味着所有子项会按自身 flex-basis(或 width)为基准,等比收缩。
- 设
flex-shrink: 0的子项完全不缩小,哪怕内容溢出容器或触发横向滚动 - 设
flex-shrink: 2的子项,比flex-shrink: 1的收缩得更快(收缩量 = 基准尺寸 ×flex-shrink× 收缩因子) - 注意:
flex-shrink只对“可缩小”的尺寸生效;如果子项含不可折行文本(如长 URL)、white-space: nowrap或固定宽图片,它可能无法有效缩小,反而撑破布局
典型踩坑:在卡片列表中给图标区域设 flex-shrink: 0,但没限制图标容器最大宽,结果图标拉伸变形——应配合 max-width 或 overflow: hidden。
立即学习“前端免费学习笔记(深入)”;
width / flex-basis / min-width 三者怎么配合
这三者共同决定一个 flex 项的“初始主轴尺寸”,顺序和优先级很关键: