深入理解 flex-basic

一直对flex布局的flex-basic理解不够透测,今天准备通过实际的例子,加深对这个属性的理解

flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。详细定义可以查看flex-basis

详细解析以下属性值

  • number: 一个长度单位或者一个百分比,规定 flex 元素的初始长度。
  • auto: 默认值。长度等于 flex 元素的长度。如果该项目未指定长度,则长度将根据内容决定。

今天举例说明以下几个具体的使用场景,方便理解:

场景一: flex-basis为初始大小,具体是最大值还是最小值,根据flex-grow和 flex-shrink的值来定的。以下代码列举了2种场景。

<!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>
        #main {
            height: 100px;
            border: 1px solid #c3c3c3;
            display: flex;
        }
        /* 表现为:可以一直同比例缩小,但是不能发大,最大值为flex-basis设置的值 */
        #main div {
            flex-grow: 0;
            flex-shrink: 1;
            flex-basis: 150px;
        }
        /* 表现为:可以一直同比例放大,但是不能缩小,最小值为flex-basis设置的值 */
        /* #main div {
            flex-grow: 1;
            flex-shrink: 0;
            flex-basis: 150px;
        } */
    </style>
</head>
<body>
    <div id="main">
        <div style="background-color:coral;">1</div>
        <div style="background-color:lightblue;">2</div>
        <div style="background-color:khaki;">3</div>
        <div style="background-color:pink;">4</div> 
        <div style="background-color:lightgrey;">5</div>
    </div>
</body>
</html>

flex-shrink: 1可以等比例缩小
最大为flex-basis设置的值

由于篇幅原因,只列举css样式,html同上
场景二: 如果flex-grow和flex-shrink都设置为1,表示同比例放大和缩小。flex-basis: auto效果等同于auto(长度等于此元素的长度。如果该元素未指定长度,则长度将根据内容决定。)通过css3选择器,设置第二个元素的初始宽短是100px,按照正常的理解,不管怎么缩放,第二个元素应该总比其他元素多100px的宽,但是通过实际的测试,发现事实不是这样的:

       #main {
            height: 100px;
            border: 1px solid #c3c3c3;
            display: flex;
        }
        #main div {
            flex-grow: 1;
            flex-shrink: 1;
            flex-basis: auto;
        }
        #main div:nth-of-type(2) {
            flex-basis: 100px;
        }


但是如果都给一个初始值,效果就是我们期望的了

#main div {
           flex-grow: 1;
           flex-shrink: 1;
           //统一给一个初始值,第二个元素跟其他元素相差80px整
           flex-basis: 20px;
       }
       #main div:nth-of-type(2) {
           flex-basis: 100px;
       }


场景三: 我们都知道如果设置了flex-basis:auto后,如果该元素未指定长度,则长度将根据内容决定。下面的代码表明其他元素的初始宽度是100px,然后第二个元素的初始宽度是父元素的0%。当一个元素同时设置了width和flex-basis,此时flex-basis的优先级更高。

       #main div {
            width: 100px;
            flex-grow: 1;
            flex-shrink: 1;
            flex-basis: auto;
        }
        #main div:nth-of-type(2) {
            flex-basis: 0%;
        }

通过以上的代码演示,我们总结一下(前提都是flex布局):

flex-basis指定了 flex 元素在主轴方向上的初始大小,包含了几种情况:

  • flex-basis有值的情况下,具体是最大值还是最小值,根据flex-grow和 flex-shrink的值来定的。
  • 某一个元素的flex-basis值跟其他兄弟元素相比更大或更小时,表现在缩放上,他们的最终大小也是等于他们的相差数。
  • 当一个元素同时设置了width和flex-basis,此时flex-basis的优先级更高,以flex-basis为准。

注意:flex-basis指明的是主轴方向的初始大小,当flex-direction: column时,flex-basis代表的是height;当flex-direction:row时,flex-basis代表的是width

posted @ 2021-08-10 16:16  eastsae  阅读(3163)  评论(0编辑  收藏  举报