弹性布局

弹性盒子

兼容性

可以在https://caniuse.com/open in new window网站查看,绝大多数设备尤其是移动端都很好的支持flex,所以可以放心使用。

声明定义

容器盒子里面包含着容器元素,使用 display:flex(块级) 或 display:inline-flex(内联级)声明为弹性盒子。

flex-direction

用于控制盒子元素排列的方向。

描述
row从左到右水平排列元素(默认值)
row-reverse从右向左排列元素
column从上到下垂直排列元素
column-reverse从下到上垂直排列元素

flex-wrap

flex-wrap 属性规定flex容器是单行或者多行,同时横轴的方向决定了新行堆叠的方向。

选项说明
nowrap元素不拆行或不拆列(默认值)
wrap容器元素在必要的时候拆行或拆列。
wrap-reverse容器元素在必要的时候拆行或拆列,但是以相反的顺序

flex-flow

flex-flow是flex-direction与flex-wrap的组合简写模式。

justify-content

用于控制元素在主轴上的排列方式,再次强调是主轴的排列方式。

选项说明
flex-start元素紧靠主轴起点
flex-end元素紧靠主轴终点
center元素从弹性容器中心开始
space-between第一个元素靠起点,最后一个元素靠终点,余下元素平均分配空间
space-around每个元素两侧的间隔相等。所以,元素之间的间隔比元素与容器的边距的间隔大一倍
space-evenly元素间距离平均分配

align-items

用于控制容器元素在交叉轴上的排列方式。

选项说明
stretch元素被拉伸以适应容器(默认值)
center元素位于容器的中心
flex-start元素位于容器的交叉轴开头
flex-end元素位于容器的交叉轴结尾

如果设置了[width | height | min-height | min-width | max-width | max-height],将影响stretch 的结果,因为 stretch 优先级你于宽高设置。

align-content

只适用于多行显示的弹性容器,用于控制行(而不是元素)在交叉轴上的排列方式。

选项说明
stretch将空间平均分配给元素
flex-start元素紧靠主轴起点
flex-end元素紧靠主轴终点
center元素从弹性容器中心开始
space-between第一个元素靠起点,最后一个元素靠终点,余下元素平均分配空间
space-around每个元素两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍
space-evenly元素间距离平均分配

弹性元素

放在容器盒子中的元素即为容器元素。

  1. 不能使用float与clear规则
  2. 弹性元素均为块元素
  3. 绝对定位的弹性元素不参与弹性布局

align-self

用于控制单个元素在交叉轴上的排列方式,align-items 用于控制容器中所有元素的排列,而 align-self 用于控制一个弹性元素的交叉轴排列。

选项说明
stretch将空间平均分配给元素
flex-start元素紧靠主轴起点
flex-end元素紧靠主轴终点
center元素从弹性容器中心开始

flex-grow

用于将弹性盒子的可用空间,分配给弹性元素。可以使用整数或小数声明。

弹性元素设置了1、3、6 ,即宽度分成10等份,第三个元素所占宽度为(宽度/(1+3+6)) * 6。

flex-shrink

与flex-grow相反flex-shrink是在弹性盒子装不下元素时定义的缩小值。

缩小比例 = 不足的空间 / (元素 1 宽度 x 缩小比例) + (元素 2 宽度 x 缩小比例) ...
最终尺寸 = 元素三宽度 - (缩小比例 x  元素 3 的宽度) X 元素宽度

flex-basis

flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。

可以是长度单位,也可以是百分比。flex-basis的优先级高于width、height属性。

  1. flex-basis优先级大于width、height。

  2. flex是flex-grow、flex-shrink 、flex-basis缩写组合。

flex: 1 0 100px;

建议使用flex面不要单独使用flex-grow/flew-shrink/ flex-basis。

order

用于控制弹性元素的位置,默认为order:0数值越小越在前面,可以负数或整数。

贡献者: mankueng