【css】flex弹性布局中的flex:1 到底是什么意思?

1.flex:1

在这里插入图片描述

flex:1,其实就是 flex-grow:1;flex-shrink:1;flex-basis:0% 这三个属性的简写

2.flex-grow

MDN 上的描述
这个属性规定了 flex-grow 项在 flex 容器中分配剩余空间的相对比例。 主尺寸是项的宽度或高度,这取决于flex-direction值。
剩余空间是 flex 容器的大小减去所有 flex 项的大小加起来的大小。如果所有的兄弟项目都有相同的 flex-grow 系数,那么所有的项目将剩余空间按相同比例分配,否则将根据不同的 flex-grow 定义的比例进行分配。

  • 属性值:负值无效,默认为 0
  • flex-grow MDN链接
  • 个人理解就是,先让内容渲染出来,然后计算 剩余空间有多少。按照 有 flex-grow 属性 的比例,动态设置 当前DOM 的宽度
  • 公式就是:原始宽度 + (剩余空间 / 总共分成多少份 * 当前元素所占 分数)

如果,.one 设置宽度为200px ,剩下的让 .two .three 按照比例分,.two设置 flex-grow: 3; .three 设置 flex-grow: 1;

如果屏幕宽度是1000px(因为没有设置容器宽度,所以默认就是屏幕宽度),不设置 flex-grow的话,two 宽度默认是 61 (后面还要小数,方便计算默认取整),three 宽度默认是 86(后面还要小数,方便计算默认取整
那么剩余空间就是1000-200-61-86 ,就是 653,那么 要分成 3+1 份,每一份就是 163.25,
那么 two的宽度就是 61+(163.253) = 550.75
three的宽度就是 86+(163.25
1) = 249.25

在这里插入图片描述
在这里插入图片描述

在浏览器上调试,确实也是这个数

<!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>
    * {
      margin: 0;
      padding: 0;
    }

    .wrapper {
      /* 声明一个容器 */
      display: flex;
    }

    .one {
      background: #19CAAD;
    }

    .two {
      background: #8CC7B5;
    }

    .three {
      background: #D1BA74;
    }

    .four {
      background: #BEE7E9;
    }

    .five {
      background: #E6CEAC;
    }

    .six {
      background: #ECAD9E;
    }

    .item {
      text-align: center;
      font-size: 200%;
      color: #fff;
    }

    .one {
      width: 200px;
    }

    .two {
      /* flex: 1; */
      /* flex-basis: 200px; */
      flex-grow: 3;
    }

    .three {
      /* flex-basis: 200px; */
      flex-grow: 1;
    }
  </style>
</head>

<body>
  <div class="wrapper">
    <div class="one item">One</div>
    <div class="two item">Two</div>
    <div class="three item">Three</div>
    <!-- <div class="four item">Four</div>
    <div class="five item">Five</div>
    <div class="six item">Six</div> -->
  </div>

</body>

</html>

3.flex-shrink

MDN上的描述
flex-shrink 属性指定了 flex 元素的收缩规则。flex 元素仅在默认宽度之和大于容器的时候才会发生收缩,其收缩的大小是依据 flex-shrink 的值。

  • 属性值:负值无效,默认值为 1
  • flex-shrink MDN 链接
  • 公式就是:父元素原始宽度 * (原始宽度 / 所有项原始宽度总和)

如果,.one 、.three 宽度设置为 200px ,.two 宽度设置为:300px

如果 ,容器宽度是 500px , .one、.two、.three 每个都设置 flex-shrink:1也可以不设置因为默认值就是 1
.one 的宽度就是 500 * (200 / 700) ≈ 142
.two 的宽度就是 500 * (300 / 700) ≈ 214

在这里插入图片描述
在这里插入图片描述

<!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>
    * {
      margin: 0;
      padding: 0;
    }

    .wrapper {
      /* 声明一个容器 */
      margin: 100px 0 0 100px;
      display: flex;
      /* width: 1000px; */
      width: 500px;
      /* border: 1px solid red; */
    }

    .one {
      background: #19CAAD;
    }

    .two {
      background: #8CC7B5;
    }

    .three {
      background: #D1BA74;
    }

    .four {
      background: #BEE7E9;
    }

    .five {
      background: #E6CEAC;
    }

    .six {
      background: #ECAD9E;
    }

    .item {
      text-align: center;
      font-size: 200%;
      color: #fff;
    }

    .one {
      width: 200px;
    }

    .two {
      width: 300px;
    }

    .three {
      width: 200px;
    }
  </style>
</head>

<body>
  <div class="wrapper">
    <div class="one item">One</div>
    <div class="two item">Two</div>
    <div class="three item">Three</div>
    <!-- <div class="four item">Four</div>
    <div class="five item">Five</div>
    <div class="six item">Six</div> -->
  </div>

</body>

</html>

4.flex-basis

MDN 上的描述
CSS 属性 flex-basis 指定了 flex 元素在主轴方向上的初始大小。如果不使用 box-sizing 改变盒模型的话,那么这个属性就决定了 flex 元素的内容盒(content-box)的尺寸。

  • 属性值:content | <‘width’> (即:可以百分比,也可以具体的数)默认值是 auto
  • flex-basis MDN链接
  • 31
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值