深入理解 flex-grow、flex-shrink、flex-basis

目录

1. Flex布局

2. flex-grow

计算方式

3. flex-shrink

计算公式

4. flex-basis

5. 应用场景

6. 总结


1. Flex布局

Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性 flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为 0 1 auto

任何一个容器都可以用 Flex 进行布局(如果不会 flex 布局的可见阮老师的 Flex 布局教程),而且 Flex 是发生在父容器和子容器之间的布局关系的,那么父容器与子容器的关系是怎么样子的,又是怎么计算子容器所占用的空间的呢,怎么进行弹性布局的呢?

欲要解决上面的问题,首先得了解 flex-grow 和 flex-shrink 是怎么计算的?flex-basis 和 width 又有什么关系和区别?

接下来,我们先提出两个概念:剩余空间和溢出空间,具体是什么意思我们后面慢慢解释。

2. flex-grow

flex-grow属性在MDN上的定义是:

定义弹性盒子项(flex-item)的拉伸因子,默认值0”

传统的布局是子容器在父容器中从左到右进行布局,应用 flex 进行布局,那么父容器一定设置 display: flex,子容器要“占有”并且“瓜分”父容器的空间,如何占有、瓜分的策略就是弹性布局的策略。这里就要解释到“剩余空间”的概念:

子容器在父容器的“主轴”上还有多少空间可以“瓜分”,这个可以被“瓜分”的空间就叫做剩余空间。

文字总是很抽象,举个例子就能理解剩余空间了,现在有如下的代码:

HTML 代码:

<body><div class="container"><div class="item a"><p>A</p><p> width:100</p><p>flex-grow:1</p></div><div class="item b"><p>B</p><p> width:150</p><p>flex-grow:2</p></div><div class="item c"><p>C</p><p> width:100</p><p>flex-grow:3</p></div></div>
</body>

CSS代码:

    <style>.container {margin: 10px;display: flex;width: 500px;height: 200px;background-color: #eee;color: #666;text-align: center;}.item {height: 100px;}.item p {margin: 0;}.a {width: 100px;background-color: #ff4466;}.b {width: 150px;background-color: #42b983;}.c {width: 100px;background-color: #61dafb;}</style>

展示的效果如下(最后那个框是截图的时候的标注,不是展示出来的效果):

image-20191129122900800

这就需要用到flex-grow 属性了,flex-grow 定义子容器的瓜分剩余空间的比例,默认为 0,即如果存在剩余空间,也不会去瓜分。

flex-grow例子,将上面的例子改成如下代码:

HTML 代码(代码只增加了 flex-grow 的说明,没有其他结构的变动):

<body><div class="container"><div class="item a"><p>A</p><p> width:100</p><p>flex-grow:1</p></div><div class="item b"><p>B</p><p> width:150</p><p>flex-grow:2</p></div><div class="item c"><p>C</p><p> width:100</p><p>flex-grow:3</p></div></div>
</body>

CSS 代码(给每个子容器增加了 flex-grow):

    <style>.container {margin: 10px;display: flex;width: 500px;height: 200px;background-color: #eee;color: #666;text-align: center;}.item {height: 100px;p {margin: 0;}}.a {width: 100px;flex-grow: 1;background-color: #ff4466;}.b {width: 150px;flex-grow: 2;background-color: #42b983;}.c {width: 100px;flex-grow: 3;background-color: #61dafb;}</style>

 

结果如下:

 

最初,我们发现,子容器的宽度总和只有 350px,父容器宽度为 500px,那么剩余空间就出现了,为 150px。当设置了 flex-grow 之后, A,B,C三个子容器会根据自身的 flex-grow 去“瓜分”剩余空间。

在这里我们总结为 flex-grow 属性决定了子容器要占用父容器多少剩余空间。

计算方式

  • 确定总的 flex-grow:首先,你需要计算所有Flex项目的 flex-grow 值的总和。这个总和将用于确定每个项目应该获得的额外空间的比例。

  • 然后,对于每个项目,计算其应该获得的额外空间。这可以通过以下步骤完成:

    • 将该项目的 flex-grow 值除以总的 flex-grow 值。
    • 将得到的比例乘以容器的剩余空间。
  • 最后,将计算出的额外空间加到每个项目的原始大小上,得到该项目的最终大小。

以 例子进行说明:

考虑是否可以把 flex-grow 设置的值小于 1,而且 flex-grow 的和也小于 1 呢?只要把上面公式的分母(flex-grow 的和)设置为 1 就好啦!

3. flex-shrink

说完 flex-grow,我们知道了子容器设置了 flex-grow 有可能会被拉伸。那么什么情况下子容器被压缩呢?考虑一种情况:如果子容器宽度超过父容器宽度,即使是设置了 flex-grow,但是由于没有剩余空间,就分配不到剩余空间了。这时候有两个办法:换行和压缩。由于 flex 默认不换行,那么压缩的话,怎么压缩呢,压缩多少?此时就需要用到 flex-shrink 属性了。

flex-shrink属性在MDN上的定义是:

指定了 flex 元素的收缩规则,默认值是 1

此时,剩余空间的概念就转化成了“溢出空间”

计算公式

  1. 计算总的可压缩量

    • 这是所有子元素可以缩小的总量,计算方法是将每个子元素的基础大小乘以其flex-shrink值,然后求和。
    • 公式:总压缩 = 子元素1基础大小 × 子元素1的flex-shrink值 + 子元素2基础大小 × 子元素2的flex-shrink值 + ...
  2. 计算每个子元素的压缩比例

    • 这是每个子元素的可压缩量与其总压缩量的比例。
    • 公式:子元素压缩比例 = (子元素基础大小 × 子元素的flex-shrink值) / 总压缩
  3. 计算每个子元素的实际压缩量

    • 这是基于溢出空间和子元素的压缩比例来计算的。
    • 公式:子元素实际压缩量 = 溢出空间 × 子元素压缩比例
  4. 计算每个子元素的实际宽度

    • 这是子元素的基础宽度减去其实际压缩量。
    • 公式:子元素实际宽度 = 子元素基础宽度 - 子元素实际压缩量

举例说明: 

<!DOCTYPE html>
<html><head><style>.container {margin: 10px;display: flex;width: 500px;height: 200px;background-color: #eee;color: #666;text-align: center;}.item {height: 100px;}.item p {margin: 0;}.a {width: 300px;flex-grow: 1;flex-shrink: 1;background-color: #ff4466;}.b {width: 150px;flex-shrink: 2;background-color: #42b983;}.c {width: 200px;flex-shrink: 3;background-color: #61dafb;}</style>
</head><body><div class="container"><div class="item a"><p>A</p><p> width:300</p><p>flex-shrink: 1</p></div><div class="item b"><p>B</p><p> width:150</p><p>flex-shrink: 2</p></div><div class="item c"><p>C</p><p> width:200</p><p>flex-shrink: 3</p></div></div></body></html>

结果如下:

 

同样,如果出现flex-shrink总和小于1?那么计算溢出空间(收缩总和)的结果有所变化。比如:shrink设置为0.1, 0.2, 0.3, 原溢出空间为200,实际溢出空间:200 * (0.1 + 0.2 + 0.3)/ 1 = 120。

注意:如果子容器没有超出父容器,设置 flex-shrink 无效

4. flex-basis

MDN定义:指定了 flex 元素在主轴方向上的初始大小

一旦 flex item 放进 flex 容器,并不能保证能够按照 flex-basis 设置的大小展示。浏览器会根据 flex-basis 计算主轴是否有剩余空间。既然是跟宽度相关,那么 max-width,min-width,width 和 box 的大小优先级是怎么样的。

举例说明:

<!DOCTYPE html>
<html><head><style>.container {margin: 10px;display: flex;width: 500px;height: 200px;background-color: #eee;text-align: center;line-height: 100px;color: #666;}.item {width: 100px;height: 100px;}.a {flex-basis: 200px;background-color: #ff4466;}.b {max-width: 50px;flex-basis: 150px;background-color: #42b983;}.c {background-color: #61dafb;}</style>
</head><body><div class="container"><div class="item a">A</div><div class="item b">B</div><div class="item c">C</div></div></body></html>

结果如下:

上面的例子可以通过最终元素的宽度看出几个属性的优先级关系:

max-width/min-width > flex-basis > width > box

5. 应用场景

  1. 一种很常见的布局:当内容区域高度不够的时候,footer仍然需要固定在底部。这时候,我们可以给main使用flex-grow: 1,使它自动填满剩余空间。

 

2 . 在我们开发一种常见的表单组件的时候,使用flex布局,可以使输入框占满剩余空间。

 

而大部分场景下我们不希望元素被压缩,所以flex-shrink通常设置为0。

6. 总结

最后,我们需要注意的是:

  • flex items 总和超出 flex 容器,会根据 flex-shrink 的设置进行压缩
  • 如果有剩余空间,如果设置 flex-grow,子容器的实际宽度跟 flex-grow 的设置相关。如果没有设置flex-grow,则按照 flex-basis 展示实际宽度

flex 1

在CSS中,flexflex-grow, flex-shrink, 和 flex-basis 这三个属性的简写形式。当你看到 flex: 1; 这样的声明时,它实际上是设置了以下三个属性:

  1. flex-grow: 1; - 表示如果容器内有多余的空间,这个元素会按照比例增长来占据这些空间。
  2. flex-shrink: 1; - 表示如果容器空间不足,这个元素会按照比例缩小来适应容器。
  3. flex-basis: 0; - 表示在分配多余空间之前,元素的默认大小是0。

简而言之,flex: 1; 会让元素在容器中尽可能地扩展以填充可用空间,同时在需要时也能缩小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147120.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

vscode安装ESLint与Vetur插件后自动修复代码不生效

vscode安装ESLint与Vetur插件后自动修复代码不生效 1、安装ESLint 和 Vuter 2、运行结果 2.1、代码保存时代码中的分号;能被检测出来,但是不会自动修复 2.2、手动运行ESLint 修复命令(在终端中执行 npx eslint . --fix)可以修复问题 3、解决办法 在.vscode目录下setti…

Spring Boot 3.x 配置 Spring Doc以及导入postman带图详解

一、pom.xml配置 <!-- API⽂档⽣成&#xff0c;基于swagger3 --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.0.2</version></dependency>…

STL-set/multiset关联式容器

目录 一、常见接口 1.0 迭代器 1.1 构造函数 1.2 增删查 1.3 查找和统计 二、multiset 2.1 构造 2.2 查找 2.3 删除 2.4 统计 关联式容器是⽤来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;关联式容器逻辑结构通常是⾮线性结构&#xff0c;两个位置有紧密…

JSP分页功能实现案例:从基础到应用的全面解析

想要实现基于jsp的分页功能&#xff1a; 需要从数据库中获取数据&#xff0c;并在前端页面中分页展示 基于JDBC访问MySQL数据库&#xff0c;获取数据基于JSP处理数据并展示 本质上是JSP的一种开发模式&#xff08;即JSPJavaBean&#xff09; 第一步&#xff1a;创建JavaWeb项目…

gitlab 的CI/CD (二)

前言 上文完成了gitlab-runner的基础配置及将gitlab的制品上传至软件包库&#xff08;产品库&#xff09;的脚本编写&#xff1b; 本文实现gitlab的ci/cd对远程服务器的操作&#xff1b; 介绍 要让Gitlab Runner部署到远程机器&#xff0c;远程机器必须信任gitlab runner账…

C++标准库容器类——string类

引言 在c中&#xff0c;string类的引用极大地简化了字符串的操作和管理&#xff0c;相比 C 风格字符串&#xff08;char*或cahr[]&#xff09;&#xff0c;std::string 提供了更高效和更安全的字符串操作。接下来让我们一起来深入学习string类吧&#xff01; 1.string 的构造…

一种WLAN用户综合认证系统及其方法(本人专利号 201110408124.X)

一种WLAN用户综合认证系统及其方法(本人专利号 201110408124.X&#xff09; 本发明公开了一种WLAN用户综合认证系统及其方法&#xff0c;涉及移动通信技术领域。本系统包括WLAN终端与AP子系统和外部认证中心&#xff1b;设置有认证协议分析引擎单元和用户综合控制单元&#xff…

c/c++内存管理(详解) + new与delete的用法及底层

1:c/c内存分布情况 1.1:c/c内存的分布图 1.2:每个区域的用途及不同类型变量存储在那个区 1.3:例题讲解 2:c动态内存管理方式(new delete) 2.1:new的语法 2.2:delete的语法 3:operator new函数与operator delete函数 4:new与delete的实现原理 5:定位new表达式初识 6:mallo…

python+selenium实现自动联网认证,并实现断网重连

pythonselenium实现自动联网认证&#xff0c;并实现断网重连 echo off python “E:\autoD\auto_login.py” 要使自动登录脚本在系统重启后自动运行&#xff0c;你可以使用Windows的任务计划程序来设置。以下是详细的步骤&#xff1a; 1. 保存脚本 首先&#xff0c;将你的Py…

【高分系列卫星简介——高分二号卫星(GF-2)】

高分二号卫星&#xff08;GF-2&#xff09; 高分二号&#xff08;GF-2&#xff09;卫星是中国自主研制的首颗空间分辨率优于1米的民用光学遥感卫星&#xff0c;具有亚米级空间分辨率、高定位精度和快速姿态机动能力等特点&#xff0c;达到了国际先进水平。以下是对高分二号卫星…

对Spring-AI系列源码的讲解

前言 今天&#xff0c;我们将开启对Spring-AI系列源码的讲解。请大家不急不躁&#xff0c;我会逐步深入&#xff0c;每次专注于一个知识点&#xff0c;以防让人感到困惑。 首先&#xff0c;源码的讨论自然离不开自动装配。有人可能会问&#xff0c;之前已经讲解过这个内容了&…

【JavaSE】八种基本数据类型及包装类

数据类型字节数位数值范围包装类默认值整型byte18-128&#xff0c;127Byte0short216&#xff0c;Short0int432&#xff0c;Integer0long864&#xff0c;Long0L浮点型float432Float0.0fdouble864Double0.0d布尔型boolean18true falseBooleanfalse字符型char2160&#xff0c;Char…

C++编程语言:基础设施:异常处理(Bjarne Stroustrup)

第 13 章 异常处理(Exception Handling) 目录 13.1 错误处理(Error Handling) 13.1.1 异常(Exceptions) 13.1.2 传统错误处理(Traditional Error Handling) 13.1.3 探索(Muddling Through) 13.1.4 异常的替代观点(Alternative Views of Exceptions) 13.1.4.1 异步…

DAY78服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE 漏洞

知识点&#xff1a; 1、数据库-Redis-未授权RCE&CVE 2、数据库-Couchdb-未授权RCE&CVE 3、数据库-H2database-未授权RCE&CVE 前置知识 1、复现环境&#xff1a;Vulfocus(官方在线的无法使用&#xff0c;需要自己本地搭建) 官方手册&#xff1a;https://fofapr…

老牛码看JAVA行业现状

一、坏消息深化与反思&#xff1a; 1、技术瓶颈与框架局限&#xff1a;尽管低代码平台崭露头角&#xff0c;为开发效率带来新气象&#xff0c;但其全面普及尚需时日&#xff0c;Java技术栈的进化似乎陷入了暂时的停滞。开发者们渴望突破&#xff0c;却发现传统框架与模式已难以…

博图V16升级V19前后内存对比

升级V19后固件版本更新到4.6 存储存储空间拓展50% 下图是官方解释 打开博图查看前后对比

[笔记]某变频器,功能列表及参数表

产品代号&#xff1a;INVT GOODDRIVE&#xff0c;这家公司我的产品我似乎在特检院看到过&#xff1f;或者在某个地铁建设工地看到过。是深圳的。 1.产品功能点&#xff1a; 变频锥形电机控制、抱闸转矩验证&#xff1f;抱闸反馈零位检测行程限位超载防护轻载升速&#xff08;…

【超详细】基于YOLOv8训练无人机视角Visdrone2019数据集

主要内容如下&#xff1a; 1、Visdrone2019数据集介绍 2、下载、制作YOLO格式训练集 3、模型训练及预测 4、Onnxruntime推理 运行环境&#xff1a;Python3.8&#xff08;要求>3.8&#xff09;&#xff0c;torch1.12.0cu113&#xff08;要求>1.8&#xff09;&#xff0c…

8. 防火墙

8. 防火墙 (1) 防火墙的类型和结构 防火墙的类型和结构可以根据其在网络协议栈中的过滤层次和实现方式进行分类。常见的防火墙类型包括: 包过滤防火墙:工作在网络层(OSI模型的第3层),主要检查IP包头的信息,如源地址、目的地址、端口号等。电路级网关防火墙:工作在会话层…

idea2021git从dev分支合并到主分支master

1、新建分支 新建一个名称为dev的分支&#xff0c;切换到该分支下面&#xff0c;输入新内容 提交代码到dev分支的仓库 2、切换分支 切换到主分支&#xff0c;因为刚刚提交的分支在dev环境&#xff0c;所以master是没有 3、合并分支 点击push&#xff0c;将dev里面的代码合并到…