Skip to content

CSS Flex 布局

布局的传统解决方案,基于盒状模型,依赖 display 属性 + position 属性 + float 属性

什么是 flex 布局

FlexFlexible Box),即为"弹性布局"。设为 Flex 布局以后,子元素的 floatclearvertical-align 属性将失效。

css
.box {
  display: -webkit-flex; /* Safari */
  display: flex;
  display: inline-flex; /* inline元素 */
}

容器的属性

以下属性设置在 flex 布局中的父元素(即设有 display:flex 的元素),用来控制内部子元素的行为。

css
.box {
  flex-direction: row(默) | row-reverse | column | column-reverse;
  flex-wrap: nowrap(默) | wrap | wrap-reverse;
  flex-flow: <flex-direction> <flex-wrap>;
  justify-content: flex-start(默) | flex-end | center | space-between | space-around;
  align-items: flex-start | flex-end | center | baseline | stretch(默);
  align-content: flex-start | flex-end | center | space-between | space-around | stretch(默);
}
  • flex-direction: 子元素的排列方向。
    • row: 水平方向,起点在左端。
    • row-reverse: 水平方向,起点在右端。
    • column: 垂直方向,起点在上沿。
    • column-reverse: 垂直方向,起点在下沿。
  • flex-wrap: 如果子元素一条线排不下,如何换行。
    • nowrap: 不换行。
    • wrap: 换行,第一行在上方。
    • wrap-reverse: 换行,第一行在下方。
  • flex-flow: flex-directionflex-wrap 的简写形式。
  • justify-content: 子元素在一条横线上的对齐方式。
    • flex-start: 左对齐。
    • flex-end: 右对齐。
    • center: 居中。
    • space-between: 两端对齐,项目之间的间隔都相等。
    • space-around: 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
  • align-items: 每个子元素在垂直方向上的对齐方式。
    • flex-start: 对齐顶部。
    • flex-end: 对齐底部。
    • center: 垂直居中。
    • baseline: 子元素的第一行文字的基线对齐。
    • stretch: 如果子元素未设置高度或设为 auto,将占满整个容器的高度。
  • align-content: 定义数量超过一行的子元素的垂直对齐方式。
    • flex-start: 对齐顶部。
    • flex-end: 对齐底部。
    • center: 垂直居中。
    • space-between: 垂直两端对齐,轴线之间的间隔平均分布。
    • space-around: 垂直两端对齐,每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
    • stretch: 如果子元素未设置高度或设为 auto,将占满整个容器的高度。

容器内子元素的属性

css
.item {
  order: <integer>; /* 定义子元素的排列顺序。数值越小,排列越靠前,默认为0。 */
  flex-grow: <number>; /* 定义子元素的放大比例,默认为0,即如果存在剩余空间,也不放大。 */
  flex-shrink: <number>; /* 定义了子元素的缩小比例,默认为1,即如果空间不足,该项目将缩小。 */
  flex-basis: <length> | auto; /* 定义了子元素所占固定空间(如100px),默认auto */
  flex: <flex-grow> <flex-shrink(可选)> <flex-basis(可选)>]; /* 快捷值:initial (0 1 auto)(默认), auto (1 1 auto), none (0 0 auto), 1 (1 1 0%), 0 (0 1 0%)*/
  align-self: auto(默) | flex-start | flex-end | center | baseline | stretch; /* 该属性用来覆盖父元素统一的align-items属性,达到该子元素的个性化 */
}

flex:0 flex:1 flex:none flex:auto 应该在什么场景下使用