flex弹性布局的成分属性

149 阅读3分钟

flex 是 flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为flex布局。当我们为父盒子设为 flex 布局以后,子元素的 floatclearvertical-align 属性将失效。

采用flex布局的元素,称为Flex容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称"项目"。

Flex项目中使用 flex 属性可以根据Flex容器的可用空间对自身做伸缩计算,其包含三个子属性: flex-grow(扩展比率)、flex-shrink(收缩比率) 和 flex-basis(伸缩基准)。这三个属性可以控制Flex项目。

flex-grow

设置Flex项目的扩展比率,让Flex项目得到(扩展)多少Flex容器剩余空间(Positive Free Space),即Flex项目可能会变大。

flex-grow 省略时默认值为 1,初始值为 0。

flex-grow: <number>;

设置Flex项目的扩展比率要根据所有Flex项目的 flex-grow 总和来定。

总和小于1时,Flex项目同样会根据 flex-grow 增长因子来瓜分Flex容器的剩余空间,Flex自身宽度也会变大,但Flex容器的剩余空间不会被全部瓜分完,因为所有 flex-grow 和小于 1 。

总和大于1时,但也不可以绝对地说,Flex项目可以根据自身的 flex-grow 所占比率来瓜分Flex容器的剩余空间。因为元素的尺寸会受 max-width 的影响。当Flex项目显式设置了 max-width的值时,当Flex项目根据flex-grow计算出来的宽度大于 max-width时,Flex项目会按 max-width 的值为准。

flex-shrink

设置Flex项目收缩比率,让Flex项目减去Flex容器不足的空间(Negative Free Space),即Flex项目可能会变小。

flex-shrink 省略时默认值为 1,初始值为 1。

flex-shrink: <number>;

flex-basis

Flex项目未扩展或收缩之前,它的大小,即指定了Flex项目在主轴方向的初始大小。

flex-basis 省略时默认值为 0,初始值为 auto。若值为0,则必须加上单位,以免被视作伸缩性。

flex-basis: <number>;

flex

flex 属性可以指定 1个值(单值语法)2个值(双值语法)3个值(三值语法)

单值语法

  • flex-grow: 一个 无单位的数<number> ,比如 flex: 1
  • flex-basis: 一个有效的宽度width,比如 flex: 30vw
  • 关键字值: noneautoinitial (即初始值)

双值语法

第一个值: flex-grow无单位数值

第二个值:

  • flex-shrink: 一个无单位的数<number>
  • flex-basis: 一个有效的宽度width

三值语法

第一个值: flex-grow 无单位数<number>

第二个值: flex-shrink 无单位数<number>

第三个值: flex-basis 有效的宽度width

flex 属性的取值

  • auto :Flex项目会根据自身的 width 和 height 来确定尺寸,但Flex项目根据Flex容器剩余空间进行伸缩。其相当于 flex: 1 1 auto
  • initial :Flex项目会根据自身的 width 和 height 来设置尺寸。它会缩短自身以适应Flex容器,但不会伸长并吸收Flex容器中的额外剩余空间来适应Flex容器。其相当于 flex: 0 1 auto
  • none :Flex项目会根据自身的 width 和 height 来设置尺寸。它是完全非弹性的(既不会缩短,也不会伸长来适应Flex容器)。其相当于 flex: 0 0 auto

默认情况下,元素不会缩短至小于内容框尺寸,若想改变这一状况,请设置元素的min-width 与 min-height属性。

常用示例

  1. css 实现左侧固定 300px,右侧自适应的布局
.container {
  display: flex;
}

.left {
  flex-basis: 300px;
  flex-shrink: 0;
}

.right {
  flex-grow: 1;
}

或者

.container {
  display: flex;
}

.left {
  width: 300px;
}

.right {
  flex: 1 1 auto;
}

参考资料: MDN Flexbox布局中不为人知的细节