深入理解 flex 相关属性

按作用目标划分

作用在父容器上 作用在子项上
flex-direction flex-grow
flex-wrap flex-shrink
flex-flow flex-basis
justify-content flex
align-items align-self
align-content order

注意: 父、子只是一个相对的概念,可以根据实际应用情况进行拓展

需要深入理解的几个属性

flex-grow 和 flex-shrink 原理

flex-grow 父级宽度大于子项宽度总和的情况生效,表示子项如何扩展
flex-shrink 父级宽度小于子项宽度总和的情况生效,表示子项如何收缩
二者接收的值都是数字,flex-grow 默认值为 0(表示:子项不扩展,父级多余的宽度会空着),flex-shrink 默认值为 1(表示:子项宽度总和超出父级的宽度的部分,在每一个子项都要收回来,并且每个子项收缩的量相等)

以下示例父容器为 flex,宽度350px,子项有五项:
一、flex-grow
设置各子项的宽度为 50px ,这时子项宽度总和小于flex容器宽度,父容器剩余宽度 100px

  1. 如果不设置flex-grow,默认每一项都没有扩展,剩余的空间(宽度 100px)就白在那里了,如下图
    五项 flex-grow 均为 0 的情形
  1. 接1,只有其中一项设置了扩展数(数字任意),则这一项独占剩余空间,如下图


    第一项设置了flex-grow,其余项仍为0

3.其中两项都设置扩展数,如下图


前面两项都设置了flex-grow:1,其余项仍为0

可以看出前两项等分了剩余的100px,每一项宽度都增加了50px;

4.给每一项都设置扩展数,如下图

依次设置扩展数为1,2,3,4,5

可以看出每一项都参与了瓜分剩余的100px,在原本自身宽度的基础上进行了扩展,归结下来:
第一项(flex-grow: 1)扩展了宽度: 100/(1+2+3+4+5)*1px
...
第五项(flex-grow: 5)扩展了宽度:100/(1+2+3+4+5)*5px
flex-grow 就是一个份额,父级剩余宽度被所有子项的 flex-grow 加起来的总份额进行切分,子项按自己所设置的份额进行扩展。所以当 flex 容器只有一个子项设置了 flex-grow 数值的时候,无论这个数值设置为多少,当父容器宽度有剩余时,都是这个子项独占。父容器设置为换行的情况同理。

二、flex-shrink
设置各子项的宽度为 80px ,这时子项宽度总和大于flex容器宽度,超出了 50px
1.如果不设置flex-shrink,默认每一项都会收缩,并且每一项收缩的宽度是一样的,如下图
2.接1,只给第一项设置收缩数为0,则只有这一项不会收缩,如下图

第一项设置了flex-shrink为0,不收缩

同理,给前三项设置flex-shrink为0,则前三项都不收缩,最后两项分别收缩25px
2.前三项前三项设置flex-shrink为0,第四项不设置,第五项flex-shrink为4,如下图
不设置flex-shrink和设置了flex-shrink大于0的项按比例收缩

伸缩量计算逻辑基本上和扩展量的计算相同,但是不同之处在于,不设置 flex-shrink 的子项它的收缩占比默认是1,其余各项按其设置的数字占比进行计算,flex-shrink 为0的项不会收缩。通常在父容器设置为 nowrap 的情况生效。


flex-basis

当父容器的 flex-direction 设置为 row 时,子项的 flex-basis 控制 宽度,此时设置 width 不生效;
当父容器的 flex-direction 设置为 column 时,子项的 flex-basis 控制 高度,此时设置 height 不生效;
也就是说,flex-basis 仅作用在主轴,当主轴方向为行时,虽然此时设置 width 不生效,但是设置 height 仍然是生效的,二者结合起来就可以定义子项的尺寸。
但是,当某个子项相对于父容器设置了绝对定位时,flex-basis 不生效,只有 width 和 height 生效。
参考:https://stackoverflow.com/questions/34352140/what-are-the-differences-between-flex-basis-and-width

flex

有三种取值的可能:
1.一个值的情况,表示 flex-grow (数字)或者 flex-basis (百分比或带单位的数字)
2.两个值的情况,表示 flex-grow flex-shrink(两个数字)或者 flex-grow flex-basis(一个数字和一个百分比或带单位的数字)
3.三个值的情况,表示flex-grow flex-shrink flex-basis(两个数字和一个百分比或带单位的数字)

justify-content 与 align-content

justify-content 指的是水平方向上子元素如何分布,戳这里
justify-content 经常用到的几个属性值:
center
space-around
space-between
space-evenly
flex-start
align-content 指的是竖直方向上子元素如何分布,戳这里

align-items 与 align-self

align-items 针对父容器下的所有子元素,戳这里
align-self 针对单个子元素,戳这里

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351