flex-basis、flex-grow、flex-shrink

一、如果子元素设置了flex-basis,那么元素的宽度是多少呢?

分以下几种情况:

1.flex-basis:auto; 
如果设置为auto,那么子元素的宽度以子元素的width值为基准。
比如width:70px; 那么子元素占的横向空间就是70px;
如果子元素未设置width,那么宽度为子元素内容的宽度


2.flex-basis不设置((如果没有设置,默认是auto))
这种情况就以子元素设置的width为主,如果没有设置就是子元素内容的宽度


3.flex-basis:100px  
如果给flex-basis设置了具体的宽度/高度值,那么无论有没有设置width/height,子元素都会以flex-basis的值为基准宽度。

二、flex-grow 定义项目的放大比例,如果没有设置,默认为零。
如果父元素定义为flex布局。并且父元素的宽度为400px;

父元素有3个子元素,子元素1的基准宽度是50px、子元素2的基准宽度为70px、子元素3的基准宽度为100px。
那么3个子元素共占用了220px,父元素剩余的空间是180px;
这个时候,我给子元素1设置flex-grow:0;表示就算父元素有剩余空间,子元素1也不放大。
子元素2设置flex-grow:2;
子元素3设置flex-grow:1;
那么 就意味着 父元素剩余的180px,被分为了3份。
子元素2再占2份,也就是120px;
子元素3再占1份,也就是60px;

最后 子元素1的宽度仍然是 50px
子元素2的宽度是 70px+120px = 190px;
子元素3的宽度是 100px+60px = 160px;

三、flex-shrink定义项目的缩小比例,如果没有设置,默认是1
<body>
<div class="box">
  <div class="item">1</div>
  <div class="item">222</div>
  <div class="item">3</div>
</div>
</body>

<style>
.box{
  display:flex;
  width:400px;
  height:50px;
  background-color:#eee;
}
.item{
  height:50px;
}
.item:nth-child(1){
  width:250px;
  background:red;
}
.item:nth-child(2){
  width:150px;
  flex-basis:auto;
  flex-shrink:2;
  background:grey;
}
.item:nth-child(3){
  width:50px;
  flex-basis:100px;
  flex-shrink:2;
  background:yellow;
}
</style>
子项1的基准宽度是250px;
子项2的基准宽度是150px;
子项3的基准宽度是100px;

总共是500px;超过了 父容器的宽度400px的范围;容器放不下;
超出来的空间,需要被每个子项根据自己设置的flex-shrink进行吸收。

子项1的 flex-shrink 是1(未设置,默认为1)
子项2的 flex-shrink 是2
子项3的 flex-shrink 是2

子项1 需要吸收的空间为 (250*1)/(250*1+150*2+100*2)*100 = 33.33px;子项1真实的空间为 250-33.33 = 216.67px;

子项2 需要吸收的空间为 (150*2)/(250*1+150*2+100*2)*100 = 40px; 子项2真实空间为 150-40 = 110px;

子项3 需要吸收的空间为 (100*2)/(250*1+150*2+100*2)*100 = 26.67px; 子项3真实空间为 100-26.67 = 73.33px;

四、flex缩写

flex 是flex-grow、flex-shrink、flex-basis的缩写
flex 有2个默认值

flex:auto;     //(1,1,auto);
flex:none;    //(0,0,auto);

我们常用的 flex:1;
其实是  flex:1 1 auto;  //的缩写
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这几个属性配合使用可以更细化的控制Flex布局,flex-basis和flex-grow可控制如何分配Availa...
    unspecx阅读 1,469评论 0 0
  • H5移动端知识点总结 阅读目录 移动开发基本知识点 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇阅读 10,104评论 0 26
  • 移动开发基本知识点 一.使用rem作为单位 html { font-size: 100px; } @media(m...
    横冲直撞666阅读 8,876评论 0 6
  • 应用在父元素上-flex box 1.模型 方向 换行 display: flex(盒子模型) 定义父元素为fle...
    林立镇阅读 8,677评论 0 27
  • 前言 FlexBox是css3的一种新的布局方式,天生为解决布局问题而存在的它,比起传统的布局方式,我们使用Fle...
    zevei阅读 5,251评论 23 3