传统布局方案,基于盒状模型,依赖 display
属性 + position
属性 + float
属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。
2009年,W3C 提出了一种新的方案—-Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。
Flex 布局是什么?】
Flex 是 Flexible Box
的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。弹性盒子由弹性容器(Flex container
)和弹性子元素(Flex item
)组成。弹性容器内包含了一个或多个弹性子元素。
任何一个容器都可以指定为 Flex 布局。
.box{ display: flex; }
行内元素也可以使用 Flex 布局。
.box{ display: inline-flex; }
Webkit 内核的浏览器,必须加上-webkit前缀。
.box{ display: -webkit-flex; /* chrome & Safari */ display: flex; }
注意:弹性容器外及弹性子元素内是正常渲染的。弹性盒子只定义了弹性子元素如何在弹性容器内布局。设为 Flex 布局以后,子元素的float
、clear
和vertical-align
属性将失效。
弹性盒子属性
- 主轴(main axis),主轴区域(main dimension)。弹性容器的主轴指的是弹性元素主要沿着哪个方向布局。它在主轴区域中延伸。
- 主轴起点(main-Start),主轴终点(main-end)。弹性元素被放置于容器中从主轴起点到主轴终点放置。
- 主轴尺寸(main size),主轴尺寸属性(main size property)。一个弹性元素的主轴尺寸指的是其在主轴区域内的长度。其主轴尺寸属性指的是其对应的属性。
- 侧轴(cross axis),侧轴区域(cross dimension)。侧轴垂直于主轴。它在侧轴区域中延伸。
- 侧轴起点(cross-Start),侧轴终点(cross-end)。浮动行被元素填充,并且在容器中沿侧轴方向从起点向终点分布。
- 侧轴尺寸(cross size),侧轴尺寸属性(cross size property)。一个弹性元素的侧轴尺寸指的是其在侧轴区域内的长度。其侧轴尺寸属性指的是其对应的属性
弹性容器属性
1、flex-direction属性
flex-direction
属性决定主轴的方向(即弹性子元素在父容器中的排列方向)。
语法
flex-direction: row | row-reverse | column | column-reverse ;
参数值解析:
row
:横向从左到右排列(左对齐),默认的排列方式。row-reverse
:反转横向排列(右对齐,从后往前排,最后一项排在最前面。-
column
:纵向排列。 column-reverse
:反转纵向排列,从后往前排,最后一项排在最上面。
具体效果如下(或点击这里查看demo):
2、flex-wrap 属性
flex-wrap
属性用于指定弹性盒子的子元素换行方式。并且定义了侧轴的方向,新行将沿侧轴方向堆砌。
语法
flex-wrap: nowrap | wrap | wrap-reverse | initial | inherit ;
参数值解析:
nowrap
:默认值,不换行。该情况下弹性子项可能会溢出容器。wrap
:换行,第一行在上方。该情况下弹性子项溢出的部分会被放置到新行,子项内部会发生断行。wrap-reverse
:反转 wrap 排列。
具体效果如下(或点击这里查看demo):
3、flex-flow 属性
flex-flow
属性是 flex-direction
属性和 flex-wrap
属性的简写形式,可以同时定义主轴和侧轴,默认值为 row nowrap
左对齐且不换行。
4、justify-content 属性
justify-content
属性设置子元素在主轴(横轴)方向上的对齐方式。
语法:
justify-content: flex-start | flex-end | center | space-between | space-around ;
参数值解析:
flex-start
:默认值,行头紧挨着(左对齐)。flex-end
:行尾紧挨着(右对齐)。center
:居中紧挨着(居中对齐)。
(如果剩余空间是负的,则子元素将在两个方向上同时溢出)。space-between
:两端对齐,项目之间的间隔都相等。
如果剩余空间为负或者只有一个弹性项,则该值等同于flex-start。否则,第1个弹性项的外边距和行的main-start边线对齐,而最后1个弹性项的外边距和行的main-end边线对齐,然后剩余的弹性项分布在该行上,相邻项目的间隔相等。space-around
:子元素两侧的间隔相等(子元素之间的间隔比子元素与边框的间隔大一倍)。
弹性项目平均分布在该行上,两边留有一半的间隔空间。如果剩余空间为负或者只有一个弹性项,则该值等同于center。否则,弹性项目沿该行分布,且彼此间隔相等(比如是20px),同时首尾两边和弹性容器之间留有一半的间隔(1/2*20px=10px)。
具体效果如下(或点击这里查看demo):
5、align-items 属性
align-items
设置或检索弹性盒子元素在侧轴(纵轴)方向上的对齐方式。
语法
align-items: flex-start | flex-end | center | baseline | stretch ;
参数值解析:
flex-start
:侧轴(纵轴)起点对齐。flex-end
:侧轴(纵轴)终点对齐。center
:侧轴(纵轴)居中对齐。(如果该行的尺寸小于弹性盒子元素的尺寸,则会向两个方向溢出相同的长度)baseline
:第一行文字的基线对齐。(如果弹性盒子元素的行内轴与侧轴为同一条,则该值与’flex-start’等效)stretch
:默认值,如果子元素未设置高度或设为auto,将占满整个容器的高度。
6、align-content 属性
align-content
属性设置多根轴线的对齐方式(修改 flex-wrap
属性的行为)。类似于 align-items
, 但它不是设置弹性子元素的对齐,而是设置各个行的对齐。如果项目只有一根轴线,该属性不起作用。
语法
align-content: flex-start | flex-end | center | space-between | space-around | stretch ;
参数值解析:
flex-start
:各行在起点对齐。flex-end
:各行在终点对齐。center
:各行居中对齐。space-between
:两端对齐。各行在弹性盒容器中平均分布,两端子元素对齐边线。space-around
:各行在弹性盒容器中平均分布,两端保留子元素之间间距大小的一半。stretch
:默认。各行将会伸展以占用剩余的空间。(如果子元素未设置高度或设为auto ,各行子元素将会伸展以占满整个容器的高度。)
弹性子元素属性
(1)、order 属性
order
属性定义子元素的排列顺序。数值越小,排列越靠前,默认为0。
语法
order: <integer>
参数值解析:
<integer>
:用整数值来定义排列顺序,数值小的排在前面。可以为负值。
(2)、align-self 属性
align-self
属性用于设置弹性子元素在侧轴(纵轴)方向上的对齐方式。允许单个子元素有与其他子元素不一样的对齐方式,可覆盖父元素的 align-items
属性。
语法
align-self: auto | flex-start | flex-end | center | baseline | stretch ;
参数值解析:
auto
:默认值,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。flex-start
:侧轴(纵轴)起点对齐。flex-end
:侧轴(纵轴)终点对齐。center
:侧轴(纵轴)居中对齐。(如果该行的尺寸小于弹性盒子元素的尺寸,则会向两个方向溢出相同的长度)baseline
:第一行文字的基线对齐。(如果弹性盒子元素的行内轴与侧轴为同一条,则该值与’flex-start’等效)stretch
:默认值,如果子元素未设置高度或设为auto,将占满整个容器的高度。
(3)、flex-grow 属性
flex-grow
属性设置弹性子元素的放大比例,默认为0,即如果存在剩余空间,也不放大。
语法
flex-grow: <number>;
如果所有子元素的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个子元素的flex-grow属性为2,其他都为1,则前者占据的剩余空间将比其他项多一倍。
(4)、flex-shrink 属性
flex-shrink
属性设置弹性子元素的缩小比例,默认为1,即如果空间不足,该项目将缩小。
语法
flex-shrink: <number>;
如果所有子元素的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个子元素的flex-shrink属性为0,其他都为1,则空间不足时,前者不缩小。负值对该属性无效。
(5)、flex-basis 属性
flex-basis
属性定义弹性盒子元素的默认基准值。
定义了在分配多余空间之前,弹性子元素占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。
语法
flex-basis: <length> | auto;
它的默认值为auto,即项目的本来大小。它可以设为跟width或height属性一样的值(比如300px),则子元素将占据固定空间。
(6)、flex 属性
flex
属性用于指定弹性子元素如何分配空间。是flex-grow, flex-shrink
和 flex-basis
的简写,默认值为0 1 auto
。后两个属性可选。
语法
flex:none | [ flex-grow ] || [ flex-shrink ] || [ flex-basis ] ;
参数值解析:
none:none
关键字的计算值为: 0 0 auto[ flex-grow ]
:定义弹性盒子元素的放大比例。[ flex-shrink ]
:定义弹性盒子元素的缩小比例。[ flex-basis ]
:定义弹性盒子元素的默认基准值。
该属性有两个快捷值:auto (1 1 auto)
和 none (0 0 auto)
。
建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。
评论前必须登录!
注册