CSS:Flex弹性布局的空间是如何分配的?

110 阅读2分钟

1. 什么是Flexbox

  • 现代CSS布局模型
  • 一维布局解决方案
  • 容器与项目的概念

2. Flex容器属性

.container {
  display: flex; /* 启用Flex布局 */
  flex-direction: row; /* 主轴方向 */
}

如果不使用flex-direction属性,则默认为flex-direction: row

3. Flex项目属性

.item {
  flex: 1 2 500px; /* flex-grow | flex-shrink | flex-basis */
}
  1. flex-grow : 1
  • 定义项目的放大比例
  • 当容器有剩余空间时,该项目将获得1份剩余空间
  1. flex-shrink : 2
  • 定义项目的缩小比例
  • 当空间不足时,该项目将以2倍于其他项目的比例收缩
  1. flex-basis : 500px
  • 定义项目在分配多余空间之前的初始大小
  • 这里设置为500像素

Flex如何计算分配的空间

若有剩余空间可以分配

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    * { 
        padding: 0;
        margin: 0;
    }
    .container {
        width: 600px;
        height: 300px;
        display: flex;
    }
    .left {
        flex: 1 2 300px;
        background-color: red;
    }
    .right {
        flex: 2 1 200px;
        background-color: blue;
    }

</style>
<body>
    <div class="container">
        <!-- FFC 弹性格式化上下文 -->

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


    </div>
</body>
</html>

比如上面代码中的例子,计算left和right的width所占据的空间为多少?

首先left和right初始分别由300px和200px,而实际总空间由600px,故剩下600 - 300 - 200 = 100px的空间可以进行分配。因为是有多余的空间进行分配,所以应该看flex-grow这一属性,可以看到left的为1,right的为2。 故left分配1 / (1 + 2) = 1/3,right分配 2 / (1 + 2) = 2/3。 最后空间为left = 1/3 * 100 + 300, right = 2/3 * 100 + 200.

若空间溢出,要进行空间收缩时

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Flex 弹性布局</title>
    <style>
        * {
            padding: 0;
            margin: 0;

        }
        .container {
            display: flex;
            width: 600px;
            height: 300px;
        }
        .left {
            flex: 1 2 500px;
            background-color: red;
        }
        .right {
            flex: 2 1 400px;
            background-color: blue;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="left"></div>
        <div class="right"></div>
    </div>
</body>
</html>

可以看到这时总空间container的width只有600px,而left和right的初始空间之和为500px + 400px = 900px。

可以发现溢出了900 - 600 = 300px,因为是空间要收缩,所以要看flex-shrink属性,可以看到left和right的flex-shrink属性分别为2 , 1。

所以得先计算总的权重=left-shrink * left-basis + right-shrink * right-basis = 2 * 500 + 1 * 400 = 1400。

然后分别计算要收缩的空间

left: left-shrink * left-basis / 总权重 = 2 * 500 / 1400

right: right-shrink * right-basis / 总权重 = 1 * 400 / 1400

最后用它们的初始空间减去要收缩的空间,即是它们最终的空间大小。

left: 500 - (2 * 500 / 1400)

right: 400 - (1 * 400 / 1400)