一文搞懂Flex弹性布局空间分配规则

news/2025/9/25 15:11:53/文章来源:https://www.cnblogs.com/xwwin/p/19103970

前情

早期css布局使用最多的就是浮动,后面出了Flex后,就基本抛弃了浮动的使用,基本每个项目起手就是FLex,特别是小程序端,官方就是主推的Flex布局,所以Flex布局在我平时开发中有的非常多,也是非常好用的布局方式,相比以前你得费一些周折的布局方式,现在都能轻轻松松实现,用的多但是有一些计算细节其实也是理解不是特别深的,flex布局中有一个flex复合属性,用于控制弹性盒子子元素尺寸的,分开就是flex-basis+flex-grow+flex-shrink,最近在B站看到一个介绍Flex的视频其中说详细讲到 了计算逻辑的内容,感觉干货挺多,特此记录

各属性功能描述

flex-basis

定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小,它可以设为跟width或height属性一样的值(比如200px),则项目将占据固定空间

.item {flex-basis: <length> | auto; /* 默认值为auto */
}

flex-grow

定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大;如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍

.item {flex-grow: <number>; /* 默认值为 0 */
}

flex-shrink

定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小;如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小,负值对该属性无效

.item {flex-shrink: <number>; /* 默认值为 1 */
}

Flex空间分配逻辑

Flex空间分配的三步法:

第一步计算所有子元素basis的总和

第二步比较容器宽度和总的basis宽度的

第三步计算容器宽度

总的basis小于容器宽度,应用flex-grow

总的basis大于容器宽度,应用flex-shrink

总的basis等于容器宽度,无需伸缩

整个流程图如下:

image

计算公式如下图:

image 1

计算实战

当空间充足时,flex-grow生效,元素尺寸变大一起加大多余的空间

当前项的最终宽度 = basis + (容器宽度-总的basis) * 当前项的grow/总的grow,下面来看一个示例

关键代码如下:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width"><title>JS Bin</title>
</head>
<body><div class="container"><div class="a">a</div><div class="b">b</div><div class="c">c</div></div>
</body>
</html>
.container{width:600px;height: 168px;display: flex;flex-direction: row;
}
.a{flex:1 1 0;background-color: red;
}
.b{flex:2 1 auto;width: 200px;background-color: green;
}
.c{flex:3 1 100px;background-color: blue;
}

演示地址:https://jsbin.com/fibecijohi/edit?html,css,output

计算解析:

Flex容器container下有三个子项分别为a,b,c

容器的宽度为600

总的basis = 0(a)+200(b)+100(s) = 300

总的grow = 1(a)+2(b)+3(c) = 6

a项的宽度= 0 + (600 - 300) * 1/6 = 50

b项的宽度= 200 + (600 - 300) * 2/6 = 300

c项的宽度= 100 + (600 - 300) *3/6 = 250

PixPin_2025-09-21_17-25-56

当空间不足时,flex-shrink生效,元素尺寸变小一起减小不足的空间

当前项的最终宽度 = basis - (总的basis - 容器宽度) * (当前项的basis * 当前项的sthrink)/(各元素的basic * 各元素的shrink之和),下面来看一个示例

代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<div class="container"><div class="a">a</div><div class="b">b</div><div class="c">c</div>
</div>
</body>
</html>
.container{width:600px;height: 168px;display: flex;flex-direction: row;
}
.a{flex:1 1 200px;background-color: red;
}
.b{flex:1 3 auto;width: 400px;background-color: green;
}
.c{flex:1 2 100px;background-color: blue;
}

演示地址:https://jsbin.com/barihazasi/edit?html,css,js,output

计算解析:

Flex容器container下有三个子项分别为a,b,c

容器的宽度为600

总的basis = 200(a)+400(b)+100(s) = 700

a项的宽度= 200 - (700 - 600) * 1200/(1200 + 3400 + 2100) = 200 - 100 *200/1600 = 187.5

b项的宽度= 400 - (700 - 600) * 3400/(1200 + 3400 + 2100) = 400 - 100 * 1200/1600 = 325

c项的宽度= 100 - (700 - 600) * 2100/(1200 + 3400 + 2100) = 100 - 100 * 200/1600 = 87.5

PixPin_2025-09-21_17-48-04

总结

一直有在用Flex,也大概知道是按比例计算余下多的或少的空间,但并没有深入研究,今天在B站看到详细介绍计算逻辑的视频真的茅塞顿开,计算逻辑总结如下:

  • 一切始于flex-basis:它决定了是进入扩张模式还是收缩模式
  • 空间充足时,分配空间:系统根据flex-grow的比例分配余下空间
  • 空间不足时,压缩空间:系统根据flex-basis和flex-shrink共同决定的权重分梭压缩量

个人知识有限,如果你有更好的解析方法,希望不吝分享,一起学习一起进步

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“小身材的大心脏”——HT-AD3PS-1+ 在成都恒利泰的射频江湖里到底做了什么?

“小身材的大心脏”——HT-AD3PS-1+ 在成都恒利泰的射频江湖里到底做了什么?“小身材的大心脏”——HT-AD3PS-1+ 在成都恒利泰的射频江湖里到底做了什么? 最近帮客户做一套“又要轻、又要稳、还要耐得住高低温”的射…

AT_agc012_c [AGC012C] Tautonym Puzzle 题目分析

# AT_agc012_c [AGC012C] Tautonym Puzzle## 题目描述当字符串 $ x $ 满足以下条件时,称 $ x $ 为*好字符串*。- 条件:$ x $ 可以表示为某个长度不少于 $ 1 $ 的字符串 $ y $ 重复两次所得的字符串 $ yy $。例如,`a…

电子商务网站建设pdfwordpress怎么重新安装

文章目录 一、初识TypeScript1、安装TypeScript2、Hello TypeScript 二、结合项目---配置1、tsconfig.jsontsconfig.json 重要字段compilerOptions 每个选项的详细说明 2、ts-loader 三、语法1、基本类型2、类型注解3、函数4、接口5、类6、泛型 四、结合项目---vue3结合使用 一…

详细介绍:回调函数与错误处理

详细介绍:回调函数与错误处理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

Django系列(七)HttpRequest(请求)和HttpResponse(响应)对象

一、概述 Django 使用请求和响应对象在系统中传递状态。 当一个页面被请求时,Django 会创建一个 HttpRequest 对象,这个对象包含了请求的元数据。然后,Django 加载相应的视图,将 HttpRequest 作为视图函数的第一个…

值得收藏!GraphRAG:助力大模型突破“健忘”困局,构建逻辑化升级

值得收藏!GraphRAG:助力大模型突破“健忘”困局,构建逻辑化升级pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

工业主板:智能制造与严苛环境的坚实基石

在自动化生产线的精细控制、智能交通系统的稳定运行、医疗影像设备的可靠运转背后,工业主板扮演着不可或缺的重要角色。它不同于我们日常使用的消费级电脑主板,是为应对复杂严苛的工业环境而生的”专业心脏”。理解工…

12建网站电商眼

1.must :相当于and 2.must_not :相当于not 3.should:相当于or 4. filter:过滤 gte 大于 gt大于 lte小于等于 lt小于 使用示例&#xff1a; {“bool”:{“must”:{“match”:{“title”:”how to make millons “}},“must_not”:{“match”:{“tag”:”spam“}},“should”:[{…

网站开发的后端注册网站会员 我们的信息

春去秋来&#xff0c;一个轮回又一年。“ 你知道F518创意园开园多久了吗&#xff1f;对的&#xff0c;13年&#xff01;”作为深圳实施“腾笼换鸟”首批项目和深圳申请联合国科教文组织“设计之都”重要组成部分&#xff0c;我们开园至今已经13年了&#xff01;白驹过隙&#x…

标题。

你好,20231302 邱之钊!很高兴看到你正在学习Linux C编程,这对你未来在国产化操作系统上的就业非常有帮助。我会根据你的中等基础,详细讲解每个步骤,帮助你更好地理解和掌握这些知识。让我们一起努力,逐步完成这些…

虚拟机下的麒麟V10SP1与SP2进行iSCSI连接——基于MobaXterm

好的!作为小白,我会带你一步一步完成 iSCSI 存储管理的配置。我会用最详细的方式解释每个步骤,确保你能完全理解。🎯 准备工作:理解你的环境 根据你的描述,你的环境是: Windows 11 主机 VMware Workstation 17…

中断的基本概念

在计算机执行程序的过程中,出现某些需要紧急处理的特殊情况或者特殊请求,cpu暂时终止现行程序。而转去对这些特殊情况处理,处理完毕后在返回到原程序的断点处。 工作流程 1.中断请求 中断源向cpu发送中断请求信号 2…

郑州市科协网站做农村电子商务的网站有哪些内容

LANMP简介 LANMP是指一组通常用来搭建动态网站或者服务器的开源软件&#xff0c;本身都是各自独立的程序&#xff0c;但是因为常被放在一起使用&#xff0c;拥有了越来越高的兼容度&#xff0c;共同组成了一个强大的Web应用程序平台。 L:指Linux&#xff0c;一类Unix计算机操作…

AT_arc173_e [ARC173E] Rearrange and Adjacent XOR

好家伙,标签一出来给我假完了。 刚开始以为是拆位对于每一位的每一层去做贪心,结果发现假了。 有一个很显然的性质是,答案一定由原序列若干个数异或得到,现在我们需要观察这些数有什么性质。 我们再仔细一想,如果…

修复gradle8使用Transform第一个构建中断第二次构建失败的问题:java.io.IOException: Unable to delete directory xxxx\build

问题描述 使用了gradle编译插件,编译插件使用的是Transform处理字节码,如果第一次ctrl+c中断或者其它原因中断,下次再次构建会出现build文件夹清理不了的问题 Execution failed for task :my-module:my-submodule:c…

.NET操作Word/WPS打造专业文档 - 页面设置与打印控制完全指南

本文将详细介绍如何使用MudTools.OfficeInterop.Word库来设置页面参数、管理页眉页脚以及控制文档打印。我们将深入探讨从基础的纸张设置到高级的分节页面控制,从简单的页眉页脚到复杂的多区域布局,以及如何精确控制…

NORDIC蓝牙6.0新品NRF54L15多协议超低功耗高性能BLE芯片 - 动能世纪

NRF54L15,NRF54L10,NRF54L05 是NORDIC推出的高性能,多协议,低功耗BLE6.0芯片 产品简介 增强的多协议支持nRF54L 系列支持低功耗蓝牙、蓝牙 Mesh、Thread、Matter、Zigbee、Amazon Sidewalk 和 2.4 GHz 专有协议,并…

记录:git、.${index}. 滚动条

解决问题:从底层找,从最开始的位置打日志,一步步节点去找问题发生的位置 记录、统计:各环境账号。。。上线:需要准备的资源、账号、人员 去掉debugger 1、提交代码;2、dev,fat,本地各种自测;3、new tag,改动…

快速入门HarmonyOS应用开发(三) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …