【CSS3】flex、flex-grow、flex-shrink、flex-basis属性

flex 可以说是一次性解决了前端布局的所有的问题(当然,并没有完全解决,要不然也不会有 grid layout 了),以前很难实现的布局效果在 flex 下简直不能更简单,以至于一些其它平台也开始吸纳 flex 的布局思想,也有些开源项目把 flex 的布局方式移植到其它平台。

本文的示例布局如下:

<div class="container">
    <div class="left"></div>
    <div class="right"></div>
</div>

flex-grow的计算方式

当子元素宽度的总和 < 父元素宽度,那么此时就会按照flex-grow进行伸缩布局。样式如下:

.container {
    width: 600px;
    height: 300px;
    display: flex;
}

.left {
    width: 300px;
    flex-grow: 1;
    background-color: orange;
}

.right {
    width: 200px;
    flex-grow: 2;
    background-color: pink;
}

可以看到,子元素left宽度+right宽度 = 500px。宽度总和是没有父元素container的宽度大的,剩余的100px将会根据flex-grow平分分配给left和right元素。left的flex-grow = 1,right的flex-grow = 2,所以,剩余空间被分配为3份,1份分给left,2份分给right,所以left、right宽度的计算公式如下:

left: 300 + ( 600 - ( 300 + 200 ) ) * 1 / 3 = 333.33
right: 200 + ( 600 - ( 300 + 200 ) ) * 2 / 3 = 266.67

flex-shrink的计算方式

当子元素宽度的总和 > 父元素宽度,那么此时就会按照flex-shrink进行压缩布局。样式如下:

.container {
    width: 600px;
    height: 300px;
    display: flex;
}

.left {
    width: 500px;
    flex-grow: 1;
    flex-shrink: 2;
    background-color: orange;
}

.right {
    width: 400px;
    flex-grow: 2;
    flex-shrink: 1;
    background-color: pink;
}

可以看到,left和right的宽度总和(900)明显大于父元素的宽度600,所以需要按照shrink进行压缩。计算方法是宽度 - 超出宽度 x (权重宽度 / 总权重宽度)

// 超出宽度
const overWidth = Math.abs(600 - (500 + 400)) = 300
// 总权重宽度
const totalWeightWidth = 500 x 2 + 400 x 1 = 1400
// 计算left宽度 right宽度
const left = 500 - 300 * ((2 * 500 ) / 1400) = 285.71
const right = 400 - 300 * ((1 * 400 ) / 1400) = 314.29

flex-basis

flex-basis的默认值为auto,他指定了 flex 元素在主轴方向上的初始大小。

  • flex-basis为0时,那么元素初始大小尽可能的小
  • flex-basis为auto时,那么元素宽度会交给flex布局进行自适应
  • flex-basis为指定大小时,那么元素会按照这个初始大小上在flex布局中进行改变

flex

flex属性是flex-grow flex-shrink flex-basic的简写,其中后两个属性值可以省略。其默认值flex: 0 1 auto

参考

https://zhuanlan.zhihu.com/p/24372279

面试题目
https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/381
https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/382

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

推荐阅读更多精彩内容