你真的了解弹性布局中的flex属性吗?

关于flex属性,你应该看过很多讲解这样的介绍:

这是“flex-grow”、“flex-shrink”和“flex-basis”三个属性的缩写。其中第二个和第三个参数(flex-shrink、flex-basis)是可选参数。默认值为“0 1 auto”。

{flex: 1 1 auto;}

那么当这三个属性写在一起时,到底是怎么运作的呢,我将在这里引用一个例子来跟大家分享一下,理解不到位的地方还望各位大神多多引导指正,不胜感激!

这是来自于网络的一个例子(点击跳转的源网页))此处引用并附上源代码:

html部分
css部分

flex: 1 1 auto;

该语句使得子元素在父容器中被平均分配,此时他们的均宽应该是116.67px.

下面我们来看一下,在浏览器中的效果:

hover效果

我们可以看到,当对父容器中的div进行hover操作的时候,整个弹性布局中的元素均发生了变化。

源代码中hover操作的时候,父容器中的三个不同颜色的子元素div的宽度变为200px

.flex > div:hover

{

    width: 200px;

}

那么在实际变化过程中,它的宽度真的变为200px了吗?来验证一下!

元素实际宽度

我们可以看到在实际的hover过程中,被hover的元素宽度变为了230px。这是为什么呢?

flex: 1 1 auto;

这行代码起到了关键作用,我们初步理解一下它在该案例中的作用。

一、子元素不溢出的情况

1.flex: 1 1 auto;中的第一个“1”所起到的作用

属性中第一个“1”,代表的是flex-grow属性,定义项目的放大比例,即如果存在剩余空间,他们将对剩余空间进行平均分配,故即便开始在代码中设置了子元素的基础宽度【width:30px;】,他们仍然不受该属性控制将父容器完全占满。

父容器width:350px;

三个子元素的基础宽度:width:30px;

剩余空间:350px-(30px+30px+30px)=260px;

平均分配剩余空间:260px/3=86.67px;

每个子元素加上平均分配的空间以后width均发生改变,为width:30px+86.67px=116.67px;

因此每一个子元素在父容器中所占大小均为116.67px.

实际宽度

2.flex:1 1 auto;中的第二个“1”所起到的作用

属性中的第二个“1”代表flex-shrink,属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。若空间足则不起作用。

hover事件触发以后子元素的宽度将发生改变,如下图:

此处我们可以看到子元素并未将父容器撑满,有一部分多出来的剩余空间,那么第二个“1”,即flex-shrink将不起作用,不会对元素进行收缩,但是第一个“1”即flex-grow属性将再次发挥作用,对剩余空间进行平均分配

平均每份为90px/3=30px;

那么此时三个div的宽度将分别变为230px、60px、60px。

此时得到的就是最终hover的尺寸,大家可以进行验证。

二、子元素溢出的情况

为了验证该算法的正确性,我们将源代码中子元素的基础宽度width改为100px,

1.flex:1 1 auto;中的第一个“1”所起到的作用

与上述子元素不溢出父级容器的情况相类似

三个子元素分别为width:100px;

剩余空间:350px-(100px+100px+100px)=50px;

平均分配剩余空间:50px/3=16.67px;

每个子元素加上平均分配的空间以后width均发生改变,为width:100px+16.67px=116.67px;

2.flex:1 1 auto;中的第二个“1”所起到的作用

属性中的第二个“1”代表flex-shrink,属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。若空间足则不起作用。

我们可以看到此时子元素的总宽度为200px+100px+100px=400px>父级容器宽度350px,那么第二个“1”将开始发挥作用,即等比例收缩。


            shrink的计算方法与grow不同:

            逐个计算:shrink比例 = flex-shrink * item-size / item总和;

            溢出宽度=flex-shrink * item-size的总和-父容器的总和;

            逐个计算:最终宽度=item的宽度-shrink比例*溢出宽度;


具体计算过程:

shrink比例:

                  第一个div:1*200/400=0.5;

                 第二个及第三个div:1*100/400=0.25;

溢出宽度:400-350=50px;

那么每个子元素的缩小比例为:

                   第一个div的width为:200px-0.5*50=175px;

                   第二个及第三个div的width为:100px-0.25*50=87.5px;


综上所述,无论是grow还是shrink其实都与其相关的伸缩比例有着莫大的联系。

好了基本计算就是这么个思路,大家可以拿去进行验证,讲解不到位的地方还望各位多多包涵!

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

推荐阅读更多精彩内容

  • CSS 3中弹性盒布局的最新版概述 在CSS 3中,CSS Flexible Box模块为一个非常重要的模块,该模...
    吾名无双阅读 1,219评论 0 5
  • 移动开发基本知识点 一.使用rem作为单位 html { font-size: 100px; } @media(m...
    横冲直撞666阅读 3,452评论 0 6
  • H5移动端知识点总结 阅读目录 移动开发基本知识点 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇阅读 4,381评论 0 26
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,722评论 1 92
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,727评论 0 2