css之dispaly:flex;多行多列

html-css022

css之dispaly:flex;多行多列,第1张

最近老是遇到布局问题,尤其是在垂直居中布局上。之前不了解display:flex最近看了看书,简单的整理了下,于是就产生了这篇文章

flex弹性布局可以简便,完整,响应式的实现各种页面的布局,而且现在也得到了所有浏览器的支持,实在是布局很便利的工具呢。

一、flex布局的基本概念

1.任何一个元素使用display:flex属性后都可以看做一个flex容器;2.它的子元素变成flex容器中的项目,称为flex item;3.flex容器里面默认存在两根主轴:水平的主轴和垂直的轴

,用这两根轴将容器分成多行

二、flex容器的基本属性

1.flex-direction属性:表示项目的排列方式或者说主轴的方向,有以下四个值

row:默认值,主轴为水平方向,从左向右排列

row-reverse:主轴为水平方向,从右向左排列

column:主轴为垂直方向,从上往下排列

column-reverse:主轴为垂直方向,从下往上排列

2.flex-wrap属性:默认情况,所有的子元素都在一行,此属性主要定义如果不在一行时子元素如何排列,有如下三个值:

nowrap:不换行

wrap:换行

wrap-reverse:换行,第一行在下方,第二行在第一行上面依次类推

3.flex-flow:集1.和2.属性于一身,意思就是这个属性可以直接指定上面两个属性的值,默认值为:row nowrap

4.justify-content:定义子元素在主轴上的对齐方式,有以下五个值:

flex-start:左对齐

flex-end:右对齐

center:居中

space-between:两端对齐

space-around:每个项目两侧间隔相等

5.align-items属性:定义子元素在水平轴和垂直轴的交叉轴上如何对齐,有以下五个值:

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

flex-end:交叉轴的终点对齐

center:交叉轴的中点对齐

baseline:项目的第一行文字基线对齐

strecth:默认

6.algin -content属性:定义多根轴线的对齐方式,如果项目只有一根轴线,则该属性不起作用,该属性有以下六个值:

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

flex-end:交叉轴的终点对齐

center:交叉轴的中点对齐

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

space-around:每根轴线的两侧的间隔都相等

strecth:默认,轴线占满整个交叉轴

三、子元素(项目)的属性

1.order属性:定义子元素的排列顺序,数值越小,排列越靠前,默认为0

2.flex-grow属性:定义项目的放大比例,默认值是0,就是如果存在剩余空间,也不放大。

若所有子元素的flex-grow值为1,则子元素等分剩下的空间

若一个元素的属性值为N,剩下值为1,则属性值为N的元素等分的空间是1的N倍

3.flex-shrink属性:定义了项目的缩小比例,默认为1,就是如果空间不足,该项目将缩小

若所有子元素此属性为1,空间不足时,将会被等比缩小,

若有元素属性值为0,即使空间不足,也不会被缩小

4.flex-basis属性:定义了在分配多余空间之前,项目占据的主轴空间。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto原本的大小,也可以设置px结尾固定大小

5.flex属性:是2.3和4属性的简写,默认值为:0 1 auto,可以只写第一个值,后面两个是可选参数;该属性的两个快捷值:auto(1 1 auto)和none(0 0 auto)

6.align-self属性:此属性允许单个子元素与其他子元素不一样的对齐方

auto:默认值,表示继承父元素的属性,

其他:align-items值相同

四、一起来试一试

弹性元素是 container直接的在文档流中的子元素

container在文档流中的子元素才是弹性子元素

弹性元素的默认宽高为内容宽高

flex-direction: row|row-reverse|column|column-reverse

container内的排列顺序: 从左往右 从右往左 从上往下 从小往上(都是从container对应方向边缘开始)

flex-wrap: nowrap|wrap|wrap-reverse

order: <integer>

initial: 0

两个黄色元素没有设置order, 默认为0

flex-basis: <height>|<width>

设置的是宽还是高根据主轴来定, 如果主轴是行则设置默认宽度, 如果主轴是列则设置默认高度

flex-grow: <integer>

initial: 0

弹性元素的宽或高计算:

flex-basis + flow-grow/sum(flow-grow)*remain

flex-shrink: <integer>

initial: 1

弹性元素的宽或高计算:

flex-basis + flow-shrink/sum(flow-shrink)*remain

这里的remain是负值, 表示超出的内容大小

flex: <flex-grow>|| <flex-shrink>|| <flex-basis>

initial: 0 1 main-size ( main-size 元素沿主轴方向默认尺寸)

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

效果依次如下:

align-items: flex-start | flex-end | center | stretch | baseline

align-self: auto | flex-start | flex-end | center | baseline | stretch

initial: auto

当多行时: 应用于行

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

CSS2.1定义了 4 中布局方式

给任意元素设置 display:flex,弹性布局就会被创建,flex 的子项会发生变化.

flex-direction属性用来控制 flex 子项的整体布局方向,决定是从左往右排序.flex-dirction属性有以下语法

flex-wrap属性用来控制 flex 子项单行显示还是换行显示,以及在换行显示情况下,没一行内容是否在垂直方向的反向显示.

flex-flow属性是 flex-dirction属性和 flex-wrap属性的缩写.表示弹性布局的流动性特性

CSS 在 flex 中属性名称基本上是几个固定单词的组合,且这些单词在整个 CSS 世界中是通用的含义

justify-content 属性在弹性布局中常用的语法如下

align-item和 align-self属性的一个区别是 align-self属性是设置在具体的某个 flex 子项上,而 flex-items 属性是设置在 flex 容器上,器控制 flex 子项的垂直对齐方式,align-self默认值是 auto,其余的数据值个 align-items 属性值一致.属性如下

align-content属性和 align-items属性的区别在于 align-items属性设置的是每一个 flex 子项的垂直对齐方式,而 align-content 属性是将所有作为一个整体进行垂直对齐设置.align-content 属性如下所示

我们可以通过 order 属性来改变 flex 子项的顺序位置.order 属性越小优先级别越高

flex 属性是弹性布局的精髓,因此弹性布局就是 flex 属性的作用.flex 属性是 flex-grow flex-shinrk flex-basic这 3 个属性的缩写.我们先了解下flex 常用的几个声明

表示的是什么意思?

flex-basic 属性用来表示基础宽度

flex-grow 属性表示宽度还有剩余的时候

flex-shrink 属性表示宽度不足的时候

flex:0等同设置 flex:0 1 0%,flex:none等同设置了 flex:0 0 auto.

如果没一行的行数是固定的,则可以使用两种方式实现最后一行对齐

要实现最后一行对齐,理论上最好使用 gap 属性设置间隙

如果每一行的行数不固定,则上面的方法都失效,需要使用其他的方式实现最最后一行对齐.可以使用空白标签进行填充占位,具体的占位数量由最多列数的个数决定