CSS布局之Flex布局

365 阅读5分钟

网页布局在学校教学大多数还是教学float浮动,flex布局却没有教学,甚至没有提及。教学应该与时俱进,而不是墨守成规。对于学生也应该不应该局限于课堂上的学习。

今天我就讲讲Flex的基本用法以及由来。

早在2009年谷歌就开始推出,摒弃了传统的盒模型display+psistion+float模式,flex布局能满足绝大多部分使用传统布局的需求,而且比传统布局更快速便捷。Flex————Flexible Box,译为“弹性布局”。这种布局可以简便的、完整、响应式的实现各种页面布局,采用flex布局的元素被叫做flex容器(在浏览器的调试模式下可以看到元素标签后面会带一个flex标签,点击可快速调试),其中的子元素成为容器中的成员,这些成员可以根据属性的设置,在容器大小改变时自适应地弹性排布,而不改变整体它的布局。更为重要的是,容器空间不足以放下子元素的时候,子元素也不会撑开容器,而是根据容器大小进行弹性的放缩。当然,这种布局方式早已被所有浏览器支持(ie10以上)话说ie也开退休了,微软已宣布将于2022年6月16日正式退役。这奇奇怪怪的浏览器终于再见了!!!喜大普奔~

Flex的基本使用

.box{
  display: flex;
}

在设为 Flex 布局以后,子元素的floatclearvertical-align属性都将失效

Flex的基本概念

采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目"。

容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。

主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end

image.png

主轴默认的方向是横向 从左往右,交叉轴的默认方向是纵向 从上往下

当然有默认就能更改,下面介绍一下容器的属性

容器的属性

flex容器具有6个属性分别是flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-content

  • flex-directionzidan

    决定主轴的方向(即项目的排列方向)

.box {
  flex-direction: row | row-reverse | column | column-reverse;
}

分别是主轴横向 从左往右 |横向 从右往左 |横向 从上往下 |横向 从下往上

  • flex-wrap

默认情况下,项目都排在一条线(又称"轴线")上即不换行。flex-wrap属性定义,如果一条轴线排不下,如何换行。

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

此处需要注意的是属性值wrap-reverse 换行,但第一行在下方,并不是指排列顺序

  • flex-flow 此处是flex-direction属性和flex-wrap属性的简写形式,类似一个语法糖吧,默认值与原先一致
  • justify-content 定义了项目item在主轴上的对齐方式
.box {
  justify-content: flex-start | flex-end | center | space-between | space-around;
}

具体对齐方式与轴的方向有关,下面以主轴为从左到右为例。

flex-start(默认值):左对齐flex-end:右对齐center: 居中space-between:两端对齐,项目之间的间隔都相等。space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。

  • align-items 定义项目item在交叉轴上如何对齐
.box {
  align-items: flex-start | flex-end | center | baseline | stretch;
}

具体对齐方式与轴的方向有关,下面以交叉轴为从上到下为例。

flex-start:交叉轴的起点对齐。flex-end:交叉轴的终点对齐。center:交叉轴的中点对齐。baseline: 项目的第一行文字的基线对齐。stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

  • align-content 定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。即该属性flex-wrap不为默认值且项目item至少为两行时才有效果。

项目的属性

flex项目(item)具有6个属性分别是orderflex-growflex-shrinkflex-basisflexalign-self

  • order 定义项目的排列顺序。数值越小的项目排列越靠前,默认值为0。
  • flex-grow 定义项目的放大比例,默认值为0,即如果存在剩余空间,也不放大。与flex-shrink相似。
  • flex-shrink 定义了项目的缩小比例,默认为1,即如果空间不足,项目将缩小。与flex-grow相似。
  • flex-basis 定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。如若使用,建议先设置 flex-basis再设置flex-shrinkflex-grow,按照逻辑顺序便于理解。
  • flex flex属性是flex-grow、 flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性是可选的,即flex至少写一个属性值。建议优先使用flex,而不是分开始写,浏览器会根据值进行相关填充值
  • align-self align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性,即align-self优先级高于父元素的布局方式。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch