当前位置: 首页 > CSS3学习笔记 > 正文

CSS3 新版弹性盒子模型(Flex Box)

传统布局方案,基于盒状模型,依赖 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 布局以后,子元素的floatclearvertical-align属性将失效。

弹性盒子属性

placeholder

  • 主轴(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):
flex-direction属性 主轴的方向

2、flex-wrap 属性

flex-wrap 属性用于指定弹性盒子的子元素换行方式。并且定义了侧轴的方向,新行将沿侧轴方向堆砌。

语法

flex-wrap: nowrap | wrap | wrap-reverse | initial | inherit ;

参数值解析:

  • nowrap:默认值,不换行。该情况下弹性子项可能会溢出容器。
  • wrap:换行,第一行在上方。该情况下弹性子项溢出的部分会被放置到新行,子项内部会发生断行。
  • wrap-reverse:反转 wrap 排列。

具体效果如下(或点击这里查看demo):
flex-wrap属性 子元素换行方式

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):
justify-content属性

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-shrinkflex-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)

建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。

CSS3 新版弹性盒子模型(Flex Box):等您来吐槽!

CSS3 新版弹性盒子模型(Flex Box):等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!