[关闭]
@king- 2017-03-08T19:19:55.000000Z 字数 4974 阅读 1235

Flex 布局

web前端开发 CSS 梅斯前端培训


网页布局是前端开发中的一大核心重点

最老的 Table 布局时代已过, 而如今的盒模型布局(依赖与display/position/flat的布局形式),也总让人感觉对特殊布局的各种不方便,比如:“垂直剧中”,“底部对齐”等等。

所以2009年W3C提出了一种新的方案---- Flex 布局,可以简便、完整、响应式地实现各种页面布局。

一、浏览器支持情况

flex 浏览器支持情况

Flex布局将成为未来布局的首选方案,但是IE浏览器兼容的滞后,导致了flex并没有得到所有前端开发人员的普及。

--这个锅必须IE来背!

二、flex使用的注意事项

1.任何一个容器都可以指定为Flex布局

  1. .warp{
  2. display:flex;
  3. }
  4. //行内元素也可以使用Flex布局
  5. .warp{
  6. display:inline-flex;
  7. }

2.为了保障很好的兼容性,需要在使用的时候添加厂商名

  1. .warp{
  2. display: box; /* OLD - Android 4.4- */
  3. display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */
  4. display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */
  5. display: -ms-flexbox; /* TWEENER - IE 10 */
  6. display: -webkit-flex; /* NEW - Chrome */
  7. display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */
  8. }

3.设为Flex布局以后,子元素的float、clear和vertical-align属性将失效

三、flex基本概念

采用Flex布局的元素,称为Flex容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称"项目"

Flex 模型

容器默认存在两根轴:水平的主轴(main axis)和 垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。
项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。

四、容器(flex container)的属性

下面的属性是设置在容器上的

  1. flex-direction --- 决定主轴的方向(即项目的排列方向)
  2. flex-wrap --- 控制“容器”是单行或者多行,同时横轴的方向决定了新行堆叠的方向
  3. flex-flow --- flex-direction 属性和 flex-wrap 属性的简写形式
  4. justify-content --- 定义了项目在主轴上的对齐方式
  5. align-items --- 定义项目在交叉轴上如何对齐
  6. align-content --- 定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用


  1. flex-direction

    通过定义“容器”的主轴方向来决定“项目”在“容器”中的位置
  1. .warp{
  2. flex-direction: column-reverse | column | row | row-reverse;
  3. }

效果对照图

flex-direction Demo


  1. flex-wrap

    默认情况下,项目都排在一条线(又称"轴线")上。flex-wrap属性定义,如果一条轴线排不下,如何换行


水平方向是否允许换行

  1. .warp{
  2. flex-wrap: nowrap | wrap | wrap-reverse;
  3. }

flex-warp Demo

3.flex-flow

复合属性。设置或检索弹性盒模型对象的子元素排列方式。
flex-direction 属性和 flex-wrap 属性的简写形式

  1. .warp {
  2. flex-flow: <flex-direction> || <flex-wrap>;
  3. }

flex-flow Demo

4.justify-content

设置或检索弹性盒子元素在主轴(横轴)方向上的对齐方式

当弹性盒里一行上的所有子元素都不能伸缩或已经达到其最大值时,这一属性可协助对多余的空间进行分配。当元素溢出某行时,这一属性同样会在对齐上进行控制。

  1. .warp {
  2. justify-content: flex-start | flex-end | center | space-between | space-around;
  3. }

效果图

justify-content Demo

5.align-items

定义flex子项在flex容器的当前行的纵轴(侧轴)方向上的对齐方式

  1. .warp {
  2. align-items: flex-start | flex-end | center | baseline | stretch;
  3. }

效果图

align-items Demo

6.align-content

定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用

  1. .box {
  2. align-content: flex-start | flex-end | center | space-between | space-around | stretch;
  3. }

示例图

align-content Demo

五、项目(flex item)的属性

下面的属性是设置在容器内部各个项目上的

  1. order --- 定义项目的排列顺序。数值越小,排列越靠前,默认为0
  2. flex-grow --- 定义弹性盒的扩展比率
  3. flex-shrink --- 定义弹性盒的收缩比率
  4. flex-basis --- 定义弹性盒伸缩基准值
  5. flex --- flex-grow, flex-shrink flex-basis的简写,默认值为0 1 auto
  6. align-self --- 允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性

1.order

定义项目的排列顺序。数值越小,排列越靠前,默认为0。

  1. .item {
  2. order: <integer>;
  3. }

示例图

order Demo

备注:
1.用整数值来定义排列顺序,数值小的排在前面。可以为负值。
2.order定义将会影响 <' position '> 值为static元素的层叠级别,数值小的会被数值大的盖住

2.flex-grow

定义弹性盒的扩展比率

  1. .item {
  2. flex-grow: <number>; /* default 0 */
  3. }

计算方法

  1. <ul class="flex">
  2. <li>a</li>
  3. <li>b</li>
  4. <li>c</li>
  5. </ul>
  6. .flex{display:flex;width:600px;margin:0;padding:0;list-style:none;}
  7. .flex li:nth-child(1){width:200px;}
  8. .flex li:nth-child(2){flex-grow:1;width:50px;}
  9. .flex li:nth-child(3){flex-grow:3;width:50px;}

flex-grow的默认值为0,如果没有显示定义该属性,是不会拥有分配剩余空间权利的。

本例中b,c两项都显式的定义了flex-grow,flex容器的剩余空间分成了4份,其中b占1份,c占3分,即1:3
flex容器的剩余空间长度为:600-200-50-50=300px,所以最终a,b,c的长度分别为:
a: 200+(300/4*0)=200px
b: 50+(300/4*1)=125px
a: 50+(300/4*3)=275px

3.flex-shrink

定义弹性盒的收缩比率

  1. .item {
  2. flex-shrink: <number>; /* default 1 */
  3. }

计算方法

  1. <ul class="flex">
  2. <li>a</li>
  3. <li>b</li>
  4. <li>c</li>
  5. </ul>
  6. .flex{display:flex;width:400px;margin:0;padding:0;list-style:none;}
  7. .flex li{width:200px;}
  8. .flex li:nth-child(3){flex-shrink:3;}

flex-shrink的默认值为1,如果没有显示定义该属性,将会自动按照默认值1在所有因子相加之后计算比率来进行空间收缩。

本例中c显式的定义了flex-shrink,a,b没有显式定义,但将根据默认值1来计算,可以看到总共将剩余空间分成了5份,其中a占1份,b占1份,c占3分,即1:1:3

我们可以看到父容器定义为400px,子项被定义为200px,相加之后即为600px,超出父容器200px。那么这么超出的200px需要被a,b,c消化

通过收缩因子,所以加权综合可得200*1+200*1+200*3=1000px;
于是我们可以计算a,b,c将被移除的溢出量是多少:
a被移除溢出量:(200*1/1000)*200,即约等于40px
b被移除溢出量:(200*1/1000)*200,即约等于40px
c被移除溢出量:(200*3/1000)*200,即约等于120px
最后a,b,c的实际宽度分别为:200-40=160px, 200-40=160px, 200-120=80px

4.flex-basis

定义弹性盒伸缩基准值

如果所有子元素的基准值之和大于剩余空间,则会根据每项设置的基准值,按比率伸缩剩余空间

  1. .item {
  2. flex-basis: <length> | auto; /* default auto */
  3. }

比如:
容器大小为600px,盒子内有6个元素,设置宽度为100px;其中第二个盒子的基准值被设置为600px,求当前各个盒子的大小。

容器:600px; 原来盒内元素:100px * 6 = 600px;

设置后的盒内元素: 100px*5+600px*1 = 1100px;

真实盒内元素:100px(600px/1100px) = 54.5px; 和 600px(600px/1100px) = 327.27px;

当然px是不带小数的。

5.flex

是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。

  1. .item {
  2. flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
  3. }

6.align-self

允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性

默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

  1. .item {
  2. align-self: auto | flex-start | flex-end | center | baseline | stretch;
  3. }

示例图

align-self Demo

六、总结

七、开发实战

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注