css面试题:flex的三个属性,如何通过它们的值计算其内部弹性容器的所占空间

94 阅读2分钟

以下是一段简单的flex布局代码

<style>
    * {
      padding: 0;
      margin: 0;
    }

    .container {
      width: 600px;
      height: 300px;
      display: flex;
    }

    .left {
      flex: 1 2 300px;
      background: red;
    }

    .right {
      flex: 2 1 200px;
      background: blue;
    }
  </style>
</head>

<body>
  <div class="container">
    <div class="left"></div>
    <div class="right"></div>
  </div>
</body>

如上代码显示:'父盒子container'弹性容器内部放了两个'子盒子' 此时默认主轴为x轴,flex影响水平布局
其中左边'子盒子'中的css样式为flex: 1 2 300px 右边的为flex: 2 1 200px;
flex中的从左到右的值分别是:flex-grow属性的值、flex-shrink属性的值、flex-basis属性的值
我们先说flex-basis属性:该属性的默认值是 auto,浏览器会检测这个元素是否具有确定的尺寸,上边代码分别给左右给了一个固定的值。浏览器会先把这个固定值的大小给对应的子盒子。这个值若大于父盒子的高或宽,子盒子会撑出去,不会影响父盒子的大小。
flex-shrink属性的值表示是否伸缩且对应的伸缩比。
flex-grow属性的值表示占剩余可用空间的所占比
整体分析,首先父盒子的宽为600px,左flex-basis值为300px固定,右flex-basis为200px固定。则flex-grow剩余可用空间的大小为100px,左的 flex-grow值为1,右flex-grow值为2.把剩余可用空间分成了3份,则左盒子的宽为(300+1100/3)px右盒子为(200+2100/3)px

下面我们修改一下css样式

   .container {
      width: 600px;
      height: 300px;
      display: flex;
    }

    .left {
      flex: 1 2 500px;
      background: red;
    }

    .right {
      flex: 2 1 400px;
      background: blue;
    }

上边代码我们修改了第三个值(即flex-basis固定值)。此时左flex-basis值为500px固定,右flex-basis为400px固定。子元盒子宽度总和为900px>600px 超出的宽度大小为300px。子盒子应该溢出父盒子.但第二个值都为非0整数,表示都伸缩,这里应为是超出父盒子的宽所以应该缩。
那左盒子的宽度如何计算呢,left的宽应 = 500 - 300*(5002/ (5002 + 4001))
右边盒子的宽度应=400-300
(4001/(5002+400*1))