css3的flex: flex-grow flex-shrink flex-basis详细用法

flex:可以同时添加三个属性值,分别为 flex-grow flex-shrink flex-basis,那他们分别是啥意思,拆分开来如何使用呢?这里来给大家详细的介绍!
flex-grow
设置弹性盒的扩展比率,如果给它们共同设置一个该属性的话,它代表按等比例平分子级所占宽度之外的剩余空间,它的默认值为1,也就是flex-grow:1;代表的是按照1:1:1来平分剩余空间。
如代码:

	<div class="wrapper">
        <div class="content">1</div>
        <div class="content">2</div>
        <div class="content">3</div>
    </div>
	<style>
        .wrapper {
            height: 300px;
            width: 600px;
            border: 1px solid black;
            display: flex;
            flex-wrap: nowrap;
        }
        .content {
            height: 100px;
            width: 100px;
            border: 1px solid #f00;
            flex-grow: 1;
        }
    </style>

在这里插入图片描述
蓝色区域就是他们的相对于wrapper的宽度所剩余的部分,此区域宽度为600-100*3=300
三个子div将按照1:1:1的比例划分空余的300px,以至于每人分得100px,最后他们的宽度将撑开到200px,wrapper宽度被子div填满,最后子div高度也按它的等比例撑开。
如果此属性在子div身上,如:

<style>
        .wrapper {
            height: 300px;
            width: 500px;
            border: 1px solid black;
            display: flex;
            flex-wrap: nowrap;
        }
        .content {
        	height: 100px;
            width: 100px;
            border: 1px solid #f00;
        }
        .content:nth-of-type(1) {
            flex-grow: 1;
        }
        .content:nth-of-type(2) {
            flex-grow: 2;
        }.content:nth-of-type(3) {
            flex-grow: 3;
        }
    </style>

它们将按照 1:2:3的比例来划分空余部分,也就是第一个div宽度为100+300/61=150px
第二个div宽度为100+300/6
2=200px,第三个div宽度为100+300/6*3=250px。

flex-shrink
设置弹性盒的收缩比率,子div宽度之和大于父级盒子宽度时,它可以按比例收缩宽度,它收缩要比flex-grow复杂的多,用法和flex-grow类似,直接上代码!

	<style>
        .wrapper {
            height: 300px;
            width: 600px;
            border: 1px solid black;
            display: flex;
            flex-wrap: nowrap;
        }
        .content {
            height: 100px;
            width: 200px;
            box-sizing: border-box;
            /* border也会被划入到宽度的比例计算中,这里把他注释掉 */
            /* border: 1px solid #f00; */
            flex-shrink: 1;
        }
        .content:nth-of-type(3) {
            width: 400px;
            flex-shrink: 3;
        }
    </style>

在这里插入图片描述
它们的收缩不是按照flex-grow那样来算的,已知内容超出部分,也就是蓝色部分的宽度为400+200+200-600=200px,它们三的平分比例为1:1:3,加权收缩值为2001+2001+4003=1600px;第一个子div和第二个一样,被溢出量为2001/ 1600 200 = 25px,第三个子div的被溢出量为4003 / 1600*200 = 150px;最终它们三个的宽度分别为175px、175px、250px,占有量大,分出去的当然多咯。

**这里提示下:**其实被收缩的的部分是内容区的宽度,如果把border或者padding算进去的话,子div所占的的宽度虽然没变,但是它会加上border或padding值,也就是说子div的内容区的宽度将会减少,最后按比例收缩的时候将会出现小数;如图
在这里插入图片描述
我们来证明一下,上代码:

<style>
        .wrapper {
            height: 300px;
            width: 600px;
            border: 1px solid black;
            display: flex;
            flex-shrink: nowrap;
        }
        .content {
            height: 200px;
            width: 200px;
            box-sizing: border-box;
            padding: 0 80px;
            flex-grow: 1;
        }
        .content:nth-of-type(3) {
        	width: 400px;
            flex-shrink: 3;
        }
    </style>

由于给它设置box-sizing:border-box;左右padding为80px,此时第一个和第二个子div的内容区宽度为200-802 = 40px,第三个内容区宽度为400-802 = 240px,比例为1:1:3,溢出部分宽度为200+200+400-600 = 200px,加权收缩值为401 + 401 + 2403 = 800px,这里没问题吧!为了证明收缩的地方是子div的内容区宽度,我们用内容区的宽度来计算,它们的溢出量分别为401 / 800200 = 10px,401 / 800200 = 10px,2403 / 800*200 = 180px;所以子div里面左右padding值各为80px,第一个和第二个子div内容区宽度为40-10 = 30px,第三个子div内容区宽度应为240-180 = 60px,有图有真相,看图:

第一个和第二个子div宽度:在这里插入图片描述
第三个子div宽度:
在这里插入图片描述

flex-basis
它与设置的宽度再设置没多大区别,例如设置子div --> content 的 width: 100px,再设置flex-basis:200px,此时content的宽度为200px,由于flex-basis的优先级比width高,它会显示flex-basis的宽度,子div --> content的宽度被覆盖。
另外,如果设置的是width,若里面给里面添加英文文本,则里面的文本不换行,如果英文文本超出子div宽度的话,会出现文本溢出;如果设置的是flex-basis,里面的英文文本也不换行,当文本超出子div的宽度,文本会撑开子div的宽度,此时子div的宽度等于英文文本的宽度。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSS3中,flexbox布局是一种非常强大的布局方式,可以通过一些属性来实现弹性伸缩和对齐。其中,flex-growflex-shrinkflex-basis就是控制弹性伸缩的重要属性。 flex-grow 属性 flex-grow 属性用于指定元素在弹性容器中的伸展比率,即当元素所在容器有剩余空间时,元素按照比例分配剩余空间。默认值为 0,即当剩余空间不足时,元素不会伸展。 例如,当一个容器中有两个元素,一个 flex-grow 值为 1,另一个为 2,则第二个元素在容器有剩余空间时会比第一个元素多分配一倍的剩余空间。 flex-shrink 属性 flex-shrink 属性用于指定元素在弹性容器中的收缩比率,即当元素所在容器空间不足时,元素按照比例收缩。默认值为 1,即元素会自动收缩。 例如,当一个容器中有两个元素,一个 flex-shrink 值为 1,另一个为 2,则第二个元素在容器空间不足时会比第一个元素多收缩一倍。 非常重要的一点是,如果所有元素的 flex-shrink 属性值都为 0,则它们不会收缩。 flex-basis 属性 flex-basis 属性用于指定元素在弹性容器中的基准值,即元素在不伸展或收缩的情况下所占据的空间。默认值为 auto,即元素的大小由其本身的大小决定。 例如,当一个容器中有两个元素,一个 flex-basis 值为 100px,另一个为 200px,则第一个元素在不伸展或收缩的情况下会占据 100px 的空间。 综合运用 这三个属性通常一起使用,例如: flex: 1 0 auto; 这个属性的意思是元素在弹性容器中会按照 flex-grow 属性的比例伸展,但不会收缩,基准值由 flex-basis 决定。 总结 flex-growflex-shrinkflex-basis 这三个属性是控制 flexbox 布局中弹性伸缩的重要属性,非常方便实用。熟练掌握它们的使用可以让我们更好地控制弹性布局,实现更加灵活的网页布局。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值