CSS Flex 布局

383 阅读5分钟

Flex Box

  • Flex Box即弹性布局

  • Flex 布局包含了一套新的属性集,包括**容器属性item属性**

  • display: flex

    • 在没有设置容器宽度时,默认情况下占一整行宽度,高度根据所有item自适应。
    .cusContainer {
      display: flex; 
    }
    
  • display: inline-flex

    • 在没有设置容器宽高时,容器根据所有item内容的宽高自适应容器的宽度。
    .cusContainer {
     
      display: inline-flex; 
    }
    

一、flex-direction(容器属性)

设置容器内 item 排列方向

row(默认值)

  • 容器内item沿主轴从左到右排列

row-reverse

  • 容器内item沿主轴从右到左排列

column

  • 容器内item沿主轴从上到下排列

column-reverse

  • 容器内item沿主轴从下到上排列

二、flex-wrap(容器属性)

设置容器内是否允许多行item排列,及多行item排列时换行方向

nowrap(默认值)

  • 不换行。容器内item仅有单行,如果单行内容过多则溢出容器。

wrap

  • 容器单行容不下所有item时,换行排列

wrap-reverse

  • 容器单行容不下所有item时,换行排列
  • 换行方向为wrap时的反方向

三、justify-content(容器属性)

容器内item沿主轴方向的对齐方式

flex-start(默认值)

  • 容器内item在主轴起点紧挨在一起,item间不留空隙;

flex-end

  • 容器内item在主轴终点紧挨在一起,item间不留空隙;

center

  • 容器内item在主轴上居中紧挨在一起,item间不留空隙

space-between

  • 容器内item在主轴方向上间距相等,第一个和最后一个item离主轴距离为0

space-around

  • 容器内item在主轴方向上间距相等,第一个和最后一个item离主轴距离为item间距一半

space-evenly

  • 容器内item在主轴方向上间距相等,第一个和最后一个item离主轴距离和item间距相等

四、align-content(容器属性)

多行排列时,容器内item沿交叉轴方向的对齐方式

stretch(默认值)

  • 当容器内item未设置尺寸,将item拉伸至填满交叉轴
  • 当设置了item尺寸时,设置过的width或height不受该属性影响。

flex-start

  • 容器内item在交叉轴起点紧挨在一起,item间不留空隙;

flex-end

  • 容器内item在交叉轴终点紧挨在一起,item间不留空隙;

center

  • 容器内item在交叉轴上居中紧挨在一起,item间不留空隙

space-between

  • 容器内item在交叉轴方向上间距相等,首行和尾行item离交叉轴距离为0

space-around

  • 容器内item在交叉轴方向上间距相等,首行和尾行item离交叉轴距离为item间距一半

space-evenly

  • 容器内item在交叉轴方向上间距相等,首行和尾行item离交叉轴距离和item间距相等

五、align-items(容器属性)

容器内item沿交叉轴方向的对齐方式

align-items一般用于一行,
align-content一般用于多行,针对单行无效,
两个属性值很相似。

stretch(默认值)

  • 当容器内item未设置尺寸,将item拉伸至填满交叉轴
  • 当设置了item尺寸时,设置过的width或height不受该属性影响。

flex-start

  • 容器内item在交叉轴起点紧挨在一起,item间不留空隙;

flex-end

  • 容器内item在交叉轴终点紧挨在一起,item间不留空隙;

center

  • 容器内item在交叉轴上居中紧挨在一起,item间不留空隙

baseline

  • 容器内以item中的第一行文字的基线对齐;

六、order(item属性)

设置item沿主轴方向的排列顺序,order的值为整数,值越小,排列越靠前。

7. flex-shrink(item属性)

设置item沿主轴方向的收缩因子,flex-shrink是默认值为1非负数 尽量让所有item收缩因子相加大于1

例如:
容器width为400px,item宽度如下:
item1 = 120px; item2 = 150px; item3 = 180px;
所有item宽度相加比容器大50px,需要压缩每个item的大小,具体计算方法如下:

1. 总溢出空间 = 50;

2. 计算总权重(各个item的(width * 收缩因子)相加)
总权重 = 120 * 2 + 150 * 3+ 180 * 1 = 870;

3. item压缩大小 = 总溢出空间 * item width * flex-shrink / 总权重;

item1的最终宽度为:120 - 50 * 120 * 2 / 870 ≈ 106px
item2的最终宽度为:150 - 50 * 150 * 3 / 870 ≈ 124px
item3的最终宽度为:180 - 50 * 180 * 1 / 870 ≈ 169px

8. flex-grow(item属性)

设置item沿主轴方向的扩张因子,flex-grow是默认值为0非负数 尽量让所有item扩张因子相加大于1

例如:
容器width400px,item宽度如下:
item1 = 80px; item2 = 120px; item3 = 140px;
所有item宽度相加比容器小60px,需要扩张每个item的大小,具体计算方法如下:

1. 总剩余空间 = 60;

2. 计算权重(总剩余空间/(所有item扩张因子相加))
权重 = 60 / (3 + 1 + 0) = 153. 
item1的最终宽度为:80+ (15 * 3) = 125
item2的最终宽度为:120 + (15 * 1) = 135
item3的最终宽度为:140 + (15 * 0) =140

9. flex-basis(item属性)

设置item宽高

  • flex-directionrow或row-reverse,如果flex-basis和width同时存在,flex-basis优先级高于width(即代替width

  • flex-directioncolumn或column-reverse,如果flex-basis和height同时存在,flex-basis优先级高于height(即代替height

  • 默认值:auto, 单位:<number>px

10. flex(item属性)

flexflex-growflex-shrinkflex-basis的简写

  • 默认值为none,等价于0 0 auto
  • auto等价于 1 1 auto

11. align-self(item属性)

用于覆盖容器的align-items,表示沿交叉轴方向的对齐方式

  • 默认值为auto,继承容器的align-items值。