CSS flex 简述

152 阅读4分钟

前言

flex 布局十分灵活且实用。本文先说明了为什么会有弹性盒子,再介绍了 flex 布局的基本概念,最后介绍了flex 属性语法,比如经典的 flex: 1flex: 0flex: initialflex: autoflex: none

为什么会有弹性盒子

弹性盒子(Flexible Box,或者叫 flex 布局)是一种用于按行或按列布局元素的一维布局方法。元素可以膨胀以填充额外的空间,收缩以适应更小的空间。

长久以来,CSS 布局中唯一可靠且跨浏览器兼容的创建工具只有 floats 和 positioning。这两个工具大部分情况下都很好使,但是在某些方面它们具有一定的局限性,让人难以完成任务:(摘自MDN

  • 在父内容里面垂直居中一个块内容。
  • 使容器的所有子项占用等量的可用宽度/高度,而不管有多少宽度/高度可用。
  • 使多列布局中的所有列采用相同的高度,即使它们包含的内容量不同。

弹性盒子出现就是为了解决这些问题。

flex 布局

flex 布局的特性基于主轴或者交叉轴,由 flex-direction 定义的是主轴,交叉轴垂直于主轴。

当我们把一个容器的 display 属性值改为 flex 或者 inline-flex,就创建了 flex 容器。容器中的直系子元素就会变为 flex 元素,flex 元素会有一下特点:

  • 元素排列为一行 (flex-direction 属性的初始值是 row)。
  • 元素从主轴的起始线开始。
  • 元素不会在主维度方向拉伸,但是可以缩小。
  • 元素被拉伸来填充交叉轴大小。

使用 flex 布局以后,子元素的 floatclearvertical-align 属性将失效。

以下属性会作用于 flex 容器上:

  • flex-direction:定义主轴方向。
  • flex-wrap:定义是否换行。
  • flex-flowflex-directionflex-wrap 属性的简写,默认值为 row nowrap
  • justify-content:定义 flex 元素在主轴上的对齐方式。
  • align-items:定义 flex 元素在交叉轴上的对齐方式。
  • align-content:定义多条轴线的对齐方式,如果只有一根轴线,属性无效。

以下属性会作用于 flex 元素上:

  • order:定义 flex 元素的排列顺序,数值越小越靠前,默认值为0。
  • flex-grow:定义 flex 元素在 flex 容器中分配剩余空间的相对比例。 剩余空间的大小为 flex 容器的大小减去所有 flex 元素的默认宽度之和。
  • flex-shrink:定义 flex 元素的收缩比例。 flex 元素仅在默认宽度之和大于容器的时候才会发生收缩。 该属性定义的并不是压缩后 flex 元素的相对比例,而是 flex 元素被压缩的(减少的)相对比例。
  • flex-basis:定义 flex 元素在主轴方向上的初始大小。 该属性定义受 box-sizing 属性影响,指定为对应的 widthheight
  • align-self:改变 flex 元素在交叉轴上的对齐方式,并覆盖已有的 align-items 的值。

flex 属性语法

flex 属性是 flex-growflex-shrinkflex-basis 属性的简写,默认值为 0 1 auto

单值语法

值必须为以下其中之一:

  • 一个无单位数 n:它会被当作 flex: n 1 0;flex-shrink 的值被假定为 1,flex-basis 的值被假定为 0。
  • 一个有效的宽度 (width)值:它会被当作 flex-basis 的值。
  • 关键字 noneautoinitial

常见的很多简写都是单值语法,比如:

  • flex: 1:相当于flex: 1 1 0,可伸长也可缩短,不根据自身宽高来设置尺寸。
  • flex: 0:相当于flex: 0 1 0,不可伸长但可缩短,不根据自身宽高来设置尺寸。
  • flex: initial:相当于flex: 0 1 auto,不可伸长但可缩短,根据自身宽高来设置尺寸
  • flex: auto:相当于flex: 1 1 auto,可伸长也可缩短,根据自身宽高来设置尺寸。
  • flex: none:相当于flex: 0 0 auto,既不可伸长也不可缩短,根据自身宽高来设置尺寸。

双值语法

第一个值必须为一个无单位数,它会被当作 flex-grow 的值。

第二个值必须为以下之一:

  • 一个无单位数:它会被当作 flex-shrink 的值。
  • 一个有效的宽度(width)值:它会被当作 flex-basis 的值。

三值语法:

  • 第一个值必须为一个无单位数,它会被当作 flex-grow 的值。
  • 第二个值必须为一个无单位数,它会被当作 flex-shrink 的值。
  • 第三个值必须为一个有效的宽度值,它会被当作 flex-basis 的值。

参考资料

弹性盒子 - 学习 Web 开发 | MDN
flex 布局的基本概念 - CSS(层叠样式表) | MDN
flex - CSS(层叠样式表) | MDN (mozilla.org)
前端面试题之CSS篇