CSS属性多个子容器时使用flex-shrink 计算比例

目录

  • CSS属性多个子容器时使用flex-shrink 计算比例
    • 前提
    • 问题起源
    • 三个子容器使用flex-shrink计算比例
      • 1、常规计算
      • 2、便捷计算
    • 扩展
      • 1、两个子容器时
      • 2、四个子容器时
      • ...
    • 逆换算

前提

在读这篇文章前,你必须对css的flex属性有些了解,并知道flex-shrink的计算方式。

  • 你可以看阮一峰的flex布局教程,或者去w3cschool了解flex
  • 关于flex-shrink的计算,我比较推荐这篇文章《深入理解 flex 布局以及计算_Flexbox, Layout》。PS:它感谢的那几篇文章也可以看看

问题起源

我在写布局的时候要用flex,页面是要做自适应的。因本人刚接触flex,所以这flex并没有按照我想要的效果来。页面在放大和缩小的时候总是不对劲,可能是因为我自作聪明,没有去了解flex-grow和flex-shrink的计算方式,以为那个比例是按照页面最后大小来占比的。后来我就去啃这两个东西,发现flex-grow的计算方式和我想的差不多,flex-shrink的计算却是不一样的,所以就去找将这flex-shrink的比例转换为页面最后大小的占比。

三个子容器使用flex-shrink计算比例

1、常规计算


假设f为父容器的宽,a为子容器A的flex-shrink,b为子容器B的flex-shrink,c为子容器C的flex-shrink,图为计算前容器摆放情况(忽略margin和padding)。最重要的条件是子容器的flex-basis = 100%。
由条件可知,超出部分是2f,权重和是af+bf+cf=(a+b+c)faf+bf+cf = (a+b+c)faf+bf+cf=(a+b+c)f
A将缩小 af/(a+b+c)f∗2faf/(a+b+c)f*2faf/(a+b+c)f∗2f
A最后的结果是 f−af/(a+b+c)f∗2ff-af/(a+b+c)f*2ff−af/(a+b+c)f∗2f
B将缩小 bf/(a+b+c)f∗2fbf/(a+b+c)f*2fbf/(a+b+c)f∗2f
B最后的结果是 f−bf/(a+b+c)f∗2ff-bf/(a+b+c)f*2ff−bf/(a+b+c)f∗2f
C将缩小 cf/(a+b+c)f∗2fcf/(a+b+c)f*2fcf/(a+b+c)f∗2f
C最后的结果是 f−cf/(a+b+c)f∗2ff-cf/(a+b+c)f*2ff−cf/(a+b+c)f∗2f
所以
Ae:Be:Ce=(b+c−a):(a+c−b):(a+b−c)Ae:Be:Ce=(b+c-a):(a+c-b):(a+b-c) Ae:Be:Ce=(b+c−a):(a+c−b):(a+b−c)
Ae、Be、Ce是子容器最终占页面的比例。

ps:这只适用三个子容器的情况,当容器增加,就会变成n元一次方程,计算会加大。

2、便捷计算

当条件和上述的一样时,根据比例的特性,可得
2Ae:2Be:2Ce=(b+c−a):(a+c−b):(a+b−c)2Ae:2Be:2Ce=(b+c-a):(a+c-b):(a+b-c) 2Ae:2Be:2Ce=(b+c−a):(a+c−b):(a+b−c)

{2Ae=b+c−a=a+b+c−2a2Be=a+c−b=a+b+c−2b2Ce=a+b−c=a+b+c−2c\left\{\begin{matrix} 2Ae=b+c-a=a+b+c-2a \\ 2Be=a+c-b=a+b+c-2b \\ 2Ce=a+b-c=a+b+c-2c \end{matrix}\right. ⎩⎨⎧​2Ae=b+c−a=a+b+c−2a2Be=a+c−b=a+b+c−2b2Ce=a+b−c=a+b+c−2c​

{Ae=a+b+c2−aBe=a+b+c2−bCe=a+b+c2−c\left\{\begin{matrix} Ae=\frac{a+b+c}{2}-a \\ Be=\frac{a+b+c}{2}-b \\ Ce=\frac{a+b+c}{2}-c \end{matrix}\right. ⎩⎨⎧​Ae=2a+b+c​−aBe=2a+b+c​−bCe=2a+b+c​−c​
所以
Ae:Be:Ce=a+b+c2−a:a+b+c2−b:a+b+c2−cAe:Be:Ce=\frac{a+b+c}{2}-a:\frac{a+b+c}{2}-b:\frac{a+b+c}{2}-c Ae:Be:Ce=2a+b+c​−a:2a+b+c​−b:2a+b+c​−c
到这,这比例计算就简便多了。

扩展

对简便计算做下扩展

1、两个子容器时

Ae:Be:Ce=(a+b)−a:(a+b)−bAe:Be:Ce=(a+b)-a:(a+b)-b Ae:Be:Ce=(a+b)−a:(a+b)−b

2、四个子容器时

Ae:Be:Ce:De=a+b+c+d3−a:a+b+c+d3−b:a+b+c+d3−c:a+b+c+d3−dAe:Be:Ce:De=\frac{a+b+c+d}{3}-a:\frac{a+b+c+d}{3}-b:\frac{a+b+c+d}{3}-c:\frac{a+b+c+d}{3}-d Ae:Be:Ce:De=3a+b+c+d​−a:3a+b+c+d​−b:3a+b+c+d​−c:3a+b+c+d​−d

此时,可看出有n个子容器时,便捷比例计算公式是
Ae:Be...Me=a+b...mn−1−a:a+b...mn−1−b...a+b...mn−1−mAe:Be...Me=\frac{a+b...m}{n-1}-a:\frac{a+b...m}{n-1}-b...\frac{a+b...m}{n-1}-m Ae:Be...Me=n−1a+b...m​−a:n−1a+b...m​−b...n−1a+b...m​−m
最后在提醒一次:子容器的flex-basis = 100%(最好没有padding,margin等固定的东西,因为flex-shrink计算是会先减去那些固定的东西,剩下的空间才是可分配空间)

逆换算

上面的公式可以让你通过你填的flex-shrink计算出页面最后布局的比例,下面的公式可使你通过设定页面的最后比例算出,你该填啥flex-shrink。
此处使用便捷比例计算公式
Ae:Be...Me=a+b...mn−1−a:a+b...mn−1−b...a+b...mn−1−mAe:Be...Me=\frac{a+b...m}{n-1}-a:\frac{a+b...m}{n-1}-b...\frac{a+b...m}{n-1}-m Ae:Be...Me=n−1a+b...m​−a:n−1a+b...m​−b...n−1a+b...m​−m

a+b...m=Alla+b...m=All a+b...m=All

Ae:Be...Me=Alln−1−a:Alln−1−b...Alln−1−mAe:Be...Me=\frac{All}{n-1}-a:\frac{All}{n-1}-b...\frac{All}{n-1}-m Ae:Be...Me=n−1All​−a:n−1All​−b...n−1All​−m
{Ae=Alln−1−aBe=Alln−1−b...Me=Alln−1−m\left\{\begin{matrix} Ae=\frac{All}{n-1}-a \\ Be=\frac{All}{n-1}-b \\ ... \\ Me=\frac{All}{n-1}-m \end{matrix}\right. ⎩⎪⎪⎨⎪⎪⎧​Ae=n−1All​−aBe=n−1All​−b...Me=n−1All​−m​
{a=Alln−1−Aeb=Alln−1−Be...m=Alln−1−Me\left\{\begin{matrix} a=\frac{All}{n-1}-Ae \\ b=\frac{All}{n-1}-Be \\ ... \\ m=\frac{All}{n-1}-Me \end{matrix}\right. ⎩⎪⎪⎨⎪⎪⎧​a=n−1All​−Aeb=n−1All​−Be...m=n−1All​−Me​
Alln−1−Ae+Alln−1−Be...Alln−1−Me=All\frac{All}{n-1}-Ae+\frac{All}{n-1}-Be...\frac{All}{n-1}-Me=All n−1All​−Ae+n−1All​−Be...n−1All​−Me=All
nn−1All−All=Alln−1=Ae+Be...+Me\frac{n}{n-1}All-All=\frac{All}{n-1}=Ae+Be...+Me n−1n​All−All=n−1All​=Ae+Be...+Me
所以
{a=(Ae+Be...+Me)−Aeb=(Ae+Be...+Me)−Be...m=(Ae+Be...+Me)−Me\left\{\begin{matrix} a=(Ae+Be...+Me)-Ae \\ b=(Ae+Be...+Me)-Be \\ ... \\ m=(Ae+Be...+Me)-Me \end{matrix}\right. ⎩⎪⎪⎨⎪⎪⎧​a=(Ae+Be...+Me)−Aeb=(Ae+Be...+Me)−Be...m=(Ae+Be...+Me)−Me​
可用下面得代码测试

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Event Loop</title><style>.my-box{background: blue;display: flex;width: 300px;height: 200px;}.item-1{background: red;height: 100px;/*width: 100%;*//*min-width: 0;*/flex: 0 1 100%;/*width: 0;*/}.item-2{background: purple;height: 100px;/*width: 100%;*//*min-width: 0;*/flex: 0 2 100%;/*margin: 5px;*//*width: 0;*/}.item-3{background: gold;height: 100px;/*width: 100%;*//*min-width: 0;*/flex: 0 3 100%;/*width: 0;*/}.textellip{width:100%;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;display: inline-block;vertical-align:middle;}.tr{border-radius:5px;margin-bottom:0.46296vh;padding: 5px;height:32/10.8+vh;line-height:32/10.8+vh;}</style>
</head>
<body><div class="my-box"><div class="item-1"><span class="textellip"></span></div><div class="item-2"></div><div class="item-3"><span class="textellip"></span></div></div>
</body>
</html>

CSS属性多个子容器时使用flex-shrink 计算比例相关推荐

  1. DW中CSS属性详解

    作者:未知 来源:5D多媒体       在Dreamweaver的CSS样式里包含了W3C规范定义的所有CSS1的属性,Dreamweaver把这些属性分为Type(类型).Background(背 ...

  2. css属性flex:1代表什么

    1. 简单介绍flex布局 flex布局则是一种布局方案,设置父div的css属性display:flex,即可实现flex布局.该父div即为容器,而其内的子元素(如子div)称为项目. 容器和项目 ...

  3. CSS 属性篇(四):Flex弹性盒子

    一.Flex介绍 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为 Flex 布局: .box{disp ...

  4. CSS 新属性 《设置容器长宽比》

    Chrome 88 浏览器支持新的 CSS 属性aspect-ratio,可以设置容器的长宽比.

  5. css 相同的css属性_CSS中的order属性

    css 相同的css属性 CSS | 订单属性 (CSS | order Property) Introduction: 介绍: Web development is an ever-growing ...

  6. CSS 浮动布局放弃float,拥抱flex(详解)

    CSS 浮动布局放弃float,拥抱flex(详解) 文章目录 CSS 浮动布局放弃float,拥抱flex(详解) 说明 Flex布局 容器和项目 容器属性 flex-direction属性 fle ...

  7. blr不是已知的css属性名,css笔记

    背景图片满屏显示: .mainbody{position:absolute; top:0; left:0; height:100%; width:100%; background-image:url( ...

  8. css超过两行显示为..._使用这些不太常用的CSS属性,布局效率上又提高了一个层次...

    有很多CSS属性,有些人不了解,或者他们了解它们,但是忘记在需要时使用它们.其实,有时候我们用 JavaScript 来实某些交互,CSS 一个属性就能搞定了,这可以大大节约我们编码的时间. 作为前端 ...

  9. 常用的CSS属性的英文单词总结及用法、解释

    1.(盒子)布局排版类 - TOP float - 浮动:设置块元素的浮动效果.可选常用到参数left.right : width - 宽:确定盒子本身的宽度,可以使盒子的宽度不依靠它所包含的内容多少 ...

最新文章

  1. The form contains the following errors
  2. 干货 | DevSecOps在携程的最佳实践
  3. C++ Primer 5th笔记(chap 17 标准库特殊设施)bitset操作
  4. 【Linux】一步一步学Linux——unzip命令(68)
  5. [Swift]LeetCode483. 最小好进制 | Smallest Good Base
  6. 010 使用list和tuple
  7. Unknown encoder ‘libx264‘的解决方法
  8. python 文件上传下载,python实现上传下载文件功能
  9. 如何在github上发起一个pull request,如何贡献代码,参与开源项目
  10. Oracle中开启并行和相关查询
  11. 思科 GNS3 配置 链路捆绑
  12. 2019腾讯后台开发详细面试流程
  13. DAMA数据管理知识体系指南pdf
  14. 程序实现汉字转换为拼音
  15. iphone计算机输入文字,10个鲜为人知的iPhone实用技巧 全知道的算我输!
  16. 特运tong app sign签名破解
  17. python提取身份证信息_Python selenium 身份证信息在线解析爬取
  18. Cool Edit之扫频波的生成
  19. JVM 面试都问些啥?看这一篇就够了
  20. 图解央行房贷新政 首付才是刚需族最大门槛

热门文章

  1. 带你了解什么是产品经理,产品经理究竟做什么的【产品入门】
  2. p9官方root,p9官方包198网盘分享
  3. 佐治亚理工学计算机硕士,佐治亚理工学院电子与计算机工程硕士专业
  4. Latex 加下角标
  5. 如何批量在excel中将中文转换为汉语拼音(Excel文字转拼音两种方法)
  6. linux系统认证中级是什么,目前国内常见的几种Linux认证及其所需价格
  7. IC基础知识(六)SV中default input #1 output #1的解释
  8. 前端学习笔记01---HTML5、CSS3、移动端前端基础学习知识点合集
  9. SpringBoot基础知识
  10. Push Pull:注意力攻击生成可迁移对抗样本