本节目标

  1. 掌握flex-grow的使用。
  2. 掌握flex-grow放大的计算公式(难点)。
  3. 掌握编写导航条的技巧。

内容摘要

本篇介绍了项目属性 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相比,我们尝试改变容器大小,会发现项目也跟着变化,这个就是弹性的意思了。如下图所示:

本节总结

  1. 容器内未被占用的空间称为剩余空间。

  2. flex-grow用于设置项目的放大系数。

  3. 项目放大尺寸计算包含两个公式:

1)计算将多少剩余空间拿来分配。

公式:剩余空间 * ( 所有项目的flex-grow之和 >= 1 ? 1 : 所有项目的flex-grow之和 ) 。

2)计算每个项目分配到多少剩余空间。

公式:要分配的剩余空间 * ( 单个项目flex-grow / 所有项目的flex-grow之和 )
  1. flex-grow不是设置具体的尺寸,在弹性布局中应用广泛。

flex弹性布局教程-04项目属性flex-grow相关推荐

  1. flex弹性布局教程-03-项目属性flex-basis

    本节目标 掌握 flex-basis 的用法. 了解 flex-basis 和 width 的不同. 阅读时间大约5分钟. 内容摘要 本篇介绍了 flex 项目属性的第一个 flex-basis ,用 ...

  2. flex弹性布局教程-10容器属性justify-content

    本节目标 掌握justify-content的基础使用. 掌握项目多列排列使用justify-content对齐的技巧. 内容摘要 本篇介绍了容器属性justify-content,用来设置项目在主轴 ...

  3. flex弹性布局教程-09-容器属性flex-flow

    本节目标 掌握flex-flow的使用,flex-flow是flex-direction和flex-wrap的合集. 掌握上左右下的布局编写技巧. 内容摘要 本篇介绍了容器属性 flex-flow,是 ...

  4. flex弹性布局教程-07容器属性flex-direction

    本节目标 掌握flex-direction的使用. 了解主轴变化的概念. 内容摘要 本篇讲解了容器属性 flex-direction,用来设置主轴的方向. 阅读时间大约10~15分钟. flex容器属 ...

  5. flex弹性布局教程-12容器属性align-content

    本节目标 掌握align-content的基础使用. 掌握align-content和justify-content的区别. 掌握align-content和align-items的区别. 内容摘要 ...

  6. Flex 弹性布局教程以及对主轴 交叉轴的理解 :语法篇

    弹性布局的主轴交叉轴的理解 容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis).主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main ...

  7. CSS中使用flex弹性布局实现上下左右垂直居中排列并设置子元素之间的间距

    场景 Flex是Flexible Box的缩写,意为"弹性布局". 怎样使用弹性布局实现页面上下两个元素上下左右垂直居中排列. 实现如下类似布局 最外层是是一个div,div里面是 ...

  8. 移动web现状、viewport视口、二倍图、移动web开发主流方案、布局技术选型(流式布局、flex弹性布局、less+rem+媒体查询布局、混合布局、媒体查询、bootstrap)

    移动端web现状: 移动端常见浏览器:UC浏览器,QQ浏览器,Opera浏览器,百度手机浏览器,360安全浏览器,谷歌浏览器,搜狗手机浏览器,猎豹浏览器及杂牌浏览器.移动端常见的浏览器都是基于webk ...

  9. HTML中用弹性布局设置位置,HTML的flex弹性布局

    flex 布局概述 1. flex 是什么flex 是 Flexible Box 的缩写,意为弹性布局 flex 2009 年就已出现,浏览器兼容性很好,请放心使用 2. flex 解决了什么问题块元 ...

最新文章

  1. 深度神经网络是否过拟合?
  2. 网络丢包问题排查总结
  3. Codeforces 1175E Minimal Segment Cover 倍增
  4. 2022年全球及中国燃气供应系统 (FGSS)行业设施规模与十四五布局建设报告
  5. Java基础课程---权限修饰符
  6. php 正则去除script,javascript正则实现php中的加入和去除反斜杠函数效果
  7. 机器学习的最佳学习路线,就在这里!
  8. Python这五个坑,80%你不知道(对的,五个你知道1个就达到一般水平了)
  9. git报错error: src refspec refs/heads/master does not match any.
  10. 关于windows完成端口(IOCP)的一些理解
  11. pyqt界面语言中英文转换
  12. vivo系统升级服务器无响应,vivo系统升级教程
  13. kettle实例-高级转换-数据合并
  14. “远程主机强迫关闭了一个现有连接”问题的解决方法之一
  15. Microsoft (Office) 365本地无法激活解决方案
  16. 想学习影视后期,影视后期行业怎么样?影视后期前景如何、薪资怎么样?
  17. DES加密算法的C++实现
  18. WMS LICENSE PLATE NUMBERS LPN CONTEXT
  19. solr mysql增量导入_10.Solr4.10.3数据导入(DIH全量增量同步Mysql数据)
  20. 万事达卡携手中国银行、北汽鹏龙发布联名信用卡

热门文章

  1. c语言算法有效性,BerForest—C语言学习笔记-《算法》
  2. 国内从事视觉领域的公司
  3. 如何在Mac上刻录DVD以获取可播放的视频?解答来了
  4. HDU 3132 Taunt Exposure Estimation(数学)
  5. 博客园电子期刊2012年9月刊发布啦
  6. 判断sql注入漏洞的类型
  7. 【Android】Bug:SSL peer shut down incorrectly 的解决方法
  8. 调用招商银行接口(手把手教程,附调用接口工具类)
  9. 怎样成为一名优秀的程序员
  10. vscode terminal主题配色