Flex是Flexible Box的缩写,意为“弹性布局”,用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为Flex布局。

    先说非常非常基础的东西,在使用Flex布局时要先定义该盒子为Flex布局,有两种表现方式:

第一种(直接在div上设置样式)

<div style="display:flex;margin: auto;width:400px;height:6rem;border: 0.1rem solid black">
        <div style="flex: 3 0 200px;background: rgb(211, 118, 209)">我是aa</div>
        <div style="flex: 2 0 100px;background: rgb(13, 189, 89)">我是bb</div>
</div>

第二种(不在div上设置样式,而是将样式提出单独整理在style中)

<template>内容

<div class="container">
      <div class="aa">我是aa</div>
      <div class="bb">我是bb</div>
  </div>

<style>内容

.container{
display:flex; /* 表示这个盒子使用Flex弹性布局 */
margin: auto; /* 表示使这个盒子在页面上垂直居中*/
width: 400px;
height: 6rem;
border: 0.1rem solid black;
}
.aa{
flex: 3 0 200px;
background: rgb(211, 118, 209);
}
.bb{
flex: 2 0 100px;
background: rgb(13, 189, 89);
}

效果图如下:

Flex的三个属性值

其实flex是flex-grow, flex-shrinkflex-basis的简写,默认值为0 1 auto,后面的两个属性可以省略不写。在需要同时使用这3个属性时,可以使用简写直接赋值即可,如aa盒子的flex:3  0  200px;其中3,0,200px分别代表flex-grow,flex-shrink,flex-basis。

flex属性的两个快捷值:

①flex:auto;与flex:1 1 auto;等价

②flex:none;与与flex:0 0 auto;等价

3个属性的释义

①flex-grow:设置弹性盒子的伸展占宽/比例。默认为0,即不会进行放大。

②flex-shrink:设置弹性盒子的缩小占宽/比例。默认为1

③flex-basis:设置弹性盒子的伸缩值。默认为auto

(1)flex-grow

当flex属性的取值为一个非负的数字,则将该数字默认为flex-grow值。默认flex-shrink取值为1,flex-basis取值为0%。如下,3个css样式是相同的。

.aa{
flex: 1;
}
.aa{
flex: 1 1 0%;
}
.aa{
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0%;
}

当flex取值为两个非负数字,则分别默认为flex-grow和flex-shrink的值。flex-basis默认取 0%。如下,2个样式是相同的。

.aa{
flex: 1 2;
}
.aa{
flex-grow: 1;
flex-shrink: 2;
flex-basis: 0%;
}

当flex取值为一个非负数字和一个百分比或者长度(数值+单位px/rem等),则分别默认为flex-grow和flex-basis的值。flex-shrink值默认为 1。如下,2个样式是相同的。

.aa{
flex: 1 50%;
}
.aa{
flex-grow: 1;
flex-shrink: 1;
flex-basis: 50%;
}

 例1:代码和效果图如下:

<template>
  <div class="container">
    <div class="aa">我是盒子aa</div>
    <div class="bb">我是盒子bb</div>
  </div>
</template>

<style>
.container {
  display: flex; /* 表示这个盒子使用Flex弹性布局 */
  margin: auto; /* 表示使这个盒子在页面上垂直居中*/
  width: 400px;
  height: 6rem;
  border: 0.1rem solid black; 
  background: rgb(169, 166, 166);
}
.aa {
  width: 100px;
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: auto;
  background: rgb(247, 160, 174);
}
.bb {
  width: 100px;
  flex:3 1 50px;
  background: rgb(163, 160, 247);
}
</style>

container是整个大盒子,width为400px,填充颜色为灰色。

盒子 aa:width为100px,flex-grow的值为1,表示盒子aa占宽1份,故盒子aa的总width为:100px +(250/4)*1  = 162.5px。

盒子bb:width为237.5px,flex:3 1 50px;  其中3表示盒子bb占宽3份,故盒子bb的总width为:50px +(250/4)*3  = 237.5px。(PS:盒子aa的width是100px,但其真正的width取值由flex-basis的属性值决定,故为50px)

总占宽是大盒子未被占用的灰色部分为250px,被分成了1+3=4份,每份占宽为62.5px。

flex-grow起作用的前提是还存在供盒子可扩展的剩余空间,若将例1中的盒子bb的样式代码flex:3 1 50px;改为flex:3 1 300px;  此时盒子aa + 盒子bb的width为400px,已经将大盒子占满,flex-grow不再起作用,更改部分的代码和效果图如下:

 /* 盒子bb被更改的代码 */
  flex:3 1 300px;

(2)flex-shrink

flex-shrink的属性值可取非负整数、initial、inherit。

例2:当例1中的两个盒子的总width  >  大盒子的width,就需要flex-shrink来对两个小盒子进行压缩了。当盒子aa、盒子bb的flex-shrink值都为1时,两盒子总width超过大盒子时,则两个盒子会进行相同比例的压缩。在例1代码的基础上对盒子aa、bb的样式代码进行更改,盒子aa、bb的样式代码和效果图如下:

.aa {
  width: 200px;
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 200px;
  background: rgb(247, 160, 174);
}
.bb {
  width: 200px;
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 400px; /* 这里的400px才是盒子bb的真正width*/
  background: rgb(163, 160, 247);
}

总witdh=200+400=600px,大盒子width=400px,故大盒子要缩小的比例为400/600=2/3。

盒子aa的width应缩小为200 * 2/3 = 133.33px;

盒子bb的width应缩小为400 * 2/3 = 266.67px;

如果设置盒子aa的flex-shrink:0,则在空间不足的情况下,盒子aa也不会进行缩小,更改例2中盒子aa的部分代码和效果图如下:

 /* 盒子aa被更改的代码 */
  flex-shrink: 0;

盒子aa并没有被缩小,其width仍为200px,盒子bb被缩小,其with为未被盒子aa占的空间:400-200=200px。

(3)flex-basis

当flex的取值为一个长度(数值+单位px/rem等)或百分比,则默认为flex-basis值 。且默认flex-grow、flex-shrink的值都为 1。如下,2个样式是相同的。

.aa{
  flex: 200px;
}
.aa{
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 200px;
}

一个盒子的真正尺寸=flex-basis属性值+flex-grow属性值。

若flex-basis:auto;  则flex-basis的取值会默认为该盒子本身的尺寸,若该盒子本身未设置尺寸,则该盒子在页面上显示的宽度为flex-grow: 1;取得的占宽,即25px。

若flex-basis:0%;  即flex-basis的取值为0px,该盒子在页面上显示的宽度为flex-grow: 1;取得的占宽,即25px。

以上两种情况若该盒子flex-grow: 0;  则该盒子在页面上就不会显示。

例3:当flex-basis:auto;  flex-basis的取值会默认为该盒子的尺寸。将例1中的盒子aa、bb的部分样式代码进行更改,更改部分的代码和效果图如下:

/* 盒子aa被更改代码 */
  flex-grow: 0;

/* 盒子bb被更改代码 */
  flex:0 1 200px;

aa盒子的width为100px,flex-basis的值为auto,故flex-basis的取值为该盒子本身的尺寸100px,即该盒子的真正width。

bb盒子的width为100px,flex-basis的值为200px,则该盒子的真正width为flex-basis的取值,即200px。

灰色部分为大盒子剩余未被占用的空间,width为250px。

扩展:将例1中盒子bb的样式flex:0 1 200px;  改为flex:0 1 50px;   则该盒子的尺寸会变为50px,大盒子未占用的灰色部分尺寸为250px。效果图如下:

例4:若flex-basis的值为百分比,则该盒子的尺寸=祖先盒子*百分比,祖先盒子为声明了display:flex;的盒子,这里是大盒子container。将例1的样式代码进行更改,更改部分的代码和效果图如下:

 /* 盒子aa被更改代码 */
  flex-grow: 0;

/* 盒子bb被更改代码 */
  flex:0 1 60%;

盒子aa的width为100px,不做过多解释。

盒子bb的witdh为400*60%=240px。

若一个盒子没有父盒子的话,则它的flex-basis属性值为百分比时不起作用。

总结

①在width、flex-basis同时存在的情况下,flex-basis > width,width无作用。

②在不具备空间可用于盒子占宽/扩展的情况下,flex-grow无作用。

③盒子的真实尺寸为flex-basis属性值+flex-grow属性值。

④当盒子的flex-shrink属性值为0时,该盒子不会进行缩小。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐