2009年,W3C 提出了一种新的方案----Flex 布局,可以简易、完整、响应式地实现各种页面布局。目前,它已经得到了所有阅读器的支持,这意味着,现在就能很安全地采用这项性能。
网页布局(layout)是 CSS 的一个重点利用。
布局的传统解决方案,基于盒状模型,依靠display属性 +position属性 +float属性。它对于那些不同凡响布局非常不便捷,比如,垂直居中就不容易实现。
一、Flex 布局是什么?Flex 是 Flexible Box 的缩写,意为弹性布局,用来为盒状模型提供最大的敏捷性。
任何一个容器都可以指定为 Flex 布局。
box{
displayflex;
}行内元素也可以采用 Flex 布局。
box{
displayinline-flex;
}Webkit 内核的阅读器,必要加上-ebkit前缀。
box{
display-ebkit-flex;*Safari*
displayflex;
}留心,设为 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。
三、容器的属性以下6个属性设置在容器上。
flex-direction
flex-rap
flex-flo
justify-content
align-items
align-conten
31 flex-direction属性flex-direction属性决择主轴的方向(即项目标排列方向)。
box{
flex-directionro|ro-reverse|column|column-reverse;
}它可能有4个值。
ro(默认值):主轴为程度方向,起点在左端。
ro-reverse:主轴为程度方向,起点在右端。
column:主轴为垂直方向,起点在上沿。
column-reverse:主轴为垂直方向,起点在下沿
32 flex-rap属性默认场合下,项目都排在一条线(又称轴线)上。flex-rap属性定义,假如一条轴线排不下,如何换行。
box{
flex-rapnorap|rap|rap-reverse;
}它可能取三个值。
(1)norap(默认):不换行。
(2)rap:换行,第一行在上方。
(3)rap-reverse:换行,第一行在下方。
33 flex-floflex-flo属性是flex-direction属性和flex-rap属性的简写格式,默认值为ro norap。
box{
flex-floflex-direction||flex-rap;
}34 justify-content属性justify-content属性定义了项目在主轴上的对齐方式。
box{
justify-contentflex-start|flex-end|center|space-beteen|space-around;
}它可能取5个值,具体对齐方式与轴的方向有关。下面假设主轴为从左到右。
flex-start(默认值):左对齐
flex-end:右对齐
center:居中
space-beteen:两端对齐,项目之间的距离都相等。
space-around:每个项目两侧的距离相等。所以,项目之间的距离比项目与边框的距离大一倍
35 align-items属性align-items属性定义项目在交叉轴上如何对齐。
box{
align-itemsflex-start|flex-end|center|baseline|stretch;
}它可能取5个值。具体的对齐方式与交叉轴的方向有关,下面假设交叉轴从上到下。
flex-start:交叉轴的起点对齐。
flex-end:交叉轴的尽头对齐。
center:交叉轴的中点对齐。
baseline项目标第一行文字的基线对齐。
stretch(默认值):假如项目未设置高度或设为auto,将占满整个容器的高度
36 align-content属性align-content属性定义了多根轴线的对齐方式。假如项目只有一根轴线,该属性不起作用。
box{
align-contentflex-start|flex-end|center|space-beteen|space-around|stretch;
}该属性可能取6个值。
flex-start:与交叉轴的起点对齐。
flex-end:与交叉轴的尽头对齐。
center:与交叉轴的中点对齐。
space-beteen:与交叉轴两端对齐,轴线之间的距离平均分布。
space-around:每根轴线两侧的距离都相等。所以,轴线之间的距离比轴线与边框的距离大一倍。
stretch(默认值):轴线占满整个交叉轴。
四、项目标属性以下6个属性设置在项目上。
order
flex-gro
flex-shrink
flex-basis
flex
align-sel
41 order属性order属性定义项目标排列次序。数值越小,排列越靠前,默以为0。
item{
orderinteger;
}42 flex-gro属性flex-gro属性定义项目标放大比例,默以为0,即假如存在剩余空间,也不放大。
item{
flex-gronumber;*default0*
}假如所有项目标flex-gro属性都为1,则它们将等分剩余空间(假如有的话)。假如一个项目标flex-gro属性为2,其他项目都为1,则前者盘踞的剩余空间将比其他项多一倍。
43 flex-shrink属性flex-shrink属性定义了项目标缩小比例,默以为1,即假如空间缺陷,该项目将缩小。
item{
flex-shrinknumber;*default1*
}假如所有项目标flex-shrink属性都为1,当空间缺陷时,都将等比例缩小。假如一个项目标flex-shrink属性为0,其他项目都为1,则空间缺陷时,前者不缩小。
负值对该属性无效。
44 flex-basis属性flex-basis属性定义了在分配过剩空间之前,项目盘踞的主轴空间(main size)。阅读器依据这个属性,计算主轴是否有过剩空间。它的默认值为auto,即项目标本来大小。
item{
flex-basislength|auto;*defaultauto*
}它可以设为跟th或height属性一样的值(比如350px),则项目将盘踞固定空间。
45 flex属性flex属性是flex-gro,flex-shrink和flex-basis的简写,默认值为0 1 auto。后两个属性可选。
item{
flexnone|[flex-groflex-shrink?||flex-basis]
}该属性有两个快捷值:auto(1 1 auto) 和 none (0 0 auto)。
建议优先采用这个属性,而不是单独写三个分解的属性,由于阅读器会推算相关值。
46 align-self属性align-self属性许可单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示接管父元素的align-items属性,假如没有父元素,则等同于stretch。
item{
align-selfauto|flex-start|flex-end|center|baseline|stretch;
}该属性可能取6个值,除了auto,其他都与align-items属性彻底一致。
box{ displayflex; }行内元素也可以采用 Flex 布局。
box{ displayinline-flex; }Webkit 内核的阅读器,必要加上-ebkit前缀。
box{ display-ebkit-flex;*Safari* displayflex; }留心,设为 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。
三、容器的属性
以下6个属性设置在容器上。
flex-direction flex-rap flex-flo justify-content align-items align-conten
31 flex-direction属性
flex-direction属性决择主轴的方向(即项目标排列方向)。
box{ flex-directionro|ro-reverse|column|column-reverse; }它可能有4个值。
ro(默认值):主轴为程度方向,起点在左端。 ro-reverse:主轴为程度方向,起点在右端。 column:主轴为垂直方向,起点在上沿。 column-reverse:主轴为垂直方向,起点在下沿
32 flex-rap属性
默认场合下,项目都排在一条线(又称轴线)上。flex-rap属性定义,假如一条轴线排不下,如何换行。
box{ flex-rapnorap|rap|rap-reverse; }它可能取三个值。
(1)norap(默认):不换行。
(2)rap:换行,第一行在上方。
(3)rap-reverse:换行,第一行在下方。
33 flex-flo
flex-flo属性是flex-direction属性和flex-rap属性的简写格式,默认值为ro norap。
box{ flex-floflex-direction||flex-rap; }34 justify-content属性
justify-content属性定义了项目在主轴上的对齐方式。
box{ justify-contentflex-start|flex-end|center|space-beteen|space-around; }它可能取5个值,具体对齐方式与轴的方向有关。下面假设主轴为从左到右。
flex-start(默认值):左对齐 flex-end:右对齐 center:居中 space-beteen:两端对齐,项目之间的距离都相等。 space-around:每个项目两侧的距离相等。所以,项目之间的距离比项目与边框的距离大一倍
35 align-items属性
align-items属性定义项目在交叉轴上如何对齐。
box{ align-itemsflex-start|flex-end|center|baseline|stretch; }它可能取5个值。具体的对齐方式与交叉轴的方向有关,下面假设交叉轴从上到下。
flex-start:交叉轴的起点对齐。 flex-end:交叉轴的尽头对齐。 center:交叉轴的中点对齐。 baseline项目标第一行文字的基线对齐。 stretch(默认值):假如项目未设置高度或设为auto,将占满整个容器的高度
36 align-content属性
align-content属性定义了多根轴线的对齐方式。假如项目只有一根轴线,该属性不起作用。
box{ align-contentflex-start|flex-end|center|space-beteen|space-around|stretch; }该属性可能取6个值。
flex-start:与交叉轴的起点对齐。 flex-end:与交叉轴的尽头对齐。 center:与交叉轴的中点对齐。 space-beteen:与交叉轴两端对齐,轴线之间的距离平均分布。 space-around:每根轴线两侧的距离都相等。所以,轴线之间的距离比轴线与边框的距离大一倍。 stretch(默认值):轴线占满整个交叉轴。
四、项目标属性
以下6个属性设置在项目上。
order flex-gro flex-shrink flex-basis flex align-sel
41 order属性
order属性定义项目标排列次序。数值越小,排列越靠前,默以为0。
item{ orderinteger; }42 flex-gro属性
flex-gro属性定义项目标放大比例,默以为0,即假如存在剩余空间,也不放大。
item{ flex-gronumber;*default0* }假如所有项目标flex-gro属性都为1,则它们将等分剩余空间(假如有的话)。假如一个项目标flex-gro属性为2,其他项目都为1,则前者盘踞的剩余空间将比其他项多一倍。
43 flex-shrink属性
flex-shrink属性定义了项目标缩小比例,默以为1,即假如空间缺陷,该项目将缩小。
item{ flex-shrinknumber;*default1* }假如所有项目标flex-shrink属性都为1,当空间缺陷时,都将等比例缩小。假如一个项目标flex-shrink属性为0,其他项目都为1,则空间缺陷时,前者不缩小。
负值对该属性无效。
44 flex-basis属性
flex-basis属性定义了在分配过剩空间之前,项目盘踞的主轴空间(main size)。阅读器依据这个属性,计算主轴是否有过剩空间。它的默认值为auto,即项目标本来大小。
item{ flex-basislength|auto;*defaultauto* }它可以设为跟th或height属性一样的值(比如350px),则项目将盘踞固定空间。
45 flex属性
flex属性是flex-gro,flex-shrink和flex-basis的简写,默认值为0 1 auto。后两个属性可选。
item{ flexnone|[flex-groflex-shrink?||flex-basis] }该属性有两个快捷值:auto(1 1 auto) 和 none (0 0 auto)。
建议优先采用这个属性,而不是单独写三个分解的属性,由于阅读器会推算相关值。
46 align-self属性
align-self属性许可单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示接管父元素的align-items属性,假如没有父元素,则等同于stretch。
item{ align-selfauto|flex-start|flex-end|center|baseline|stretch; }该属性可能取6个值,除了auto,其他都与align-items属性彻底一致。