flex:1 是什么?

首先 flex: 1; 等同于 flex: 1 1 0;

flex: 1 实际上是三个属性的缩写:flex-grow: 1; flex-shrink: 1 flex-basis: auto;

flex-grow的作用

 flex-grow 的作用是表示在当前元素占多少份的意思。

演示一段代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .content {
            width: 500px;
            display: flex; 
        }
        .box-1 {
            background: aqua;
            flex-grow: 1;
        }
        .box-2 {
            background: pink;
            flex-grow: 1;
        }
    </style>
</head>
<body>
    <div class="content">
        <div class="box-1">box-1</div>
        <div class="box-2">box-2</div>
    </div>
</body>
</html>

示例图: 

这样表示2个子元素各占1份,填充满整个flex的内容

flex-basis的作用

 代码演示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .content {
            width: 500px;
            display: flex; 
        }
        .box-1 {
            background: aqua;
            flex-basis: 10%;
        }
        .box-2 {
            background: pink;
            flex-basis: 100px;
        }
    </style>
</head>
<body>
    <div class="content">
        <div class="box-1">box-1</div>
        <div class="box-2">box-2</div>
    </div>
</body>
</html>

示例图:

这边没有设置flex-grow所以默认是flex-grow: 0;

flex-basis表示 flex中的剩余空间的大小。

那么box-1就是占总总宽度(500px)的10%,box-2则占总宽度(500px)的100px;

flex-grow 与 flex-basis 其实类似,区别在于,flex-grow 会填充满整个flex内容,而flex-basis不会通常满整个内容。

flex-shrink的作用

 代码演示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .content {
            width: 500px;
            display: flex; 
        }
        .box-1 {
            background: aqua;
            width: 400px;
            flex-shrink: 1;
        }
        .box-2 {
            background: pink;
            width: 200px;
            flex-shrink: 2;
        }
    </style>
</head>
<body>
    <div class="content">
        <div class="box-1">box-1</div>
        <div class="box-2">box-2</div>
    </div>
</body>
</html>

这边设置flex下2个子元素的宽度分别是 400px 和 300px,可以明显的看出已经超出父元素设置的500px。

那么这是flex-shrink就会起到作用,它会根据flex-shrink设置的值进行收缩。

如果flex-shrink设置为0表示当前元素不会进行收缩,flex-shrink的默认值为1;

 flex-shrink的收缩公示(以这个为例):

子元素超出的宽度 * flex-shrink的值 * 子元素宽度 / 总值;

总值的获取(以当前代码为例):1(box-1的flex-shrink值) * 400(box-1的宽度) + 2(box-2的flex-shrink值) * 300(box-2的宽度) = 1000;

以当前代码为例计算:

 子元素超出的值:500 - (400 + 300) = 200;

总值:1 * 400 + 2 * 300 = 1000;

.box-1收缩的宽度:200 * 1 * 400 / 1000 = 80;

.box-2收缩的宽度:200 * 2 * 300 / 1000 = 120;

实际看效果图

 flex下的子元素确实是按照计算出来的宽度进行收缩了。

那么回归正题,flex:1 等于 flex:1 1 0 就很好理解了,默认情况下 flex 等于 flex 0 1 auto。

实际动手敲一遍代码看看效果会发现其实很好理解😆

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐