细说一下flex:1隐藏的意思

2,127 阅读3分钟

flex:1简述:

当我们使用display: flex;布局时设置 flex: 1 实际上包含了三个属性的默认值:

flex-grow: 1;
flex-shrink: 1 ;
flex-basis: 0%;

  • flex-grow:是用来增大子盒子的,比如,当父盒子的宽度大于子盒子的宽度,父盒子的剩余空间可以利用flex-grow来设置子盒子增大的占比
  • flex-shrink:用于设置当子盒子超过父盒子的宽度后,超出部分进行缩小的取值比例
  • flex-basis:是用来设置盒子的基准宽度(表示 flex中的剩余空间的大小),并且basiswidth同时存在basis会把width干掉

所以flex:1;的逻辑就是用flex-basiswidth干掉,然后再用flex-growflex-shrink增大的增大缩小的缩小,达成最终的效果。

下面分别上代码示例:

(1) flex-grow:1 (剩余空间按比例增大)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      width: 500px;
      height: 100px;
      background-color: hotpink;
      display: flex;
    }
 
    .box div {
      width: 100px;
    }
 
    .box div:nth-child(1) {
      flex-grow: 1;
    }
 
    .box div:nth-child(2) {
      flex-grow: 3;
    }
 
 
  </style>
</head>
<body>
  <div class="box">
    <div>盒子1</div>
    <div>盒子2</div>
  </div>
</body>
</html>

image.png

父盒子剩余空间的300

  • 第一个盒子 flex-grow: 1; 第一个盒子扩大1/4,100+75 = 175
  • 第二个盒子 flex-grow: 3; 第二个盒子扩大3/4,100+225= 325

(2) flex-shrink:1 (空间不足按比例缩小)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      width: 500px;
      height: 100px;
      background-color: hotpink;
      display: flex;
    }
 
    .box div {
      width: 300px;
    }
 
    .box div:nth-child(1) {
      flex-shrink: 1;
    }
 
    .box div:nth-child(2) {
      flex-shrink: 3;
    }
 
  </style>
</head>
<body>
  <div class="box">
    <div>子盒子1</div>
    <div>子盒子2</div>
  </div>
</body>
</html>

image.png

父盒子的宽度为500,有两个子300的盒子,那么就超出了100

  • 第一个盒子flex-shrink: 1:即1/4 * 100 = 25 最终第一个盒子300-25= 275
  • 第二个盒子flex-shrink: 3:即3/4 * 100 = 75 最终第二个盒子300-75 = 225

(3) flex-basis:0% (设置盒子的初始宽度)

简述:上述两种方式用于分配多余空间,flex-basis即用于定义了在分配多余空间之前,弹性元素在主轴方向上所占的初始大小。这个初始大小可以是具体的像素值、百分比或者是关键词 auto

注意:flex-basis:0%意味着在分配额外空间之前,元素不占用任何固定的空间,完全依赖于 flex-grow 来分配空间

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      width: 500px;
      height: 100px;
      background-color: hotpink;
      display: flex;
    }
 
    .box div {
      width: 200px;
    }
 
    .box div:nth-child(1) {
      flex-basis: 150px;
    }
 
    .box div:nth-child(2) {
      flex-basis: 200px;
    }
 
  </style>
</head>
<body>
  <div class="box">
    <div>盒子1</div>
    <div>盒子2</div>
  </div>
</body>
</html>

image.png

如上述代码示例,div1flex-basis设置为150px,意思是开始分配额外空间之前,div1 初始大小 150px 的宽度; 如果此时再设置 flex-shrink 的值进行缩小或者flex-grow 的值进行扩大,会在初始值的基础上进行扩大缩小。

小结:

其实工作中用到这个东西的情况比较少,但需要用到的时候脑子里知道有这个东西才是正道,如果有那里写的不对,欢迎大佬指点。