讲讲flex:1 和 flex:auto 有什么区别

63 阅读3分钟

flex: 1flex: auto 都是 flexbox 布局中的常用属性值,它们看起来有些相似,但在实际应用中有一些明显的区别。

1. flex: 1

flex: 1flex-grow, flex-shrinkflex-basis 的简写,等同于:

flex: 1 1 0;

解释:

  • flex-grow: 1:表示元素可以按比例分配父容器中剩余的空间。
  • flex-shrink: 1:表示元素可以缩小以适应父容器的空间限制。
  • flex-basis: 0:表示元素的初始大小为 0,即 flex-basis 设置为 0,元素的实际大小完全由 flex-growflex-shrink 决定。

具体行为:

  • 分配空间flex: 1 的元素会占据父容器剩余的空间,并且与同样设置了 flex: 1 的其他元素平分这些空间。
  • 自动缩小:如果容器的空间不足,flex-shrink: 1 会使元素缩小以适应容器。

示例:

<div style="display: flex; width: 300px;">
  <div style="flex: 1; background-color: red;">Item 1</div>
  <div style="flex: 1; background-color: blue;">Item 2</div>
</div>
  • Item 1Item 2 会各占一半空间,平分父容器的 300px 宽度。

2. flex: auto

flex: autoflex-grow, flex-shrinkflex-basis 的另一种简写,等同于:

flex: 1 1 auto;

解释:

  • flex-grow: 1:表示元素可以按比例分配父容器中剩余的空间。
  • flex-shrink: 1:表示元素可以缩小以适应父容器的空间限制。
  • flex-basis: auto:表示元素的初始大小是其本身内容的大小,或者是通过宽度/高度属性(如 width, height)来指定的。

具体行为:

  • 分配空间:与 flex: 1 类似,flex: auto 的元素也会占据父容器剩余的空间。
  • 初始大小:与 flex: 1 的区别在于,flex-basis: auto 让元素的初始大小由其内容(或明确设置的宽高)决定,而不是设为 0。因此,元素的实际大小会基于其内容大小加上通过 flex-grow 的分配。

示例:

<div style="display: flex; width: 300px;">
  <div style="flex: auto; background-color: red;">Item 1</div>
  <div style="flex: auto; background-color: blue;">Item 2</div>
</div>
  • 如果 Item 1Item 2 的内容有不同,flex: auto 会首先根据它们的内容大小分配空间,然后再分配剩余的空间。

区别总结:

属性值flex: 1flex: auto
flex-grow11
flex-shrink11
flex-basis0 (即元素的初始大小为 0,完全由 grow 和 shrink 控制)auto (初始大小由内容决定或通过 width/height 指定)
行为元素的初始大小为 0,元素平分父容器的剩余空间;适用于需要平分空间的布局元素的初始大小由内容决定,然后占据剩余空间;适用于内容大小不一的布局
使用场景多个元素需要平分父容器的剩余空间,例如水平或垂直布局的导航栏适用于内容大小不一的元素,需要根据内容占据空间,剩余空间再分配

示例对比:

flex: 1 示例:

<div style="display: flex; width: 300px;">
  <div style="flex: 1; background-color: red;">Short</div>
  <div style="flex: 1; background-color: blue;">Longer text than the first</div>
</div>
  • flex: 1 会使两个元素平分容器宽度,即使它们的内容大小不同。

flex: auto 示例:

<div style="display: flex; width: 300px;">
  <div style="flex: auto; background-color: red;">Short</div>
  <div style="flex: auto; background-color: blue;">Longer text than the first</div>
</div>
  • flex: auto 会根据内容大小决定每个元素的初始宽度,Short 的元素会比 Longer text than the first 的元素更窄,然后再根据剩余空间进行分配。

总结:

  • flex: 1:完全依赖于父容器剩余空间,初始大小为 0,适合平分空间的布局。
  • flex: auto:元素的初始大小由内容决定,适合需要基于内容大小来分配空间的布局。