前言css
flex布局,想必css江湖上的各位侠士都用得不少了,那咱们今天就来讲说flex-item下的几个不太经常使用的属性吧(实际上是鄙人用的很少(┬_┬)而已啦,好奇了解了下)。布局
从容貌上来看,grow,shrink,grow,shrink,哎呦,这不就是我一年下来减肥长胖减肥长胖的节奏么?╭∩╮( ̄▽ ̄)╭∩╮
从字面上的意思来看,就是对flex-item进行身材的改变,很符合flex自适应的概念嘛。那这两个属性究竟是有来嘛意思,有什么用呢?下面就来了解下喽。flex
参照物.net
flex-grow、flex-shrink、flex-basis三姐妹能够被flex属性直接囊括了,flex:flex-grow flex-shrink flex-basis, eg, flex: 0 1 auto;说好的只了解这两个属性的,为何又来了个flex-basis?由于人身材变胖变瘦是要有对照物的嘛,须要和原装元素进行对比才能够。code
flex-basis指item的content宽度,和属性width有着相同的做用,不过二者有着不一样的优先级。
一块儿变成张惠妹rem
好了,那咱们已经有了基本的对照参考值,即容器内item的初始值宽度。咱们看一下下面的这个例子:
父容器container宽度为600px,两个子元素的宽度分别为300px、100px,那么父容器在横轴上并无被彻底填满,可是就是想任性的不想其余人看到元素背后的绿色怎么办~,这个时候咱们就用上了flex-grow,让元素都本身变胖一点喽。get
http://jsfiddle.net/HqRunMan/...it
分别对两个子元素设置了flex-grow,要胖固然是你们一块儿变胖啦。可是flex-grow不同,也就是说两个元素的肥胖因子不太同样, flex-grow越大,被分配余下空间的宽度就越大。容器
remaining(剩余分配空间): 600px - 300px - 100px = 200px 一块儿变胖的承受能力: 1 + 2 = 3 子元素灰灰须要接纳的肉肉宽度: (200 * 1 / 3) px = 66.67px 灰灰新的身体宽度= 300px + 66.67px = 366.67px; 子元素小橘须要接纳的肉肉宽度: (200 * 2 /3) px = 133.33px 小橘新的身体宽度= 100px + 133.33px = 233.33px;
瘦成闪电的誓言还在么自适应
让咱们想象一下,子元素灰灰和小橘在幸福的生活中,越来愈胖,忽然有天他们回家发现这个家的大小再也容不下他们了。伤心欲绝的他们决定使出本身与生俱来的瘦身本领,拿起flex-shrink,一道金光闪过,终于这个家能够容下他们了。
http://jsfiddle.net/HqRunMan/...
容器仍然是600px, 灰灰500px, 小橘300px, 须要一块儿减掉200px才能够。可是灰灰和小橘的瘦身能力明显不同,他们设置了不一样的flex-shrink,分别为1和3。谁的瘦身能力强,谁就多瘦一点喽。瘦掉的这200px须要平分到灰灰加上小橘身上的每个px上。
remaining 须要分配的空间:600px - 500px - 300px = -200px 全部px一块儿变瘦的能力: 1 * 500 + 3 * 300 = 1400 子元素灰灰须要减掉的肉肉宽度 =( -200 * (1 * 500)/1400 )px = -71.42px 瘦身后的灰灰宽度 = 500px -71.42px = 428.58px 子元素小橘须要减掉的肉肉宽度 =( -200 * (3 * 300)/1400 )px = -128.57px 瘦身后的小橘宽度 = 300px - 128.57px = 171.42px
应用一下
讲到这里,不得不动手实现一个老生常谈的题目了“实现一个两列布局”,脑子里飞速旋转一下, BFC、负margin、绝对定位、浮动+calc,还有就是使用flex属性啦,代码check下:
http://jsfiddle.net/HqRunMan/...
左边栏定宽,设置flex: 0 0 auto;关闭了flex-grow和flex-shrink功能,宽度不会随着resize改变;
右侧内容,设置flex:1 1 auto;随着resize自适应宽度。
总结