CSS 布局之FlexBox与Gird布局

351 阅读6分钟

FlexBox布局(弹性盒子模型)

FlexBox可以控制子级盒子的摆放的方向、顺序、宽度和高度、水平和垂直方向的对齐以及是否允许折叠等属性,用途十分广泛。父元素只需要将CSS设置为display:flex即可生效,其控制子元素的常用属性为:

弹性盒子常用属性(父元素)

flex-direction 对齐方向

  • row 从左到右
  • row-reverse 从右到左
  • column 从上到下
  • column-reverse 从下到上 同时,对flex-direction进行设置,会改变主轴及其方向,如将其设置为column-reverse,则主轴方向为从下到上。侧轴是与之垂直的方向的轴。

justify-content

  • flex-start 按照主轴的方向对齐,由于flex-direction的默认方向是从左到右,所以默认是左对齐。因为主轴的方向不一定是从左到右,所以是flex-start,而不是left或right等。
  • flex-end 按照主轴的反方向对齐
  • center 主轴方向居中
  • sapce-between 两边没有空白,内容间有均等的空白
  • space-around 两边有较少的空白,中间空白较大
  • sapce-evently 所有的空白都一样

align-items 副轴对齐

  • flex-start 按照侧轴的方向对齐,由于flex-direction的默认主轴方向是从左到右,侧轴与之垂直,所以默认是上对齐。
  • flex-end 下对齐
  • center 居中对齐
  • stretch 元素被拉伸以适应容器
  • baseline 元素位于容器的基线上,多适用于多个子元素的文本在一条水平线上

flex-wrap

规定flex容器是单行或者多行,同时主轴的方向决定了新行堆叠的方向

  • nowrap 默认值,子元素超出父容器时也不换行
  • wrap 子元素超出父容器时换行
  • wrap-reverse 子元素超出父容器时换行,且换行部分与不换行的排列顺序相反

flex-flow

它是flex-direction与flex-wrap的缩写,默认值是 row nowrap

弹性盒子常用属性(子元素)

align-self

属性值和align-items的一样,只不过单独控制这个元素在父元素的位置

order

用整数值来定义排列顺序,按照order的值从小到大摆放,可以为负值,默认为0

flex-shrink:

一个数字,控制元素是否可以压缩,即子元素将相对于其他灵活的元素进行收缩的量,默认值是 1。当其值为0,表示不允许压缩,刚性的。

flex-grow

减去不伸展的宽度,将剩余空间对设置了flex-grow 的元素按照其数值的比例进行空间分配

flex-basis

其数值为一个长度,单位为长度单位或百分比,规定元素的初始长度。默认值为元素的长度,若子元素为指定长度,则根据子元素的内容决定。

Grid网格布局

Grid网格布局会将整个父容器看作是一个网格,然后使用相关的属性对资源子元素进行配置。

父元素常用属性

grid-template-columns

grid-template-columns会按照指定的比例分配列空间,如

{
  display: grid;
  grid-template-columns: 20% 20% 20% 20% 20%;
}

会将列分为五列,每列占比20%。但是这样写起来比较麻烦,我们可以使用repeat函数进行简写,它接收两个参数,重复次数,和需要重复的占比。

{
  display: grid;
  grid-template-columns: repeat(5, 20%);
}

上面的两段代码效果完全一致。

{
  display: grid;
  grid-template-columns: 50% 20%;
}

会将列分为2列,每列占比分别为50% 和 20%,剩下的30%不占用

grid-template-columns不仅仅只接受百分比的值,也接受像px或em这样的长度单位,甚至可以将不同的长度单位混合使用。

网格系统也引入了一个新的单位,分数fr。每一个fr单元分配一个可用的空间。比如说,如果两个元素分别被设置为1fr3fr,那么空间就会被平均分配为4份;第一个元素占据1/4,第二个元素占据3/4。

列的宽度采用像素,百分比或者em的单位的时候,其他使用fr单位设置的列将会平分剩下的空间。

{
  display: grid;
  grid-template-columns: 50px 1fr 1fr 1fr 50px;
}

上面代码表示左右两列占的宽度为50px,中间有三列,其宽度相等,均为1:1:1

grid-template-rows

用法和grid-template-column完全一样

grid-tempalte

grid-templategrid-template-rowsgrid-template-columns的缩写形式。数值间用/隔开。

子元素常用属性

grid-column-start:

其数值为整数,假设为x。正数时,表示从左开始数第x列开始,负数时表示从右开始数第x-1列开始。需要说明的是,若想指向右侧第一列,需要将x设置为-2而不是-1

grid-column-end:

其数值为整数,假设为x。正数时,表示从左开始数第x+1列结束,负数时表示从右开始数第x列开始。

end的值可以比start大,相当于两个属性的值进行交换。 也可以使用span关键词来指定你所要跨越的宽度。请注意span只能是正值。

{
  grid-column-start: 2;
  grid-column-end: span 2;
}

上述代码指定的区域是第一行的第2和3列。

也可以将span关键字和grid-column-start一起使用,表示相对于结束位置来设置其宽度。

{
  grid-column-start: span 2;
  grid-column-end: 3;
}

这两部分代码的效果完全一样。

grid-column

grid-column是一个缩写形式,分别表示grid-column-startgrid-column-end两个属性。它可以一次接受两个值,只要用'/'分开就好。span关键字在这个简写中也是可以使用的。

grid-row-start

用法和grid-column-start一致,只不过是从上到下。其中grid-row-end、grid-rowgrid-column-endgrid-column用法完全一致。

grid-area

属性接受4个由'/'分开的值:grid-row-startgrid-column-startgrid-row-end, 最后是grid-column-end。一定要注意顺序!

如果有多个grid-area,会产生网格的覆盖,后者覆盖前者。

order

如果某个元素的位置比较特殊,需要单独设定,则需要order属性进行控制。默认情况下,所有的网格项的order都是0,但是顺序也可以被任意设置为正数或者负数,就像z-index一样

参考连接