bingoogolapple.github.io icon indicating copy to clipboard operation
bingoogolapple.github.io copied to clipboard

Flex 弹性盒子模型

Open bingoogolapple opened this issue 7 years ago • 2 comments

https://www.ruanyifeng.com/blog/2015/07/flex-grammar.html https://css-tricks.com/snippets/css/a-guide-to-flexbox https://flexboxfroggy.com/#zh-cn

  • justify-xxx 主轴
  • align-xxx 交叉轴

bingoogolapple avatar Jul 19 '17 17:07 bingoogolapple

Flex 容器

display: flex;  // 设置布局为 flex 布局
flex-direction: row;  // 设置主轴方向
flex-wrap: nowrap;  // 设置一行显示不完时是否通过多行显示来显示所有 item
flex-flow: row nowrap; // 可以使用该属性分别指定 flex-direction flex-wrap 的值
justify-content: space-around;  // 设置主轴方向的对其方式,默认值为 flex-start, space-between 在 item 间添加间隔, space-around 在 item 两边添加间隔
align-items: center;  // 定义了 flex 容器中 flex 成员项在交叉轴方向上如何排列以处理空白部分(每一根主轴线在自身交叉轴线上的位置),默认值为 stretch 表示主轴垂直方向上拉伸的意思
align-content: center;  // 设置多根主轴线在交叉轴方向的对齐方式(所有主轴线整体在交叉轴线上的位置)。如果项目只有一根交叉轴线,该属性不起作用,除非设置了 flex-wrap 为 wrap

设置容器为 flex 布局

display: flex;

flex-direction

定义了 flex 容器中 flex 成员项的排列方向

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

justify-content

定义了 flex 容器中 flex 成员项在主轴方向上如何排列以处理空白部分

  • flex-start(默认值):所有的 flex 成员项都排列在容器的前部 image
  • flex-end:则意味着成员项排列在容器的后部 image
  • center:即中间对齐,成员项排列在容器中间、两边留白 image
  • space-between:表示两端对齐,空白均匀地填充到 flex 成员项之间 image
  • space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍 image

align-items

定义了 flex 容器中 flex 成员项在交叉轴方向上如何排列以处理空白部分(每一根主轴线在自身交叉轴线上的位置)

  • stretch(默认值):如果项目未设置交叉轴大小或设为auto,将占满整个容器的交叉轴大小 image
  • flex-start: 则是上对齐,所有的成员项排列在容器顶部 image
  • flex-end: 是下对齐,所有的成员项排列在容器底部 image
  • center: 是中间对齐,所有成员项都垂直地居中显示 image
  • baseline:子项交叉轴大小未明确指定时,子项的第一行文字的基线对齐 image image

align-content

设置多根主轴线在交叉轴方向的对齐方式(所有主轴线整体在交叉轴线上的位置)。如果项目只有一根交叉轴线,该属性不起作用,除非设置了 flex-wrap 为 wrap

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

flex-wrap

设置一行显示不完时是否通过多行显示来显示所有 item

  • nowrap(默认值):不换行 image
  • wrap:换行,第一行交叉轴的头部 image
  • wrap-reverse:换行,第一行交叉轴的尾部 image

flex-flow

可以使用该属性分别指定 flex-direction flex-wrap 的值

flex-flow: row nowrap;

row-gap、column-gap、gap

  • row-gap 设置行间距
  • column-gap 设置列间距
  • gap 上面两个的简写,第一个值设置行间距,第二个值设置列间距

bingoogolapple avatar Dec 29 '19 08:12 bingoogolapple

Flex 成员项

flex-grow: 1;  // item 占用主轴方向剩余空间的比例(单个元素时:1 占满所有剩余空间,0.5 占满剩余空间的一半),默认值为0。如果主轴方向为竖直方向,在 移动设备和 Safari 上不会生效
flex-shrink: 2;  // 设置 item 在主轴方向缩小的宽度,默认值为 1,越大表示越容易缩小,0 表示不会缩小
flex-basis: 100px;  // 设置 item 的初始宽度,默认为 auto
flex: 0 1 auto;  // 可以使用该属性分别指定 flex-grow flex-shrink flex-basis 的值
align-self: center;  // 单独设置 item 在主轴垂直方向的对其方式。stretch 表示在主轴垂直方向上拉伸当前 item

flex-grow

定义主轴存在剩余空间时,项目在主轴的放大比例(单个元素时:1 占满所有剩余空间,0.5 占满剩余空间的一半)。如果主轴方向为竖直方向,在 移动设备和 Safari 上不会生效

  • 默认为 0,即如果存在剩余空间,也不放大 image
  • 如果所有项目的 flex-grow 属性都为 1,则它们将等分剩余空间(如果有的话) image image
  • 如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍 image
  • 如果一共两个项目,一个项目的 flex-grow 属性为 0.1,另一个项目为 0.2,如果有剩余空间的话,则前者占据的剩余空间为十分之一,后者占据的剩余空间为十分之二,其余的十分之七空白

flex-shrink

定义主轴不存在剩余空间时,item 在主轴方向缩小比例

  • 默认为 0,即如果空间不足,都不缩小 image
  • 如果所有项目的 flex-shrink 属性都为 1,当空间不足时,都将按项目宽度比例缩小
容器宽 500px,项目 1「flex-shrink 为 1,宽 300」,项目 2「flex-shrink 为 1,宽 400」 => 最终项目 1 和 项目 2 的宽度是多少?

项目 1 宽 300 + 项目 2 宽 400 - 容器宽 500 = 需要缩小 200
项目 1 最终宽度为 300 - 3/(3 + 4) * 200
项目 2 最终宽度为 400 - 4/(3 + 4) * 200

image

  • 如果一个项目的 flex-shrink 属性为 0,其他项目都为 1,则空间不足时,前者不缩小 image
  • 如果多个项目设置了 flex-shrink 的属性大于 0,则值越大,缩小越多
容器宽 500px,项目 1「flex-shrink 为 2,宽 300」,项目 2「flex-shrink 为 1,宽 400」,最终项目 1 和 项目 2 的宽度是多少?

项目 1 宽 300 + 项目 2 宽 400 - 容器宽 500 = 需要缩小 200
项目 1 最终宽度为 300 - (2 * 3) / (2 * 3 + 4) * 200
项目 2 最终宽度为 400 - 4 / (2 * 3 + 4) * 200

image

  • 只有一个项目时,flex-shrink 设置为 0.5 时指缩小的尺寸为原始溢出部分的一半;所有项目 flex-shrink 的总和小于 1 时就还是会有溢出

flex-basis

定义了在分配多余空间之前,item 占据的主轴空间,浏览器根据这个属性,计算主轴是否有多余空间。可选值有 0%、auto、200px、100%;它的默认值为 auto,即项目的本来大小 image image

flex

  • 可以使用该属性分别指定 flex-grow flex-shrink flex-basis 的值

align-self

允许单个项目有与其他项目在交叉轴方向有不一样的对齐方式,可覆盖 align-items 属性

  • auto | flex-start | flex-end | center | baseline | stretch
  • 默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch image image image

order

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

bingoogolapple avatar Dec 29 '19 08:12 bingoogolapple