@king-
2017-03-08T19:19:55.000000Z
字数 4974
阅读 1235
web前端开发
CSS
梅斯前端培训
网页布局是前端开发中的一大核心重点
最老的 Table 布局时代已过, 而如今的盒模型布局(依赖与display/position/flat的布局形式),也总让人感觉对特殊布局的各种不方便,比如:“垂直剧中”,“底部对齐”等等。
所以2009年,W3C提出了一种新的方案---- Flex 布局,可以简便、完整、响应式地实现各种页面布局。
Flex布局将成为未来布局的首选方案,但是IE浏览器兼容的滞后,导致了flex并没有得到所有前端开发人员的普及。
--这个锅必须IE来背!
1.任何一个容器都可以指定为Flex布局
.warp{
display:flex;
}
//行内元素也可以使用Flex布局
.warp{
display:inline-flex;
}
2.为了保障很好的兼容性,需要在使用的时候添加厂商名
.warp{
display: box; /* OLD - Android 4.4- */
display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */
display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */
display: -ms-flexbox; /* TWEENER - IE 10 */
display: -webkit-flex; /* NEW - Chrome */
display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */
}
3.设为Flex布局以后,子元素的float、clear和vertical-align属性将失效
采用Flex布局的元素,称为Flex容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称"项目"
容器默认存在两根轴:水平的主轴(main axis)和 垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。
项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。
下面的属性是设置在容器上的
flex-direction --- 决定主轴的方向(即项目的排列方向)
flex-wrap --- 控制“容器”是单行或者多行,同时横轴的方向决定了新行堆叠的方向
flex-flow --- 是 flex-direction 属性和 flex-wrap 属性的简写形式
justify-content --- 定义了项目在主轴上的对齐方式
align-items --- 定义项目在交叉轴上如何对齐
align-content --- 定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用
通过定义“容器”的主轴方向来决定“项目”在“容器”中的位置
.warp{
flex-direction: column-reverse | column | row | row-reverse;
}
默认情况下,项目都排在一条线(又称"轴线")上。flex-wrap属性定义,如果一条轴线排不下,如何换行
.warp{
flex-wrap: nowrap | wrap | wrap-reverse;
}
3.flex-flow
复合属性。设置或检索弹性盒模型对象的子元素排列方式。
是 flex-direction 属性和 flex-wrap 属性的简写形式
.warp {
flex-flow: <flex-direction> || <flex-wrap>;
}
4.justify-content
设置或检索弹性盒子元素在主轴(横轴)方向上的对齐方式
当弹性盒里一行上的所有子元素都不能伸缩或已经达到其最大值时,这一属性可协助对多余的空间进行分配。当元素溢出某行时,这一属性同样会在对齐上进行控制。
.warp {
justify-content: flex-start | flex-end | center | space-between | space-around;
}
5.align-items
定义flex子项在flex容器的当前行的纵轴(侧轴)方向上的对齐方式
.warp {
align-items: flex-start | flex-end | center | baseline | stretch;
}
6.align-content
定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用
.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
下面的属性是设置在容器内部各个项目上的
order --- 定义项目的排列顺序。数值越小,排列越靠前,默认为0。
flex-grow --- 定义弹性盒的扩展比率
flex-shrink --- 定义弹性盒的收缩比率
flex-basis --- 定义弹性盒伸缩基准值
flex --- 是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。
align-self --- 允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性
1.order
定义项目的排列顺序。数值越小,排列越靠前,默认为0。
.item {
order: <integer>;
}
备注:
1.用整数值来定义排列顺序,数值小的排在前面。可以为负值。
2.order定义将会影响 <' position '> 值为static元素的层叠级别,数值小的会被数值大的盖住
2.flex-grow
定义弹性盒的扩展比率
.item {
flex-grow: <number>; /* default 0 */
}
计算方法
<ul class="flex">
<li>a</li>
<li>b</li>
<li>c</li>
</ul>
.flex{display:flex;width:600px;margin:0;padding:0;list-style:none;}
.flex li:nth-child(1){width:200px;}
.flex li:nth-child(2){flex-grow:1;width:50px;}
.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
定义弹性盒的收缩比率
.item {
flex-shrink: <number>; /* default 1 */
}
计算方法
<ul class="flex">
<li>a</li>
<li>b</li>
<li>c</li>
</ul>
.flex{display:flex;width:400px;margin:0;padding:0;list-style:none;}
.flex li{width:200px;}
.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
定义弹性盒伸缩基准值
如果所有子元素的基准值之和大于剩余空间,则会根据每项设置的基准值,按比率伸缩剩余空间
.item {
flex-basis: <length> | auto; /* default auto */
}
比如:
容器大小为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。
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
6.align-self
允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性
默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}