flex基础语法介绍

《轴线与网格》里主要讲述了gridflex中,网格与轴线的基本概念,了解了这些基本概念之后,我们可以更轻松地对布局方式进行研究,这一篇文章主要描述flex布局中,定义在容器与项目的相关属性。

本篇文章是依据我个人的所学所知,且部分参考国内外优秀的flex布局的相关文献总结而得。

定义在容器的属性

disaplay

display属性定义了一个弹性盒子容器,容器是展现为行内或块状由所给定的值而决定,此时,他的所有子元素进入flex文档流,称为伸缩项目。

  1. .box {
  2. display: flex;
  3. }

定义行内容器的flex布局:

  1. .box {
  2. display:inline-flex;
  3. }

对于safiri浏览器,需要加上webkit前缀(以前遇到过,深坑啊!)

  1. .box {
  2. display:webkit-flex;
  3. display:flex;
  4. }

此外,请注意以下两点:

  • CSS的columns在伸缩容器上没有效果。
  • float、clear和vertical-align在伸缩项目上没有效果。

    flex-direction

    flex-direction定义主轴的方向。因主轴是二维空间的矢量,因此flex-direction有四个值,分别代表了x轴与y轴的正方向与反方向。
    1. .box {
    2. flex-direction: row | row-reverse | column | column-reverse;
    3. }

image

  • row为默认值,代表主轴为水平轴,方向为从左到右。
  • row-reverse代表主轴为水平轴,方向为从右到左。
  • column代表主轴为垂直轴,方向为从上到下。
  • column-reverse代表主轴为垂直轴,方向为从下到上。

flex-wrap

flex-wrap定义flex项目是否换行显示。默认情况下,flex项目会尽可能地显示在一行当中,即默认值为nowarp

  1. .box {
  2. flex-wrap: nowrap | wrap | wrap-reverse;
  3. }

image

  • nowrap为默认值,代表不换行。
  • wrap代表换行,但默认为第一行在上方。
  • wrap-reverse代表换行,但默认为第一行在下方。

flex-flow

flex-flowflex-directionflex-wrap的合并写法,它同时定义了主轴方向与容器内项目的换行方式,其默认值为row nowarp

  1. .box {
  2. flex-flow: <‘flex-direction’> || <‘flex-wrap’>;
  3. }

justify-content

justify-content定义了项目在主轴上的对齐方式,但请注意:justify-content只会在主轴项目仍具有剩余空间时才会起作用。

利用此API,我们便能很容易地实现:等分宽高了。

  1. .box {
  2. justify-content: flex-start | flex-end | center | space-between | space-around;
  3. }

image

  • flex-start为默认值,代表项目在主轴上向起始方向对齐。
  • flex-end代表项目在主轴上向结束方向对齐。
  • center代表项目在主轴上居中对齐。
  • space-between代表项目在主轴上两端对齐,但第一个项目在主轴的起始位置,最后一个项目在主轴的结束位置。
  • space-around代表项目在主轴上等分间距,但第一个项目与最后一个项目距离主轴的两端保持一定的距离,这个距离为项目之间间距的1/2。

align-items

align-items定义了项目在交叉轴上的对齐方式。可以把它想像成交叉轴的justify-content

  1. .box {
  2. align-items: flex-start | flex-end | center | baseline | stretch;
  3. }

image

  • flex-start代表项目在交叉轴上向起始方向对齐。
  • flex-end代表项目在交叉轴上向结束方向对齐。
  • center代表项目在交叉轴上居中对齐。
  • baseline代表项目在交叉轴上向项目的第一行文字的基线对齐。
  • stretch代表项目在交叉轴上拉伸对齐。

align-content

当我们把容器的flex-warp的值设置为warp或者warp-reverse时,若项目不能在一根主轴上显示,容器便会出现多根主轴。

此时便需要一个值来定义多根平行轴线的对齐方式,这个值便是align-content

  1. .box {
  2. align-content: flex-start | flex-end | center | space-between | space-around | stretch;
  3. }

image

  • flex-start代表多条平行的主轴在交叉轴的起始位置对齐。
  • flex-end代表多条平行的主轴在交叉轴的结束位置对齐。
  • center代表多条平行的主轴在交叉轴上居中对齐。
  • space-between代表多条平行的主轴在交叉轴上两端对齐,但第一条主轴在交叉轴的起始位置,最后一条主轴在交叉轴的结束位置。
  • space-around代表多条平行的主轴在交叉轴上等分间距,但第一条主轴与最后一条主轴距离主轴的两端保持一定的距离,这个距离为其它主轴之间间距的1/2。
  • stretch为默认值,代表多条平行的主轴拉伸对齐。

定义在项目上的属性

order

order定义项目在主轴上的排列顺序。数值越小,排列越靠前,默认值为0。

在默认情况下,项目在主轴上的排列顺序是依据它们在HTML文档中出现的先后顺序排列的。因我们可以通过控制文档流的先后顺序,故此API的使用情况不太普遍。

  1. .item {
  2. order: <integer>;
  3. }

image

flex-grow

flex-grow定义了项目的放大比例。如果所有伸缩项目的flex-grow设置了1,那么每个伸缩项目将设置为一个大小相等的剩余空间。如果你给其中一个伸缩项目设置了flex-grow值为2,那么这个伸缩项目所占的剩余空间是其他伸缩项目所占剩余空间的两倍

注意:负值对该属性无效。

  1. .item {
  2. flex-grow: <number>; /* default 0 */
  3. }

image

flex-shrink

类似于flex-growflex-shrink定义了项目的缩小比例。其默认值为1

如果所有项目的flex-shrink都为1,当空间不足时,都将等比例缩小。

如果所有项目都为1,但其中一个项目的flex-shrink0,即代表空间不足时,该项目缩小0倍,即为不缩小。

注意:负值对该属性不起作用。

image

flex-basis

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

  1. .item {
  2. flex-basis: <length> | auto; /* default auto */
  3. }

利用flex-basis,我们可以很容易实现页面布局中的常见问题:两栏/三栏布局

  1. <div class="box">
  2. <div class="left">left</div>
  3. <div class="main">main</div>
  4. </div>
  1. .box {
  2. display: flex;
  3. height: 200px;
  4. }
  5. .left {
  6. background-color: yellow;
  7. flex-basis: 200px;
  8. /* flex-basis定义该项目在分配主轴空间之前提前获得200px的空间 */
  9. flex-grow: 0;
  10. /* flex-grow定义该项目不分配剩余空间 */
  11. }
  12. .main {
  13. background-color: green;
  14. flex-grow: 1;
  15. /* flex-grow定义main占满剩余空间 */
  16. }

image

flex

flexflex-growflex-shrinkflex-basis的简写,默认值为0 1 auto。后两个属性可选。

  1. .item {
  2. flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
  3. }

align-self

align-self定义了单个项目上在交叉轴的对齐方式。
其默认值为继承容器的align-items属性。

具体的属性值参阅align-items的属性值。

  1. .item {
  2. align-self: auto | flex-start | flex-end | center | baseline | stretch;
  3. }

image

参考资料: