[知其所以然]探究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…

相关文章
|
4月前
|
弹性计算 前端开发 容器
【前端web入门第六天】02 flex布局
Flex布局是一种现代CSS布局模式,通过给父元素设置`display: flex`,其子元素可自动挤压或拉伸。它包含弹性容器和弹性盒子,主轴默认为水平方向,侧轴为垂直方向。主轴对齐方式由`justify-content`属性控制,侧轴对齐方式包括`align-items`(针对所有子元素)和`align-self`(针对单个子元素)。修改主轴方向使用`flex-direction`属性,`flex`属性用于控制子元素在主轴上的伸缩比例。此外,`flex-wrap`属性允许子元素换行,而`align-content`属性则定义多行对齐方式。
|
5月前
|
前端开发 容器
【CSS Flexbox 探秘】弹性盒模型:揭秘网页布局的终极神器!
【8月更文挑战第25天】Flexbox 是 CSS3 中的关键特性,为网页设计提供了强大的布局能力。本文通过问答形式全面解析 Flexbox 的核心概念与属性,包括容器与项目属性,并通过示例演示如何使用 Flexbox 实现水平与垂直居中、等间距布局及响应式设计。相较于传统布局方法,Flexbox 更加灵活且简化了样式设置,同时在现代浏览器中拥有良好的支持度。掌握 Flexbox 对于提升网页布局效率至关重要。
94 1
|
5月前
|
容器
flex 的高阶玩法,你都get了吗?(记得收藏)
flex 的高阶玩法,你都get了吗?(记得收藏)
|
8月前
|
前端开发 容器
浮动的魅力与挑战:如何在前端设计中巧妙运用浮动(下)
浮动的魅力与挑战:如何在前端设计中巧妙运用浮动(下)
浮动的魅力与挑战:如何在前端设计中巧妙运用浮动(下)
|
8月前
|
前端开发 容器
浮动的魅力与挑战:如何在前端设计中巧妙运用浮动(上)
浮动的魅力与挑战:如何在前端设计中巧妙运用浮动(上)
浮动的魅力与挑战:如何在前端设计中巧妙运用浮动(上)
|
8月前
|
前端开发 容器
【零基础入门前端系列】—动画和弹性盒模型(二十四)
【零基础入门前端系列】—动画和弹性盒模型(二十四)
|
前端开发
前端学习案例2-flex重难点2
前端学习案例2-flex重难点2
70 0
前端学习案例2-flex重难点2
|
前端开发
前端学习案例3-flex重难点3
前端学习案例3-flex重难点3
68 0
前端学习案例3-flex重难点3
|
前端开发
前端学习案例1-flex重难点
前端学习案例1-flex重难点
81 0
前端学习案例1-flex重难点
|
容器
超Q的弹性盒子——flex✨
还记得小时候的QQ糖吗,超Q的口感。 而在布局中所使用的弹性盒子也会让你在开发中QQ弹弹 Come on baby
144 3
超Q的弹性盒子——flex✨