美文网首页
flex布局--flex-grow、flex-shrink、fl

flex布局--flex-grow、flex-shrink、fl

作者: 手指乐 | 来源:发表于2019-10-21 15:36 被阅读0次
  • flex-grow
    flex-grow 只有在 flex 容器中有剩余空间时才会生效。flex 项的 flex-grow 属性指定该 flex 项相对于其他 flex 项将拉伸多少,以填充 flex 容器。默认值为1。当设置为 0 时,该 flex 项将不会被拉伸去填补剩余空间。在这个例子中,两个项的比例是 1:2,意思是在被拉伸时,第一个 flex 项将占用剩余空间的 1/3,而第二个 flex 项将占据剩余空间的2/3。(如果item不定义flex-grow,也不定义宽度,则item宽度由内容决定)
<!DOCTYPE html>
<html lang="en">


<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<style>
    .flex-container {
        display: flex;
        width: 180px;
        padding: 10px;
        background-color: #F0f0f0;
    }
    
    .flex-item1 {
        flex-grow: 0;
    }
    
    .flex-item2 {
        flex-grow: 1;
    }
    
    .flex-item3 {
        flex-grow: 2;
    }
    
    .flex-container .flex-item {
        padding: 20px 0;
        text-align: center;
        width: 30px;
        background-color: #B1FF84;
    }
    
    .flex-container .flex-item:first-child {
        background-color: #F5DE25;
    }
    
    .flex-container .flex-item:last-child {
        background-color: #90D9F7;
    }
</style>



<body>
    <div class="flex-container">
        <div class="flex-item flex-item1">1</div>
        <div class="flex-item flex-item2">2</div>
        <div class="flex-item flex-item3">3</div>
    </div>
    </div>
</body>



</html>

上例中,item的宽度即使不定义,item2和item3也会拉升,item1宽度由内容决定

  • flex-basis
    flex-basis属性定义了项目占据的主轴空间。浏览器根据这个属性,计算主轴多余空间或不足空间的大小。它的默认值为auto,即项目的本来大小
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>flesbox</title>

    <style>
        .wrapper {
            display: flex;
            flex-flow: row wrap;
            font-weight: bold;
            text-align: center;
            background-color: red;
        }
        
        .item {
            background-color: pink;
            margin: 10px;
        }
        
        body {
            padding: 2em;
        }
    </style>
</head>

<body>
    <div class="wrapper">
        <div class="item item1">item1</div>
        <div class="item item2">item1</div>
    </div>
</body>

</html>

容器宽度默认充满父元素
flex-grow默认是0(不会拉升填充剩余空间),这样每个item的默认宽度是由内容决定
效果图如下:



设置item的宽度,让其超过容器,由于设置了flex-flow: row wrap;这时候会换行

 .item {
            background-color: pink;
            margin: 10px;
            width: 80%;
        }

如果同时设置了width和flex-basis,以flex-basis为准

  .item {
            background-color: pink;
            margin: 10px;
            width: 80%;
            flex-basis: 100px;
        }

相当于:

  .item {
            background-color: pink;
            margin: 10px;
            width: 100px;
        }

如果flex-basis设置为auto,则item的宽度取width的值

  .item {
            background-color: pink;
            margin: 10px;
            width: 80%;
            flex-basis: auto;
        }

 .item {
            background-color: pink;
            margin: 10px;
            width: 80%;
        }

是一个意思

max-width/min-width不会因为flex-basis失效

  .item {
            background-color: pink;
            margin: 10px;
            flex-basis: 800px;
            max-width: 100px;
        }

item的宽度不会大于100px

  • flex-shrink
    任何情况下,item都会被container包裹,不会超过,如果container空间不够,item会自动压缩
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<style>
    .flex-container {
        display: flex;
        width: 50px;
    }
    /* 以下为辅助样式 */
    
    .flex-container {
        background-color: #F0f0f0;
    }
    
    .flex-container .flex-item {
        width: 50px;
        text-align: center;
        background-color: #B1FF84;
    }
    
    .flex-container .flex-item:first-child {
        background-color: #F5DE25;
    }
    
    .flex-container .flex-item:last-child {
        background-color: #90D9F7;
    }
</style>

<body>
    <div class="flex-container">
        <div class="flex-item">1</div>
        <div class="flex-item">2</div>
    </div>
</body>

</html>

上例中item的宽度会缩小到25px
之所以会自动压缩,是因为flex-shrink的默认值是1,容器宽度不够容纳所有item时,flex-shrink规定了item缩短的比例,默认是平均缩短

  • flex-grow、flex-shrink都是优先保证其定义的宽度,有剩余或不够时,把剩余或不够的部分按指定的比例分配
    比如这个
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        #box {
            width: 100%;
            height: 100px;
            display: flex;
            margin: 10px;
        }
        
        #left,
        #right {
            flex-basis: 400px;/* 或width:200px */
            height: 100px;
            margin: 10px;
            background-color: #999;
        }
        
        #center {
            flex-grow: 1;
            height: 100px;
            margin: 10px;
            background-color: #f00;
        }
    </style>
</head>

<body>
    <div id="box">
        <div id="left">left</div>
        <div id="center">center</div>
        <div id="right">right</div>
    </div>
</body>

</html>

缩小时,开始左右两侧div固定为400px,逐渐压缩中间的div,中间的div只够容纳其内容,无法再压缩时,再压缩左右两侧div
拉升时,左右两侧从小于400px逐渐拉升到400px后保持400px ,再拉升则剩余的空间都加到中间div上
可以把box的min-width限定为1000px,以使其足够容纳左右各400px的固定长度,这样左右两个div长度就不会变化了,浏览器缩小到不够显示时会出现滚动条

#box {
            min-width: 1000px;
            height: 100px;
            display: flex;
            margin: 10px;
        }
  • flex 是 flex-grow、flex-shrink、flex-basis的缩写,
    flex-grow默认值是0,flex-shrink默认值是1,flex-basis是auto(item宽度)
    所以flex 的默认值是 0 1 auto

相关文章

网友评论

      本文标题:flex布局--flex-grow、flex-shrink、fl

      本文链接:https://www.haomeiwen.com/subject/ygmtvctx.html