Flex弹性布局

2/11/2017 FlexCSS

# 前言

Flex 弹性布局, 友好、方便的布局方案。它已经得到了所有浏览器的支持,这意味着,只要带上前缀就可以在所有的浏览器上使用,而不用担心兼容性的问题。 布局的传统解决方案,基于盒状模型,将 display 属性 + position 属性 + float 属性组合。它对于特殊布局比如垂直居中就不容实现。 流行的 UI 框架的栅格布局也是基于盒模型,通过设置百分比和 float 来构建的。 非常流行的 Bootstrap 4.x 就是用 flex 来重新布局的,替代了之前的栅格百分比的布局方式。 Marked it afraid forgot.

# What? Flex 是什么

Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。 Flex,从 2007 年 07 月,flex 第一版本的工作草案发布,到 2012 年 09 月,flex 最新版本成为候选推荐。flex 主要经历了三个版本

【1】旧版本 display:box | inline-box;

IE 浏览器不支持,windows 下的 safari 浏览器只支持旧版本的写法且需要添加前缀,移动端可以兼容到 andriod2.1-4.3 和 ios3.2-6.1 也需要添加前缀

【2】混合版本 display:flexbox | inline-flexbox;

该版本只有 IE10 支持,且需要添加前缀-ms-

【3】新版本 display: flex | inline-flex

该版本兼容 IE11+、firefox、safari、chrome、opera 及移动端,但移动端 ios7.1-8.4 需要添加前缀-webkit-

目前个浏览器对最新版本有了很好的支持。

// 可以对每一个容器都可以指定为flex属性

.box{
  display: flex | inline-flex
}
1
2
3
4
5

不同的浏览器要加上其特定的前缀: -webkit-, -ms- 或 -moz-

# How? 如何加持到容器

Properties for the Parent

flex 容器有 6 个可设置属性(带图一目了然):

  • flex-direction 决定主轴的方向(即容器内项目的排列方向)
  • flex-wrap 容器内的项目是否换行,如何换行
  • flex-flow 上面两个属性的组合
  • justify-content 容器内项目的水平方向的对齐方式
  • align-items 容器内项目的垂直方向的对齐方式
  • align-content

# flex-direction

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

row(默认值):当`ltr`时,从左到右,当`rtl`时,从右向左,也就是按照文档流横向排列。
row-reverse:和row相反。
column:从上到下。
column-reverse:和column相反。
1
2
3
4
5
6
7
8

# flex-wrap

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

nowrap: 默认, 不换行
wrap: 换行,按照顺序每行依次排列(第一行,第二行)
wrap-reverse: 换行,每行倒序排列(第二行,第一行)
1
2
3
4
5
6
7

# flex-flow

flex-flow 属性是 flex-direction 属性和 flex-wrap 属性的简写形式,默认值为 row nowrap。

.box {
  flex-flow: <flex-direction> || <flex-wrap>;
}
1
2
3

# justify-content

.box {
  justify-content: flex-start | flex-end | center | space-between | space-around;
}

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

# align-items

.box {
  align-items: flex-start | flex-end | center | baseline | stretch;
}

flex-start:顶端对齐。
flex-end:底部对齐。
center:居中对齐。
baseline: 项目的第一行文字的基线对齐。
stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
1
2
3
4
5
6
7
8
9

# align-content

类似于 justify-content 的对齐方式, 针对多行生效,只有一行时不生效

.box {
  align-content: flex-start | flex-end | center | space-between | space-around | stretch;

flex-start:顶端对齐
flex-end:低端对齐
center:居中。
space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
stretch(默认值):拉伸占据整个容器的高度。
}
1
2
3
4
5
6
7
8
9
10

上面的 6 个属性都是设置在容器上的,针对项目占据容器的大小和顺序等由已下 6 个属性来设置。

# How flexible?更灵活的设置 Children

Properties for the Children

  • order flex 子项顺序
  • flex-grow flex 子项占用容器可用空间的比例
  • flex-shrink flex 子项在空间不足时缩小
  • flex-basis 定义 flex 子项的默认大小
  • flex 以上三个 flex-grow, flex-shrink, flex-basis 的简写或者说是组合
  • align-self

# order

默认情况下,flex 项目按代码书写顺序布局。但是,order 属性控制它们在 flex 容器中显示的顺序。

.item {
  order: <integer>; //整数
}
1
2
3

# flex-grow

如果所有项目的 flex-grow 属性都为 1,则它们将等分剩余空间(如果有的话)。如果一个项目的 flex-grow 属性为 2,其他项目都为 1,则前者占据的剩余空间将比其他项多一倍。

.item {
  flex-grow: <number>; /* default 0 */
}
1
2
3

# flex-shrink

如果所有项目的 flex-shrink 属性都为 1,当空间不足时,都将等比例缩小。如果一个项目的 flex-shrink 属性为 0,其他项目都为 1,则空间不足时,前者不缩小。

.item {
  flex-shrink: <number>; /*默认为1 不能是负数*/
}
1
2
3

# flex-basis

.item {
  flex-basis: <length> | auto; /* 默认是 auto */
}
length可以是20%, 5rem,10px等长度值
1
2
3
4

# flex

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
默认值是  0 1 auto. 后两个是可选项
1
2
3
4

# align-self

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

.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
1
2
3

# Where?哪里能用

# 推荐

最后推荐一个淘宝的弹性布局方案

https://github.com/amfe/lib-flexible (opens new window)

http://www.cnblogs.com/lyzg/p/5058356.html (opens new window)

# 参考

https://css-tricks.com/snippets/css/a-guide-to-flexbox/ (opens new window) http://www.cnblogs.com/xiaohuochai/p/5323146.html (opens new window)

最后更新时间: 3/12/2021, 10:45:12 AM