CSS Flex 布局

CSS Flex 布局

版权声明:署名-非商业性使用-相同方式共享

Flex 模型

Flex 是 Flexible Box 的缩写,翻译成中文就是 “弹性盒子”,用来为盒模型提供最大的灵活性。任何一个容器都可以指定为 Flex 布局。
采用 Flex 布局的元素,称为 Flex 容器(Flex Container),简称 ”容器”。它的所有子元素自动成为容器成员,称为 Flex 项目(Flex Items)。

当元素表现为 flex 容器时,它们沿着两个轴来布局:

https://developer.mozilla.org/zh-CN/docs/Learn_web_development/Core/CSS_layout/Flexbox/flex_terms.png

  • 主轴(main axis)是沿着 flex 元素放置的方向延伸的轴(比如页面上的横向的行、纵向的列)。该轴的开始和结束被称为 main startmain end
  • 交叉轴(cross axis)总是垂直于 主轴。该轴的开始和结束被称为 cross startcross end

Flex Container 属性

通过将 display 属性设置为 flex, 将变为 Flex 容器, Flex 容器的属性有:

  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content (作用于主轴)
  • align-content (作用于交叉轴)
  • align-items (作用于交叉轴)
  • place-content (align-contentjustify-content 的简写)
  • place-items (align-itemsjustify-items 的简写)

注意:

justify-selfjustify-items 不适用于 flexbox

flex-direction

属性决定主轴的方向, 即Flex Items的排列方向

  • row (默认)
    主轴为水平方向,起点在左端。
  • row-reverse
    主轴为水平方向,起点在右端。
  • column
    主轴为垂直方向,起点在上沿。
  • column-reverse
    主轴为垂直方向,起点在下沿。

flex-wrap

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

  • nowrap(默认)
    不换行。
  • wrap
    换行,第一行在上方。
  • wrap-reverse
    换行,第一行在下方。

flex-flow

flex-flow 属性是 <flex-direction> <flex-wrap> 两个属性的简写形式,默认值为 row nowrap

justify-content

该属性有5个值,具体对齐方式与轴的方向有关。下面假设主轴为从左到右。

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

align-content

属性定义了多根轴线(通俗理解多行)的对齐方式。如果项目只有一根轴线,该属性不起作用。

  • flex-start
    与交叉轴的起点对齐。
  • flex-end
    与交叉轴的终点对齐。
  • center
    与交叉轴的中点对齐。
  • space-between
    与交叉轴两端对齐,轴线之间的间隔平均分布。
  • space-around
    每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
  • stretch(默认)
    轴线占满整个交叉轴。

align-items

该属性有5个值,具体的对齐方式与交叉轴的方向有关,下面假设交叉轴从上到下。

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

place-content

place-content 属性是align-contentjustify-content的简写。如果未提供第二个值,则第一个值作为第二个值的默认值。

place-items

place-items 属性是align-itemsjustify-items的简写。如果未提供第二个值,则第一个值作为第二个值的默认值。

Flex Items 属性

  • order
  • flex-grow
  • flex-shrink
  • flex-basis
  • flex
  • align-self (作用于交叉轴)

order

属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。

flex-grow

属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。都为1则等比放大。

flex-shrink

属性定义项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。都为1则等比缩小,存在0不缩小。

flex-basis

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

flex

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

align-self

属性允许单个项目有与其他项目不一样的对齐方式, 作用于交叉轴,可覆盖 align-items 属性。默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch

该属性有6个值,除了auto,其他都与 align-items 属性完全一致。

  • auto
  • flex-start
  • flex-end
  • center
  • baseline
  • stretch

相关信息

元素盒模型

@@ Tags: 元素盒模型
@@ Refer: 《CSS Volume 2》——CSS Box Sizing

默认情况下元素的盒模型属性为: box-sizing: content-box;, 这表示元素的宽高(包括max、min)属性只包括了元素内容的尺寸,不包含边框与内边距的大小。如以宽度为例:

element.width(内容宽度)=元素实际宽度-(padding-right + padding-left + border-right + border-left)

我们可以通过修改元素的盒模型: box-sizing: border-box;, 使其表现为我们期望的那样:

element.width(实际宽度)=(元素内容宽度 + padding-right + padding-left + border-right + border-left)

flex 与 auto margin

在普通的布局和在flex布局中,margin: auto的不同点,其最大的区别就是:在flex布局中,margin: auto会让元素在垂直方向也居中,而普通布局中只能让元素水平居中。

stackoverflow: Flex Aligning with auto margins