[知其所以然]探究Flex盒子的‘’弹性‘’(下)

简介: 我们使用Flexbox 实现垂直水平居中、自适应容器宽度乐此不疲,因为确确实实很方便。可以简便、完整、响应式地实现各种页面布局,目前已得到所有现代浏览器的支持。但Flex属性如何计算呢?

效果—3 fit-content


效果—4 fill-available



flex-basis属性相关的运用


  • flex-basis 默认值为auto


  • 如果Flex项目 显式的 设置了width值,同时flex-basis为auto时,则Flex项目的宽度为按width来计算,如果未显式设置width,则按Flex项目的内容宽度来计算


  • 如果Flex项目显式的设置了width值,同时显式设置了flex-basis的具体值,则Flex项目会忽略width值,会按flex-basis来计算Flex项目,当Flex容器剩余空间不足时,Flex项目的实际宽度并不会按flex-basis来计算,会根据flex-grow和flex-shrink设置的值给Flex项目分配相应的空间


  • 如果Flex项目显式的设置了min-width或max-width值时,当flex-basis计算出来的值小于min-width则按min-width值设置Flex项目宽度,反之,计算出来的值大于max-width值时,则按max-width的值设置Flex项目宽度


flex-grow


当Flex容器有一定的剩余空间时,flex-grow可以让Flex项目分配Flex容器剩余的空间,每个Flex项目将根据flex-grow因子扩展,从而让Flex项目布满整个Flex容器(有效利用Flex容器的剩余空间)。当所有的Flex项目具有一个相同的flex-grow值时,那么Flex项目将会平均分配Flex容器剩余的空间。


flex-shrink


flex-shrink是用来控制Flex项目缩放因子。当所有Flex项目宽度之和大于Flex容器时,将会溢出容器(flex-wrap为nowrap时),flex-shrink就可以根据Flex项目设置的数值比例来分配Flex容器的不足空间,也就是按比例因子缩小自身的宽度,以免溢出Flex容器。


示例:


假设:一个 宽度 837px 的 Flex 容器 下有2 个 Flex项目,如图:



如何 grow ?


// Flex 项目1
  height: 100px;
  background-color: red;
  flex-grow: 5;
  flex-shrink: 5;
  flex-basis: 200px;


// Flex 项目2
  height: 100px;
  background-color: blue;
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 200px;



grow 计算:


容器 宽度 837px - flex-basis[1] - flex-basis[2] > 0 即 有剩余空间
剩余空间 = 容器 宽度 837px - flex-basis[1] - flex-basis[2]  = 837px - 200px -200px = 437px
flex-grow 发挥作用如下:
flex-grow [1] * x + flex-grow[2] * x = 437px 
5x  +  1x = 437 
x= 72.83px 
所以 
Flex 项目1 的总宽度  =  flex-basis[1]  + flex-grow[1] * x  = 200px + 72.83px * 5  =  564.17px
Flex 项目2 的总宽度  =  flex-basis[2]  + flex-grow[2] * x  = 200px +  72.83px * 1 =  272.83px 


如何  shrink ?


// Flex 项目1
  height: 100px;
  background-color: red;
  flex-grow: 5;
  flex-shrink: 5;
  flex-basis: 800px;


// Flex 项目2
  height: 100px;
  background-color: blue;
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 800px;




shrink 计算:


容器 宽度 837px - flex-basis[1] - flex-basis[2] < 0 即 有不足空间
不足空间 = 容器 宽度 837px - flex-basis[1] - flex-basis[2]  = 837px - 800px -800px = -763px
flex-shrink 发挥作用如下:
flex-shrink [1] * x + flex-shrink[2] * x = 763px 
5x  +  1x = 763px 
x = 127.17px
所以
Flex 项目1 的总宽度  =  flex-basis[1]  - flex-shrink[1] * x  = 800px - 127.17px * 5  =  164.17px
Flex 项目2 的总宽度  =  flex-basis[2]  + flex-shrink[2] * x  = 800px -  127.17px * 1 =  672.83px 


flex grow & shrink 演算法



总结


希望本篇文章能帮助大家进一步了解Flex属性是如何计算。最后借用一张清晰的图来做个总结吧。



参考链接:


[1]: www.w3cplus.com/css/flex-it…


[2]: ithelp.ithome.com.tw/articles/10…

相关文章
|
21小时前
|
容器
一篇文章讲明白flex布局
一篇文章讲明白flex布局
|
11月前
|
容器
教你快速上手Flex弹性盒布局(项目属性)
教你快速上手Flex弹性盒布局(项目属性)
|
前端开发
前端学习案例2-flex重难点2
前端学习案例2-flex重难点2
52 0
前端学习案例2-flex重难点2
|
前端开发
前端学习案例1-flex重难点
前端学习案例1-flex重难点
64 0
前端学习案例1-flex重难点
|
前端开发
前端学习案例3-flex重难点3
前端学习案例3-flex重难点3
45 0
前端学习案例3-flex重难点3
|
前端开发 小程序 容器
【小程序】&【web前端】必备-Flex布局详解(弹性盒子)
【小程序】&【web前端】必备-Flex布局详解(弹性盒子)
373 0
|
容器
超Q的弹性盒子——flex✨
还记得小时候的QQ糖吗,超Q的口感。 而在布局中所使用的弹性盒子也会让你在开发中QQ弹弹 Come on baby
117 3
超Q的弹性盒子——flex✨
|
Java 程序员 容器
Flex弹性盒子(一篇带你掌握潮流 Flex 布局)(下)
5.当切换容器排列方式后,水平对齐以及垂直对齐的 应用 变化(重点、难点⭐⭐⭐⭐⭐) 当使用flex-direction: (例 column) ;时 justify-content 、 align-content 、align-items发生的变化 当排列为column / column-reverse 时,其实容器的主轴发生了变化 主轴现在是竖轴,副轴是横轴
112 0
Flex弹性盒子(一篇带你掌握潮流 Flex 布局)(下)
|
前端开发 安全 容器
Flex弹性盒子(一篇带你掌握潮流 Flex 布局)(上)
Flex弹性盒子 1.说在前头 1.1.Flex布局出现之前 我们知道传统的页面布局依赖于 盒状模型 依赖于display、position、float属性 对于某些特殊布局来说特别不方便,比如垂直居中(比较不容易实现) 1.2.Flex布局出现后 2009年,W3C提出Flex布局 简便、完整、响应式的各种实现页面布局(目前已得到所有主流浏览器的支持)
284 0
Flex弹性盒子(一篇带你掌握潮流 Flex 布局)(上)
|
小程序 数据可视化 前端开发
吐血整理!一文吃透小程序必备Flex布局
吐血整理!一文吃透小程序必备Flex布局
219 0
吐血整理!一文吃透小程序必备Flex布局