Flex Layout
css_layout
背景
传统的Css布局, 都是在基于 盒状模型 的基础上, 使用 display + position + float 进行布局. 这种布局对于一些特殊布局非常不方便, 设计 Response Design 起来也十分麻烦.
2009年, W3C 提出了一种新的方案–Flex 布局, 可以简便,完整,响应式地实现各种页面布局, 现在 97.3% 的浏览器已经支持这种布局. 请参考 Can I Use
Flex Layout 基本元素概念
Flex Layout 最重要的两个概念 – flex container 和 flex item.
flex container– 所有采用 Flex 布局的元素, 叫 Flex 容器.flex item– Container 内的所有子元素叫 容器成员.
Flex布局原理解释:

- 主轴(
main axis) – Flex Box布局的主要轴, 注意 : 这不一定是水平的, 主要取决于flex-direction - 交叉轴(
cross axis) – 垂直于main axis. 方向取决于main axis. -
main-startmain-end– 该轴的开始和结束被称为main start和main end -
cross-startcross-end– 该轴的开始和结束被称为cross start和cross end main size– 主轴main axis的空间-
cross size– 交叉轴cross axis的空间
Flex Contain 用法
主要属性 :
flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-content
Display 设置成 Flex
第一步需要先把 容器 display 设置成 flex.
.container {
display: flex; /* or inline-flex */
}
flex-direction
设置主轴方向:
- row(default) – 水平方向,
main-start在 左 - row-reverse – 水平方向,
main-start在 右 - column – 垂直方向,
cross-start在 上 - column-reverse – 垂直方向,
cross-start在 下
.container {
flex-direction: row | row-reverse | column | column-reverse;
}
flex-wrap
设置 flex item 换行方式:
- nowrap(default) – 不换行
- wrap – 由上往下换行
- wrap-reverse – 由下往上换行, 第一行在最底.
.container{
flex-wrap: nowrap | wrap | wrap-reverse;
}
justify-content
主轴 main axis 上的对齐方式:
flex-start (default)– 左对齐flex-end– 右对齐center– 居中space-between– 两端对齐,item之间的间隔都相等space-around– 每个item两侧的间隔相等.
.container {
justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly;
}
align-items
交叉轴 cross axis 上的对其方式:
flex-start– 上对齐flex-end– 下对齐center– 居中baseline– 基于第一个item的文字基线对齐stretch(default)– 占满整个flex contain的高度
.container {
align-items: flex-start | flex-end | center | baseline | stretch;
}
align-content
当内容出现多行 item 时(多条 main axis)的对其方式. 如果只有一条的时候, 该属性不起效.
flex-start– 对齐cross axis起端.flex-end– 对齐cross axis终端.center– 居中.space-between– 对齐cross axis两端, 上下行间距相等, 与justify-content类似.space-around– 每根轴线两侧的间隔都相等, 与justify-content类似.stretch(default)– 占满整个cross axis.
.container {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
Flex Item 用法
主要属性
- order
- flex-grow
- flex-shrink
- flex-basis
- flex
- align-self
order
设置
item的排列顺序, default: 0, 数值越小越靠前.
.item {
order: <integer>; /* default is 0 */
}
flex-grow
- 设置
item的放大比例. default: 0, 也就是不放大. - 如果所有的
item都设置为 1, 则将contain内的 剩余空间 平均分给所有item - 以上一步为基础, 如果把其中一个
item设置成 2, 则该item得到的空间是其他的 两倍
.item {
flex-grow: <number>; /* default 0 */
}
flex-shrink
Demo : https://codepen.io/saiwas/pen/MXwGVe
- 设置
item的缩放比例. default: 1 - 只有所有
item的宽度总和 大于Contain宽度, 该属性才生效. - 如果该属性设为 0, 则该
item不会缩放
.item {
flex-shrink: <number>; /* default 1 */
}
flex-basis
设置 flex item 在主轴方向上的初始大小
.item {
flex-basis: <length> | auto; /* default auto */
}
flex
Demo : https://codepen.io/saiwas/pen/rKVvJj
- 设置
flex item如何伸长或缩短以适应flex contain中的可用空间. - 可以同时设置
flex-grow,flex-shrink,flex-basis. - 取值为
auto,initial,none或一个无单位数.item { flex: none | [ <'flex-grow'> || <'flex-shrink'> || <'flex-basis'> ] }align-self
设置单个
item的 对齐方式. 会覆盖align-items属性.
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
总结
Flex Layout 相对 传统布局 来说, 在控制排版的方面十分方便. 而且更加适用于现在的 Response Design. 兼容性方面也相对高.
ps. 本博客大部分的排版都应用了 Flex 布局
更加详细的教程可以参考 : Guide To Flexbox