导读:

弹性盒子是 CSS3 的一种布局模式,一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有适当的行为的布局方式。其中 flex 属性用于指定弹性子元素如何分配空间。

flex 属性的值

  • flex-grow flex-shrink flex-basis (flex-grow为扩展比率,flex-shrink为收缩比率,flex-basis为默认基准值)
  • auto (计算值为 1 1 auto)
  • initial (计算值为 0 1 auto)
  • none (计算值为 0 0 auto)
  • inherit (从父元素继承)

所以之前你也许看过:

flex: 0 1 auto;

这样的缩写,它依次包含 flexbox 的 3 个属性,依次是 flex-grow(默认值:0),flex-shrink(默认值:1),flex-basis。本文主要讲解 flexbox 的这三个属性,需要对 flexbox 具有初步的了解。

flex-basis

flex-basis 属性指定了 flex 元素在主轴方向上的初始大小,决定了可伸缩的空间大小(剩余空间)。所以要知道剩余空间的大小,必须先知道 flex-basis 属性的值:

如果没有设置 flex-basis 属性,那么 flex-basis 的大小就是项目的 width 属性的大小。
如果没有设置 width 属性,那么 flex-basis 的大小就是项目内容(content)的大小。

flex-basis 与 flex-grow

首先我们创建一个宽为 1000px 的 flex 容器。然后通过给其子元素定义不同的 flex 属性值来查看它们的布局。

2 0 250px;
0 0 200px;
2 0 150px;

现在我们来计算设置 flex 属性不同值之后每个子元素的宽度。首先,我们来计算剩余空间:

剩余空间 = 容器大小 - 每个子元素的 flex-basis 值的总和

根据上面的例子,这里的 剩余空间 = 1000 - (250 + 200 + 150) = 400

然后剩余空间根据各子元素中 flex-grow 的值平均分配,所以子元素最终的宽度计算为:

每个子元素的最终空间 = 伸缩基准值 + 剩余空间 / (各子元素中 flex-grow) * 对应子元素的 flex-grow

此处第一子元素的宽度计算为:250 + 400/(2+0+2)*2 = 450。第二子元素的宽度计算为:200 + 400/(2+0+2)*0 = 200。第三子元素的宽度计算为:150 + 400/(2+0+2)*2 = 350

flex-basis 与 flex-shrink

flex 元素仅在默认宽度之和大于容器的时候才会发生收缩,其收缩的大小是依据 flex-shrink 的值。flex-shrink 的计算方式与 flex-grow 大有不同,下面我们定义一个宽为 600px 的 flex 容器。然后通过给其子元素定义不同的 flex 属性值(默认宽度之和大于容器)来查看它们的布局。

2 2 200px;
0 1 400px;
2 1 200px;

现在我们要先计算的是负空间:

负空间 = 容器大小 - 每个子元素的 flex-basis 值的总和

在这里 负空间 = 600 - (200+400+200) = -200

其次将每个子元素的收缩比例值乘以各自对应的基准值,再把所得的积累加。

元素空间总和 = 元素一(200) * 元素一的收缩比例(2) + 元素二(400) * 元素二的收缩比例(1) + 元素三(200) * 元素三的收缩比例(1) = 1000

在计算各项的收缩因素(以元素三举例):

各元素收缩因素(三) = 各元素收缩系数(1) * 对应元素的基准值(200) / 元素空间总和(1000) = 0.2

最后计算出各元素收缩的值,从而得到最终的宽度(依然以元素三举例):

各元素收缩值(三) = 对应的收缩因素(0.2) * 负空间(-200) = -40 各元素最终宽度(三) = 基准值(200) + 对应元素的收缩值(-40) = 160

如果各子元素的的 flex-basis 设置为 0 (width也可以),那么计算剩余空间的时候将不会为子容器预留空间。最后呈现出的布局,各子元素空间根据 flex-grow 成比例关系。

flex 属性的运用

有时候我们会需要这样的布局,即让一个 div 永远出现在界面的最底部:当页面内容不足以布满整个屏幕时,该 div 固定在屏幕底部,当内容增加超过页面时,该 div 又固定在页面内容的底部。

实现这个布局的方法有多种,这里介绍一下如何使用弹性盒子的 flex 属性来实现。

HTML结构:

<body>
<div class="content"></div>
<div class="footer"></div>
</body>

CSS结构:

body {
display: -webkit-flex;
display: flex;
-webkit-flex-direction: column;
flex-direction: column;
min-height: 100vh;
}
.content {
-webkit-flex: 1;
flex: 1;
}

写在最后

到此这三个属性之间的计算也就结束了,写得可能有些乱,仅供参考吧,也算作是自己的学习笔记,如果文中有什么错误,欢迎大家指正,愿与大家在交流之中共同进步,愈激烈,愈深刻。感谢。

详解 Flexible Box 中的 flex 属性的更多相关文章

  1. 第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现

    第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现 一.    案例说明 本节将通过一个案例介绍怎么使用property定义快捷的属性访问.案例中使用Rectan ...

  2. 详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别

    详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别 http://blog.sina.com.cn/s/blog_686999de0100jgda.html   实例: ...

  3. 详解 Go 语言中的 time.Duration 类型

    swardsman详解 Go 语言中的 time.Duration 类型swardsman · 2018-03-17 23:10:54 · 5448 次点击 · 预计阅读时间 5 分钟 · 31分钟之 ...

  4. 详解jquery插件中(function ( $, window, document, undefined )的作用。

    1.(function(window,undefined){})(window); Q:(function(window,undefined){})(window);中为什么要将window和unde ...

  5. zz详解深度学习中的Normalization,BN/LN/WN

    详解深度学习中的Normalization,BN/LN/WN 讲得是相当之透彻清晰了 深度神经网络模型训练之难众所周知,其中一个重要的现象就是 Internal Covariate Shift. Ba ...

  6. [转载]详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    [转载]详解网络传输中的三张表,MAC地址表.ARP缓存表以及路由表 虽然学过了计算机网络,但是这部分还是有点乱.正好在网上看到了一篇文章,讲的很透彻,转载过来康康. 本文出自 "邓奇的Bl ...

  7. 详解WebService开发中四个常见问题(2)

    详解WebService开发中四个常见问题(2)   WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...

  8. 详解WebService开发中四个常见问题(1)

    详解WebService开发中四个常见问题(1)   WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...

  9. 详解Python编程中基本的数学计算使用

    详解Python编程中基本的数学计算使用 在Python中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯 ...

随机推荐

  1. hashlib加密模块,加密方式:(MD5,sha级别)

    三,hashlib模块 算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一 ...

  2. js 动态绑定解绑事件

    function addEvent(obj, type, handle) { if (obj.addEventListener) { obj.addEventListener(type, handle ...

  3. SetDefaultDllDirectories问题

    换台电脑编译报错! 在使用Visual Studio 2013编译程序的时候报以下错误 vc\atlmfc\include\atlcore.h(638): error C2039: “”: 不是“`g ...

  4. 力扣——Reverse Nodes in k-Group(K 个一组翻转链表) python实现

    题目描述: 中文: 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序 ...

  5. Node的优点和缺点

    (优点)因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求, 因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多. 此外,与Node代理服务器交互的客户端代 ...

  6. [BOOKS]BIG DATA and DATA ANALYTICS: The Beginner's Guide to Understanding the Analytical World

  7. python学习--第二天 爬取王者荣耀英雄皮肤

    今天目的是爬取所有英雄皮肤 在爬取所有之前,先完成一张皮肤的爬取 打开anacond调出编译器Jupyter Notebook 打开王者荣耀官网 下拉找到位于网页右边的英雄/皮肤 点击[+更多] 进入 ...

  8. 每天一个linux命令:cat(10)

    cat cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用 注意:当文件较大时,文本在屏幕上迅速 ...

  9. POJ 2299 Ultra-QuickSort (树状数组+离散化 求逆序数)

    In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a seque ...

  10. 木棍加工(dp,两个参数的导弹拦截问题)

    题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的:     第一根棍子的准备时间为1分钟:   ...