在flex的容器中默认存在两条轴,水平主轴main axis
和垂直交叉轴cross axis
,这是默认的设置,不过咱们能够经过设置将主轴的方向变成垂直方向,交叉轴变成水平方向。
在一个被设置为flex
的容器中,每一个直接子元素都被称之为flex item
,每一个flex item
占据着主轴空间是main size
,占据交叉轴上的空间叫作corss size
; css
须要注意的是:主轴和交叉轴的方向是能够设置的,默认的是主轴为水平方向、交叉轴为垂直方向;固然RN的表现和浏览器相反,默认主轴是垂直方向html
为了实践一个flex
布局,咱们首先须要一个容器,也就是父元素,并指定为flex
布局,这样,容器就具有了上述的flex
的特性,其直接子元素也将成为flex item
;设置为flex
容器也很简单:浏览器
.root{ display: flex | inline-flex; // 两个值均可以使用 }
上述的两个值能够分别生成一个块级flex
容器盒子、一个行内flex
容器盒子,简单说来,若是你使用块元素如 div,你就可使用 flex,而若是你使用行内元素,你可使用 inline-flex。
须要注意的是:当时设置 flex 布局以后,子元素的 float、clear、vertical-align 的属性将会失效。cors
设置为flex
的容器,有如下六种能够设置的属性:布局
这里会对这几个属性进行分别的解释测试
flex-direction
决定主轴的方向(即项目的排列方向),flex
.root{ display: flex | inline-flex; // 两个值均可以使用 flex-direction: row | row-reverse | column | column-reverse; // 四个值可选 }
row
:主轴与行内轴方向做为默认的书写模式。即横向从左到右排列(左对齐)。row-reverse
:对齐方式与row相反。[右对齐]column
:主轴与块轴方向做为默认的书写模式。即纵向从上往下排列(顶对齐)。column-reverse
:对齐方式与column相反。【底对齐】伪代码和伪展现分别对应以下的方式:spa
<div class="root"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div> // flex-direction: row 水平靠左排列 第一个元素在左边 【1,2,3 】 // flex-direction: row-reverse 水平靠右排列 第一个元素在右边 【 3,2,1】 // flex-direction: column 垂直靠顶部排列 第一个元素在最顶部 【 1, 2, 3, 】 // flex-direction: column-reverse 垂直靠底部排列 第一个元素在最底部 【 3, 2, 1, 】
注意:该属性经过定义flex容器的主轴方向来决定felx子项在flex容器中的位置。这将决定flex须要如何进行排列,不只是对齐方向,还有是子元素的排列顺序,第一个元素或者order靠前的将会出如今对齐方向的第一个位置处code
默认的状况下,项目都应展开在主轴线上,经过设置flex-wrap
能够达到主轴线上换行展现htm
.root{ flex-wrap: nowrap | wrap | wrap-reverse; // 三个值选其一 }
三个取值分别是:
nowrap
默认值,也就是即便容器的空间不足,也不会换行,而是调整子元素的尺寸。wrap
是指若是子元素超出了容器的空间,那么须要换行,并且须要按Z
字顺序排开,即第一行在最上方;wrap-reverse
是指换行展现,可是按照逆序的Z
排开,即第一排在最下方,每一排的主轴方向的排序仍是按照flex-direction
的设置展现。flex-flow:<' flex-direction '> || <' flex-wrap '>
,能够看到这是一个复合属性。设置或检索弹性盒模型对象的子元素排列方式。
.root{ flex-flow: row nowrap; } // 等同于如下 .root{ flex-direction: row; flex-wrap: nowrap; }
justify-content
;定义了项目在主轴的对齐方式。
.root{ justify-content:flex-start | flex-end | center | space-between | space-around; // 五个值选其一 }
这个属性的设置和flex-direction
属性有关,下面的值都将是以flex-direction: row;
进行判断的,其中的五个值分别是:
flex-start
: 是指靠主轴方向的起始位置对齐,flex-direction: row;
条件下就是子元素靠左边对齐,尽量空出右边;[1,2,3, _ _ _ _ _ _]
flex-end
: 是指靠主轴方向的结束位置对齐,flex-direction: row;
条件下就是子元素靠右对齐;尽量空出左边。[_ _ _ _ _ _,1,2,3]
center
: 是指靠主轴的中心位置对齐,flex-direction: row;
条件下就是子元素居中对齐;尽量左右两边空出相同空间;[_ _ _1,2,3, _ _ _]
space-between
: 是指在主轴上左右两边不留空隙,并使子元素之间的间隙相等;[1,_ _ _,2,_ _ _,3]
space-around
: 是指主轴上左右两边也留空隙,全部的子项目两侧自身边距相等,均匀分布在主轴上,因此项目之间的间隔比项目与边缘的间隔大一倍。[_,1,_ _,2,_ _,3,_]
.root { align-items: flex-start | flex-end | center | baseline | stretch; }
默认值是stretch
,这五个值:
flex-start
是指在交叉轴方向上的各子元素之间的对齐方式是在交叉轴的起点对齐;flex-end
是指在交叉轴上的对齐方式是以交叉轴的重点对齐方式;center
是在交叉轴方向上是以交叉轴方向上的居中方式对齐baseline
是在交叉轴的方向上的第一行文字的基线对齐stretch
是在交叉轴上的子项目未设置高度或者设为 auto,将占满整个容器的高度。定义了多根轴线的对齐方式,若是项目只有一根轴线,那么该属性将不起做用;当你 flex-wrap 设置为 nowrap 的时候,容器仅存在一根轴线,由于项目不会换行,就不会产生多条轴线。
当你 flex-wrap 设置为 wrap 的时候,容器可能会出现多条轴线,这时候你就须要去设置多条轴线之间的对齐方式了。
创建在主轴为水平方向时测试,即 flex-direction: row, flex-wrap: wrap
.root{ align-content:flex-start | flex-end | center | space-between | space-around | stretch }
有六种属性可运用在 item 项目上:
定义项目在容器中的排列顺序,数值越小,排列越靠前,默认值为 0
.item { order: <integer>; }
定义了在分配多余空间以前,项目占据的主轴空间,浏览器根据这个属性,计算主轴是否有多余空间
.item { flex-basis: <length> | auto; }
默认值:auto,即项目原本的大小, 这时候 item 的宽高取决于 width 或 height 的值。
当主轴为水平方向的时候,当设置了 flex-basis,项目的宽度设置值会失效,flex-basis 须要跟 flex-grow 和 flex-shrink 配合使用才能发挥效果。
当 flex-basis 值为 0 % 时,是把该项目视为零尺寸的,故即便声明该尺寸为 140px,也并无什么用。
当 flex-basis 值为 auto 时,则跟根据尺寸的设定值(假如为 100px),则这 100px 不会归入剩余空间。
.item { flex-grow: <number>; }
默认值为 0,即若是存在剩余空间,也不放大;
当全部的项目都以 flex-basis 的值进行排列后,仍有剩余空间,那么这时候 flex-grow 就会发挥做用了。
若是全部项目的 flex-grow 属性都为 1,则它们将等分剩余空间。(若是有的话)
若是一个项目的 flex-grow 属性为 2,其余项目都为 1,则前者占据的剩余空间将比其余项多一倍。
固然若是当全部项目以 flex-basis 的值排列完后发现空间不够了,且 flex-wrap:nowrap 时,此时 flex-grow 则不起做用了,这时候就须要接下来的这个属性。
.item { flex-shrink: <number>; }
默认值: 1,即若是空间不足,该项目将缩小,负值对该属性无效。
flex-grow, flex-shrink 和 flex-basis的简写
.item{ flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] }
这里能够看出,虽然每一个项目都设置了宽度为 50px,可是因为自身容器宽度只有 200px,这时候每一个项目会被同比例进行缩小,由于默认值为 1。
同理可得:
若是全部项目的 flex-shrink 属性都为 1,当空间不足时,都将等比例缩小。
若是一个项目的 flex-shrink 属性为 0,其余项目都为 1,则空间不足时,前者不缩小。
容许单个项目有与其余项目不同的对齐方式
单个项目覆盖 align-items 定义的属性
默认值为 auto,表示继承父元素的 align-items 属性,若是没有父元素,则等同于 stretch。
.item { align-self: auto | flex-start | flex-end | center | baseline | stretch; }
这个跟 align-items 属性时同样的,只不过 align-self 是对单个项目生效的,而 align-items 则是对容器下的全部项目生效的。