flex弹性布局教程-04项目属性flex-grow
本节目标
- 掌握flex-grow的使用。
- 掌握flex-grow放大的计算公式(难点)。
- 掌握编写导航条的技巧。
内容摘要
本篇介绍了项目属性 flex-grow,用于定义项目的扩大系数,用于分配容器的剩余空间。
阅读时间约10~15分钟,文字虽多,但主要都是例子。
flex-grow基础
flex-grow 属性定义项目的扩大系数,用于分配容器的剩余空间,那么什么是剩余空间呢?
其实非常简单,剩余空间计算方式就是:
容器大小 减去 所有项目的总大小
参考如下示例:
其中:
1. 每个项目的宽度为50px,3个为150px。
2. 剩余空间为 450px - 150px = 300px。
语法格式:
.item {/* >=0 的数,默认值为 0 */flex-grow: <number>;
}
其中:
1. 默认为 0 ,即如果容器存在剩余空间,也不放大。
2. flex-grow只能为>=0的数字,项目根据设置的系数进行放大。
那么问题就来了:
项目是如何根据设置的系数分配剩余空间呢?
这边涉及到两个关键公式:
1)计算将多少剩余空间拿来分配。
公式:剩余空间 * ( 所有项目的flex-grow之和 >= 1 ? 1 : 所有项目的flex-grow之和 ) 。
这边用了一个三元表达式,理解不难,公式的意思就是说:
如果 所有项目的flex-grow之和 大于等于1,那么就是所有的剩余空间都拿来分配,否则乘以系数即为要分配的剩余空间。
2)计算每个项目分配到多少剩余空间。
公式:要分配的剩余空间 * ( 单个项目flex-grow / 所有项目的flex-grow之和 )
简单的说,就是按照 flex-grow 占比进行分配。
下面我们结合例子进行说明,对这边的计算公式进行理解。
示例1,设置项目的flex-grow为1:
接上一篇例子,有一个div(容器,450px),容器内包含3个div(项目,各50px)。
.item {/* flex-basis属性定义了项目占据主轴空间(main size)大小。 *//* 这边设置为50px */flex-basis: 50px;/* flex-grow 属性定义项目的扩大系数 *//* 这边设置为1 */flex-grow: 1;
}
运行效果:
我们观察到3个项目的宽度都变成了150px,可以看到项目被进行了扩大。
现在套公式看下情况:
1)计算总共要分配多少剩余空间。
要分配的剩余空间= 剩余空间 * ( 所有项目的flex-grow之和 >= 1 ? 1 : 所有项目的flex-grow之和 ) = 300px * (3 >= 1 ? 1 : 3)= 300px * 1= 300px
2)计算每个项目分配到多少剩余空间。
因为每个项目flex-grow都为1,所以每个项目分配的剩余空间都一样。
每个项目分配的剩余空间= 要分配的剩余空间 * ( 单个项目flex-grow / 所有项目的flex-grow之和 )= 300px * ( 1 / 3)= 100px
每个项目多分配100px,加上自身设置的flex-basis,最终每个项目宽度就为150px了。
示例2,设置项目1的flex-grow为1,项目2的flex-grow为2,项目3的flex-grow为3:
我们直接套公式计算:
1)计算总共要分配多少剩余空间。
要分配的剩余空间= 剩余空间 * ( 所有项目的flex-grow之和 >= 1 ? 1 : 所有项目的flex-grow之和 ) = 300px * (6 >= 1 ? 1 : 6)= 300px * 1= 300px
2)计算每个项目分配到多少剩余空间。
因为每个项目flex-grow都不一样,所以每个项目分配的剩余空间要分开计算。
项目1分配的剩余空间= 要分配的剩余空间 * ( 项目1flex-grow / 所有项目的flex-grow之和 )= 300px * ( 1 / 6)= 50px项目2分配的剩余空间= 要分配的剩余空间 * ( 项目2flex-grow / 所有项目的flex-grow之和 )= 300px * ( 2 / 6)= 100px项目3分配的剩余空间= 要分配的剩余空间 * ( 项目3flex-grow / 所有项目的flex-grow之和 )= 300px * ( 3 / 6)= 150px
所以最终:项目1宽为100px、项目2宽为150px、项目3宽为200px。
写上代码看看效果:
.item {/* flex-basis属性定义了项目占据主轴空间(main size)大小。 *//* 这边设置为50px */flex-basis: 50px;
}
.item1 {flex-grow: 1;
}.item2 {flex-grow: 2;
}.item3 {flex-grow: 3;
}
运行效果:
观察运行效果,符合预期。
示例3:设置项目1的 flex-grow 为 0.1,项目2的 flex-grow 为0.2,项目3的 flex-grow 为 0.3:
这个示例和上例差不多,只是数字变成了小数,并且总和不大于1。
先套公式来计算一下:
1)计算总共要分配多少剩余空间。
要分配的剩余空间= 剩余空间 * ( 所有项目的flex-grow之和 >= 1 ? 1 : 所有项目的flex-grow之和 ) = 300px * (0.6 >= 1 ? 1 : 0.6)= 300px * 0.6= 180px
2)计算每个项目分配到多少剩余空间。
因为每个项目flex-grow都不一样,所以每个项目分配的剩余空间要分开计算。
项目1分配的剩余空间= 要分配的剩余空间 * ( 项目1flex-grow / 所有项目的flex-grow之和 )= 180px * ( 0.1 / 0.6)= 30px项目2分配的剩余空间= 要分配的剩余空间 * ( 项目2flex-grow / 所有项目的flex-grow之和 )= 180px * ( 0.2 / 0.6)= 60px项目3分配的剩余空间= 要分配的剩余空间 * ( 项目3flex-grow / 所有项目的flex-grow之和 )= 180px * ( 0.3 / 0.6)= 90px
所以最终:项目1宽为80px、项目2宽为110px、项目3宽为140px。
样式代码如下:
.item {/* flex-basis属性定义了项目占据主轴空间(main size)大小。 */flex-basis: 50px;
}.item1 {/* flex-grow属性定义项目的放大比例 */flex-grow: 0.1;
}.item2 {/* flex-grow属性定义项目的放大比例 */flex-grow: 0.2;
}.item3 {/* flex-grow属性定义项目的放大比例 */flex-grow: 0.3;
}
运行效果如下:
符合计算预期。
flow-grow应用
flow-grow属性在项目中运用很多,比如页面布局、导航条、分页等。
实例1:使用 flex 弹性布局实现如下效果:
这个其实就是腾讯首页的导航条了,我们模拟实现一下,步骤分为4步:
1)首先先写html标签,标签很简单一个 nav 包含若干 a 标签:
<nav class="container"><a class="item" href="#">新闻</a><a class="item" href="#">视频</a><a class="item" href="#">图片</a><a class="item" href="#">军事</a><a class="item" href="#">体育</a><a class="item" href="#">NBA</a><a class="item" href="#">娱乐</a><a class="item" href="#">财经</a><a class="item" href="#">科技</a>
</nav>
2)设置基本样式,背景、颜色、边框圆角等:
.container {height: 44px;background-color: #1479d7;border-radius: 3px;
}.item {color: white;text-align: center;text-decoration: none;
}
运行效果:
3)设置容器为 flex 布局,项目 flex-grow 为1 平分剩余空间:
.container {/* 设置子元素的布局为flex布局 */display: flex;
}.item {/* 设置项目放大系数 */flex-grow: 1;
}
运行效果:
4)再来一个上下居中即可,flex 弹性布局将容器属性 align-items 设置为 center 即可:
.container {/* 设置交叉轴上项目居中排列 */align-items: center;
}
运行效果:
至此这个例子就完成了。
和之前使用float相比,我们尝试改变容器大小,会发现项目也跟着变化,这个就是弹性的意思了。如下图所示:
本节总结
容器内未被占用的空间称为剩余空间。
flex-grow用于设置项目的放大系数。
项目放大尺寸计算包含两个公式:
1)计算将多少剩余空间拿来分配。
公式:剩余空间 * ( 所有项目的flex-grow之和 >= 1 ? 1 : 所有项目的flex-grow之和 ) 。
2)计算每个项目分配到多少剩余空间。
公式:要分配的剩余空间 * ( 单个项目flex-grow / 所有项目的flex-grow之和 )
- flex-grow不是设置具体的尺寸,在弹性布局中应用广泛。
flex弹性布局教程-04项目属性flex-grow相关推荐
- flex弹性布局教程-03-项目属性flex-basis
本节目标 掌握 flex-basis 的用法. 了解 flex-basis 和 width 的不同. 阅读时间大约5分钟. 内容摘要 本篇介绍了 flex 项目属性的第一个 flex-basis ,用 ...
- flex弹性布局教程-10容器属性justify-content
本节目标 掌握justify-content的基础使用. 掌握项目多列排列使用justify-content对齐的技巧. 内容摘要 本篇介绍了容器属性justify-content,用来设置项目在主轴 ...
- flex弹性布局教程-09-容器属性flex-flow
本节目标 掌握flex-flow的使用,flex-flow是flex-direction和flex-wrap的合集. 掌握上左右下的布局编写技巧. 内容摘要 本篇介绍了容器属性 flex-flow,是 ...
- flex弹性布局教程-07容器属性flex-direction
本节目标 掌握flex-direction的使用. 了解主轴变化的概念. 内容摘要 本篇讲解了容器属性 flex-direction,用来设置主轴的方向. 阅读时间大约10~15分钟. flex容器属 ...
- flex弹性布局教程-12容器属性align-content
本节目标 掌握align-content的基础使用. 掌握align-content和justify-content的区别. 掌握align-content和align-items的区别. 内容摘要 ...
- Flex 弹性布局教程以及对主轴 交叉轴的理解 :语法篇
弹性布局的主轴交叉轴的理解 容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis).主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main ...
- CSS中使用flex弹性布局实现上下左右垂直居中排列并设置子元素之间的间距
场景 Flex是Flexible Box的缩写,意为"弹性布局". 怎样使用弹性布局实现页面上下两个元素上下左右垂直居中排列. 实现如下类似布局 最外层是是一个div,div里面是 ...
- 移动web现状、viewport视口、二倍图、移动web开发主流方案、布局技术选型(流式布局、flex弹性布局、less+rem+媒体查询布局、混合布局、媒体查询、bootstrap)
移动端web现状: 移动端常见浏览器:UC浏览器,QQ浏览器,Opera浏览器,百度手机浏览器,360安全浏览器,谷歌浏览器,搜狗手机浏览器,猎豹浏览器及杂牌浏览器.移动端常见的浏览器都是基于webk ...
- HTML中用弹性布局设置位置,HTML的flex弹性布局
flex 布局概述 1. flex 是什么flex 是 Flexible Box 的缩写,意为弹性布局 flex 2009 年就已出现,浏览器兼容性很好,请放心使用 2. flex 解决了什么问题块元 ...
最新文章
- 深度神经网络是否过拟合?
- 网络丢包问题排查总结
- Codeforces 1175E Minimal Segment Cover 倍增
- 2022年全球及中国燃气供应系统 (FGSS)行业设施规模与十四五布局建设报告
- Java基础课程---权限修饰符
- php 正则去除script,javascript正则实现php中的加入和去除反斜杠函数效果
- 机器学习的最佳学习路线,就在这里!
- Python这五个坑,80%你不知道(对的,五个你知道1个就达到一般水平了)
- git报错error: src refspec refs/heads/master does not match any.
- 关于windows完成端口(IOCP)的一些理解
- pyqt界面语言中英文转换
- vivo系统升级服务器无响应,vivo系统升级教程
- kettle实例-高级转换-数据合并
- “远程主机强迫关闭了一个现有连接”问题的解决方法之一
- Microsoft (Office) 365本地无法激活解决方案
- 想学习影视后期,影视后期行业怎么样?影视后期前景如何、薪资怎么样?
- DES加密算法的C++实现
- WMS LICENSE PLATE NUMBERS LPN CONTEXT
- solr mysql增量导入_10.Solr4.10.3数据导入(DIH全量增量同步Mysql数据)
- 万事达卡携手中国银行、北汽鹏龙发布联名信用卡