flex弹性盒示例

1:弹性布局基础介绍:

网页布局(layout)是CSS的一个重点应用。布局的传统解决方式依赖于display+float+position属性实现。这种传统的布局方式能满足大部分需求,但对于一些特殊的布局实现起来很不方便,例如:垂直居中等。

2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。

flex兼容性:

一:Flex布局是什么?

Flex是Flexble Box的缩写,意为"弹性布局",flex用来为盒模型提供最大的灵活性。

弹性盒子是CSS3的一种新的布局方式。是一种当页面需要适应不同的屏幕大小以及设备类型是确保元素拥有恰当的行为的布局方式。 引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列,对齐盒分配空白空间。 弹性盒子由弹性容器(Flex container)和弹性子元素(Flex item)组成。 弹性容器通过设置display属性的值为flex将其定义为弹性容器。 弹性容器内包含一个或多个弹性子元素。

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

.box{ display:flex; }

行内元素也可以使用Flex布局。

span{ display:inline-flex; }

Webkit内核的浏览器,需加上-webkit前缀。

.box{ display:-webkit-flex; display:flex; }

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

二:Flex布局基本概念:

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

容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,

结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。

项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。

三:容器属性:

以下6个属性设置于容器上:

3.1 display

语法:display:flex | inline-flex;

说明:弹性容器通过设置display属性的值为flex或inline-flex将其定义为弹性容器。

flex:将对象作为弹性伸缩盒显示。

inline-flex:将对象作为内联块级弹性伸缩盒显示。

3.2 flex-direction:

语法:flex-direction:row | row-reverse | column | column-reverse;

说明:设置伸缩盒主轴的起点和终点位置,子元素依然按照从主轴起点到终点的方向排列。

row:默认,主轴横向(水平),起点在左侧,终点在右侧。

row-reverse:主轴横向(水平)反转,起点在右侧,终点在左侧。

column:主轴纵向(垂直),起点在上方,终点在下方。

column-reverse:主轴纵向(垂直),起点在下方,终点在上方。

示例:

1
2
3
4
5

3.3 flex-wrap:

语法:flex-wrap:nowrap | wrap | wrap-reverse;

说明:设置或检索伸缩盒对象的子元素超出父容器时是否换行。

nowrap:默认,当子元素溢出父容器时不换行。

wrap:当子元素溢出时自动换行。

wrap-rverse:反转wrap排列。

示例:

1
2
3
4
5
6
7
8

3.4 flex-flow:

语法:flex-flow:<flex-direction> ||<flex-wrap>;

说明:flex-flow属性为flex-direction属性和flex-wrap属性的简写,其默认值为row nowrap。

3.5 justify-content:

语法:justify-content:flex-start | flex-end | center | space-between | space-around;

说明:设置或检索伸缩盒元素在主轴方向上的对齐方式。

flex-start:默认,项目位于容器的开头位置。

flex-end:项目位于容器的结束位置。

center:项目位于容器的中心。

space-between:项目位于各行之间留有空白的容器内。(容器宽度大于子元素宽度时会留有空白,该属性子元素会紧贴容器,然后平分多余宽度。详见示例。)

space-around:项目位于各行之前、之间、之后都留有空白的容器内。(容器宽度大于子元素宽度时会留有空白,该属性子元素会平分多余宽度,但不会紧贴容器。详见示例。)

示例:

1
2
3
4
5

3.6 align-items:

语法:align-items:flex-start | flex-end | center | baseline | stretch;

说明:设置或检索伸缩盒元素在侧轴方向上的对齐方式。

flex-start:项目位于容器的开头位置。

flex-end:项目位于容器的结束位置。

center:项目位于容器的中心。

baseline:将文字对齐

stretch:默认值,如果未设置高,那么元素默认拉伸为父元素高度。

示例:

1
2
3
4
5

3.7 align-content:

语法:align-content: flex-start | flex-end | center | space-between | space-around | stretch;

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

flex-start:与交叉轴的起点对齐。

flex-end:与交叉轴的起点对齐。

center:交叉轴中心对齐。

space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。

space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。

stretch:默认值,轴线占满整个交叉轴。

示例:

1
2
3
4
5
6
7
8
9
10
11
12

四:项目属性:

以下6个属性设置于项目上:

4.1 flex-grow

语法:flex-grow: <number>

说明:flex-grow属性定义项目的放大比例。默认为0,即如果存在剩余空间,也不放大。

属性值:number。

如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。

示例:(项目上标注数字为该项目的放大比例。)

1
2
1
3
2
1

4.2 flex-shrink

语法:flex-shrink: <number>

说明:flex-shrink属性定义项目的缩小比例。默认为1,即如果空间不足,该项目将缩小。

属性值:number。

如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。

示例:(项目上标注数字为该项目的缩小比例。)

1
0
1
2
0
-1

4.3 flex-basis

语法:flex-basis: <number> | auto

说明:flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余的空间。默认值为auto,即项目本来的大小。

属性值:number/auto。

它可以设为像width或height属性一样的值(比如500px),则项目将占据固定空间。

示例:(项目上标注数字为该项目的缩小比例。)

auto
auto
200px

4.4 flex

语法:flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]

说明:flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。

该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。若缩写为flex:1则其计算值为:1 1 0。建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。

示例:

flex:1
flex:auto
flex:none

4.5 order

语法:order:<integer>

说明:order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。

示例:(项目上标注数字为该项目的编号和order属性值。)

①-0
②-(-2)
③-99
④-18
⑤-(-9)
⑥-66

4.6 align-self

语法:align-selt:auto | flex-start | flext-end | center | baseline | stretch;

说明:align-self属性允许单个项目有与其他项目不一样的对齐方式(用于设置自身在侧轴方向上的对齐方式),可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

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

flex-start:项目位于容器的开头位置。

flex-end:项目位于容器的结束位置。

center:项目位于容器的中心。

baseline:将文字对齐

stretch:如果未设置高,那么元素默认拉伸为父元素高度。

示例:

1
2
3
4
5
6

五:布局实例(筛子)

通过flex我们可以快速实现一些较为复杂的布局,以下是一个模拟筛子的小实例(源码打开控制台查看):

5.1:单项目1个点:

5.2:双项目2个点:

5.3:三项目3个点:

5.4:四项目4个点:

5.5:六项目6个点:

5.6:九项目:

5.7:骰子(1-6):

六:布局实例(圣杯布局):

圣杯布局(Holy Grail Layout)指的是一种最常见的网站布局。页面从上到下,分成三个部分:头部(header),躯干(body),尾部(footer)。其中躯干又水平分成三栏,从左到右为:导航、主栏、副栏。

以下将nav以及ads定宽10rem,mian自适应填满整个con区域。当页面width小于600px时会将con的3个部分自动更改为垂直叠加布局,以适应屏幕。

Header
nav
main
ads

六:布局实例(网格布局):

6.1:基本网格布局:

最简单的网格布局,就是平均分布。在容器里面平均分配空间,跟上面的骰子布局很像,但是需要设置项目的自动缩放。

1
1/2
1/2
1/3
1/3
1/3
1/4
1/4
1/4
1/4

6.2:百分比布局:

100%
50%
50%
33.3%
33.3%
33.3%
25%
25%
25%
25%
25%
auto
25%
33.3%
auto
25%

七:布局实例(流式布局):

每行的项目数固定,会自动分行。

终:特别鸣谢:

flex布局的基本属性知识到这里就演示完了,在此非常感谢阮一峰老师发布的相关博客,非常详细的讲解了flex,感谢!

查看阮一峰老师博客:点击这里

作者:飞鸿w