广告位联系
返回顶部
分享到

flex布局中flex-grow与flex-shrink的计算方式解析

css 来源:互联网搜集 作者:秩名 发布时间:2019-12-18 11:05:02 人浏览
摘要

CSS 中的 Flex(弹性布局) 可以很灵活的控制网页的布局,其中决定 Flex 布局内项目宽度/高度的是三个属性:flex-basis, flex-grow, flex-shrink. flex-basis flex-basis 决定了项目占据主轴的空间,除非使用 box-sizing 进行设置,否则它将设置内容框的大小,

CSS 中的 Flex(弹性布局) 可以很灵活的控制网页的布局,其中决定 Flex 布局内项目宽度/高度的是三个属性:flex-basis, flex-grow, flex-shrink.

flex-basis

flex-basis 决定了项目占据主轴的空间,除非使用 box-sizing 进行设置,否则它将设置内容框的大小,因此当你指定一个flex项的大小时需要额外小心,因为它很肯能包含内边距与边框。

你可以为其指定一个具体的CSS尺寸值,也可以指定其占据父元素的百分比,它的默认值为 auto(根据内容自动调整大小)
 

<!-- demo-1 -->
 
  <div class="parent">
    <div class="child1">100px</div>
    <div class="child2">200px</div>
  </div>
  <div class="parent">
    <div class="child1">10%</div>
    <div class="child2">20%</div>
  </div>
  <div class="parent">
    <div class="child1">30%</div>
    <div class="child2">auto</div>
  </div>
 
  <style>
    .parent {
      width: 500px;
      display: flex;
      margin-bottom: 15px;
      text-align: center;
      background-color: #eeeeee;
    }
 
    /** 像素值*/
    .parent:nth-child(1) .child1 {
      flex-basis: 100px;
      background-color: #356969
    }
    .parent:nth-child(1) .child2 {
      flex-basis: 200px;
      background-color: #369925;
    }
 
    /** 百分比 */
    .parent:nth-child(2) .child1 {
      flex-basis: 10%;
      background-color: #356969
    }
    .parent:nth-child(2) .child2 {
      flex-basis: 20%;
      background-color: #369925;
    }
 
    /** 自动 */
    .parent:nth-child(3) .child1 {
      flex-basis: 30%;
      background-color: #356969
    }
    .parent:nth-child(3) .child2 {
      flex-basis: auto;
      background-color: #369925;
    }
  </style>


flex-grow

flex-grow 设置当 flex 容器存在剩余空间(flex容器的大小减去所有flex项的大小之和)时项目的放大比例,它的默认值为 0 (即使存在剩余空间也不放大)。如果所有项目的 flex-grow 属性值都是相同的,则它们将等分剩余空间,否则,将根据不同的属性值所定义的比率进行分配。

例如,主轴长度为600px, 项目1占据50px, 项目2占据100px, 项目3占据150px, 则剩余空间为:600px - (50px + 100px + 150px) = 300px

假如每个项目的 flex-grow 属性值都相同(例如都为1),则所有项目分配到相同的剩余空间:

  - 项目1: 300px * (1 / (1 + 1 + 1)) = 100px;
  - 项目2: 300px * (1 / (1 + 1 + 1)) = 100px;
  - 项目3: 300px * (1 / (1 + 1 + 1)) = 100px;

 

<!-- demo-2 -->
 
<div class="parent">
  <div class="child1">50px + 100px</div>
  <div class="child2">100px + 100px</div>
  <div class="child3">150px + 100px</div>
</div>
 
<style>
  .parent {
    width: 600px;
    display: flex;
    text-align: center;
    color: #eee;
  }
 
  .child1 {
    flex-basis: 50px;
    flex-grow: 1;
    background-color: #0066CC;
  } 
 
  .child2 {
    flex-basis: 100px;
    flex-grow: 1;
    background-color: #009900;
  }
 
  .child3 {
    flex-basis: 150px;
    flex-grow: 1;
    background-color: #CC3300;
  }
</style>

要是属性值为小数怎么办呢?这里分两种情况:

1. 所有flex项的 flex-gorw 属性值之和大于1,仍然按照上述方式进行计算;
2. 所有flex项的 flex-gorw 属性值之和小于1,基值按照1来进行计算,例如项目1为 0.2, 项目2为 0.3, 项目3为 0.4, 则它们分配到的剩余

空间分别为:
  - 项目1: 300px * (0.2 / 1) = 60px;
  - 项目2: 300px * (0.3 / 1) = 90px;
  - 项目3: 300px * (0.4 / 1) = 120px;

<!-- demo-4 -->
 
 <div class="parent">
   <div class="child1">50px + 60px</div>
   <div class="child2">100px + 90px</div>
   <div class="child3">150px + 120px</div>
 </div>
 
 <style>
   .parent {
     width: 600px;
     display: flex;
     text-align: center;
     color: #eee;
   }
 
   .child1 {
     flex-basis: 50px;
     flex-grow: 0.2;
     background-color: #0066CC;
   } 
 
   .child2 {
     flex-basis: 100px;
     flex-grow: 0.3;
     background-color: #009900;
   }
 
   .child3 {
     flex-basis: 150px;
     flex-grow: 0.4;
     background-color: #CC3300;

flex-shrink

flex-shrink 设置当 flex 容器空间不足时项目的放大比例,它的默认值为 1 (空间不足时该项目将缩小)。

flex-shrink 的计算方式与 flex-grow 略有不同,有两个因素影响 flex 项该缩小多少,一个是 flex-shrink 的属性值,另一个是 flex 项本身的大小,它们按各自的权重进行缩小,举例来说:

主轴长度为600px, 项目1占据100px, 项目2占据300px, 项目3占据500px, 每个项目的 flex-shrink 属性值分别为1,3,2, 则总权重为 100px 1 + 300px 3 + 500px *2 = 2000px, 每个项目的权重分别为为:

  - 项目1: (100px * 1) / 2000px = 0.05;
  - 项目2: (300px * 3) / 2000px = 0.45;
  - 项目3: (500px * 2) / 2000px = 0.50;
  溢出的空间长度为:100px + 300px + 500px - 600px = 300px;
  那么每个项目分别缩小:
  - 项目1: 300px * 0.05 = 15px;
  - 项目2: 300px * 0.45 = 135px;
  - 项目3: 300px * 0.50 = 150px;

 

<!-- demo-5 -->
 
 <div class="parent">
   <div class="child1">100px - 15px</div>
   <div class="child2">300px - 135px</div>
   <div class="child3">500px - 150px</div>
 </div>
 <style>
   .parent {
     width: 600px;
     display: flex;
     text-align: center;
     color: #eee;
   }
 
   .child1 {
     flex-basis: 100px;
     flex-shrink: 1;
     background-color: #0066CC;
   } 
 
   .child2 {
     flex-basis: 300px;
     flex-shrink: 3;
     background-color: #009900;
   }
 
   .child3 {
     flex-basis: 500px;
     flex-shrink: 2;
     background-color: #CC3300;
   }
 </style>

同样的,当 flex-shrink 的值为小数时,也分两种情况:

1. 所有flex项的 flex-shrink 属性值之和大于1,仍然按照上述方式进行计算;
2. 所有flex项的 flex-shrink 属性值之和小于1,只收缩溢出空间的一部分,例如项目1为 0.1, 项目2为 0.3, 项目3为 0.2, 则总的收缩空间为:

300px * (0.1 + 0.3 + 0.2) = 180px  
  每个项的权重计算方式是不变的,每个项目分别缩小:
  - 项目1: 180px * 0.05 = 9px;
  - 项目2: 180px * 0.45 = 81px;
  - 项目3: 180px * 0.50 = 90px;

<!-- demo-6 -->
 
 <div class="parent">
   <div class="child1">100px - 9px</div>
   <div class="child2">300px - 135px</div>
   <div class="child3">500px - 90px</div>
 </div>
 
   <style>
   .parent {
     width: 600px;
     display: flex;
     text-align: center;
     color: #eee;
   }
 
   .child1 {
     flex-basis: 100px;
     flex-shrink: 0.1;
     background-color: #0066CC;
   } 
 
   .child2 {
     flex-basis: 300px;
     flex-shrink: 0.3;
     background-color: #009900;
   }
 
   .child3 {
     flex-basis: 500px;
     flex-shrink: 0.2;
     background-color: #CC3300;
   }
 </style>

由于只收缩了溢出空间的一部分,div 内的元素总宽度实际上是超出 div 的宽度的。

以上就是关于使用flex布局中 flex-grow 与 flex-shrink 计算方式的简单介绍。

该篇博客内的代码已同步到

参考资料:

[1]. MDN文档
[2]. MDN文档

[3]. MDN文档


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://www.jb51.net/css/706642.html
相关文章
  • CSS3浏览器兼容的介绍

    CSS3浏览器兼容的介绍
    一、浏览器兼容 1.1、概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题。不同浏览器其内核
  • CSS元素定位之通过元素的标签或者元素的id、cl

    CSS元素定位之通过元素的标签或者元素的id、cl
    大部分人在使用selenium定位元素时,用的是xpath元素定位方式,因为xpath元素定位方式基本能解决定位的需求。xpath元素定位方式更直观,更好
  • 微信小程序纯CSS实现无限弹幕滚动效果

    微信小程序纯CSS实现无限弹幕滚动效果
    啥也不说,先上效果图 实现背景 产品:我们需要一个弹幕滚动效果,类似于微博热搜那种实时评论,但是我们的数据是固定的20条,你让他
  • 使用CSS构建强大且酷炫的粒子动画效果

    使用CSS构建强大且酷炫的粒子动画效果
    粒子动画,顾名思义,就是页面上存在大量的粒子构建而成的动画。传统的粒子动画主要由 Canvas、WebGL 实现。 当然,不使用 HTML + CSS 的主要
  • flex:1的详细介绍

    flex:1的详细介绍
    简单的来说一下在别人问你这个问题的时候怎么来回答它 前端新人,如有错误求大佬指出~求教???? 情景复现 大佬提问:你知道flex: 1;的更深
  • 新的CSS伪类函数 :is 和 :where()示例介绍

    新的CSS伪类函数 :is 和 :where()示例介绍
    在编写 CSS 时,有时可能会使用很长的选择器列表来定位具有相同样式规则的多个元素。例如,如果您想对标题中的 b 标签进行颜色调整,我
  • 纯CSS打字动画的实现方法

    纯CSS打字动画的实现方法
    在一些技术网站中,经常会看到这样一种展示效果:逐个显示一段文本中的字符,模拟出一种打字的效果。通过这种方式可以显著地提升网
  • 实现el-form每行显示两列底部按钮居中效果的教程

    实现el-form每行显示两列底部按钮居中效果的教程
    el-form 每行显示两列,底部按钮居中 问题: 以前的解决办法是:el-col,el-row。但是这里只有一个el-form-item的label数据是已知的,其余项都是循
  • CSS实现六边形的图片效果的代码

    CSS实现六边形的图片效果的代码
    前言 在CodePen上看到一个有意思的效果: 这个效果的难点在于六边形的绘制, 那么接下来我们就一起来看下作者是怎么实现他的吧 实现思路
  • CSS浮动引起的高度塌陷问题的详细介绍

    CSS浮动引起的高度塌陷问题的详细介绍
    正常页面布局 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 style *{ margin:0; padding: 0; } .content{ width:400px; border:1px solid #000; } .box{ width:200px;
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计