什么是 Flexbox?
Flexbox 是 flexible box 的简称(注:意思是“灵活的盒子容器”),是 CSS3 引入的新的布局模式。它决定了元素如何在页面上排列,使它们能在不同的屏幕尺寸和设备下可预测地展现出来。
它之所以被称为 Flexbox ,是因为它能够扩展和收缩 flex 容器内的元素,以最大限度地填充可用空间。与以前布局方式(如 table 布局和浮动元素内嵌块元素)相比,Flexbox 是一个更强大的方式:
- 在不同方向排列元素
- 重新排列元素的显示顺序
- 更改元素的对齐方式
- 动态地将元素装入容器
什么情况下不建议使用 Flexbox?
虽然 Flexbox 非常适合缩放,对齐和重新排序元素,但以下情况应该尽量避免使用 Flexbox 布局:
- 整体页面布局
- 完全支持旧浏览器的网站
浏览器支持 Flexbox 的情况:
旧版浏览器,如IE 11或更低版本,不支持或仅部分支持 Flexbox 。如果你想安全的使用页面正常呈现,你应该退回到其他的 CSS 布局方式,比如结合 float 的 display: inline-block 或者 display: table 等。但是,如果您只针对现代浏览器,那么 Flexbox 绝对值得一试。
在 Flexbox 模型中,有三个核心概念:
1、flex 项(注:也称 flex 子元素),需要布局的元素
2、flex 容器,其包含 flex 项
3、排列方向(direction),这决定了 flex 项的布局方向(注:更多的文章叫主轴)
Flex 布局是什么?
Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
任何一个容器都可以指定为 Flex 布局。
.box{
display: flex;
}
行内元素也可以使用 Flex 布局。
.box{
display: inline-flex;
}
Webkit 内核的浏览器,必须加上-webkit前缀。
.box{
display: -webkit-flex; /* Safari */
display: flex;
}
注意:设为 Flex 布局以后,子元素的 float、clear 和 vertical-align 属性将失效。
属性总结表:
容器属性详述
- flex-direction
决定主轴的方向,即项目排列的方向,有四个可能的值:
属性 | 效果 |
---|---|
row (默认) | 主轴为水平方向,项目沿主轴从左至右排列 |
column | 主轴为竖直方向,项目沿主轴从上至下排列 |
row-reverse | 主轴水平,项目从右至左排列,与row反向 |
column-reverse | 主轴竖直,项目从下至上排列,与column反向 |
- flex-wrap
默认情况下,item排列在一条线上,即主轴上,flex-wrap 决定当排列不下时是否换行以及换行的方式,可能的值:
属性 | 效果 |
---|---|
nowrap (默认) | 自动缩小项目,不换行 |
wrap | 换行,且第一行在上方 |
wrap-reverse | 换行,第一行在下面 |
- flex-flow
flex-flow 是 flex-direction 和 flex-wrap 的简写形式,如:row wrap | column wrap-reverse 等。默认值为 row nowrap,即横向排列 不换行。
- justify-content
决定item在主轴上的对齐方式,可能的值有:
属性 | 效果 |
---|---|
flex-start | 左对齐 |
flex-end | 右对齐 |
center | 居中对齐 |
space- between | 两端对齐 |
space-around | 沿轴线均匀分布 |
- align-items
决定了 item 在交叉轴上的对齐方式,可能的值有:
属性 | 效果 |
---|---|
flex-start | 顶端对齐 |
flex-end | 底部对齐 |
center | 竖直方向上居中对齐 |
baseline | item第一行文字的底部对齐 |
stretch | 当item未设置高度时,item将和容器等高对齐 |
- align-content
该属性定义了当有多根主轴时,即 item 不止一行时,多行在交叉轴轴上的对齐方式。注意当有多行时,定义了 align-content 后,align-items 属性将失效。align-content可能值含义如下(假设主轴为水平方向):
属性 | 效果 |
---|---|
flex-start | 左对齐 |
flex-end | 右对齐 |
center | 居中对齐 |
space- between | 两端对齐 |
space-around | 沿轴线均匀分布 |
stretch | 各行将根据其flex-grow值伸展以充分占据剩余空间 |
Item 属性详述
item的属性在item的style中设置。item共有如下六种属性:
- order:order的值是整数,默认为0,整数越小,item 排列越靠前。
如下所示代码如下:
item 1
item 2
item 3
item 4
- flex-grow
定义了当flex容器有多余空间时,item 是否放大。默认值为0,即当有多余空间时也不放大;可能的值为整数,表示不同item的放大比例,如:
item 1
item 2
item 3
即当有多余空间时item1、item2、和item3以1:2:3的比例放大。
- flex-shrink
定义了当容器空间不足时,item是否缩小。默认值为1,表示当空间不足时,item 自动缩小。
.item {
flex-shrink: ; /* default 1 */
}
如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。负值对该属性无效。
- flex-basis:定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。
.item {
flex-basis: | auto; /* default auto */
}
它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。如下代码:
item 1
item 2
item 3
- flex:flex属性是 flex-grow、flex-shrink 和 flex-basis 的简写,默认值为0 1 auto。后两个属性可选。
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。
建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。
- align-self:允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
属性 | 效果 |
---|---|
auto (默认值) | 和父元素align-self的值一致 |
flex-start | 顶端对齐 |
flex-end | 底部对齐 |
center | 竖直方向上居中对齐 |
baseline | item第一行文字的底部对齐 |
stretch | 当item未设置高度时,item将和容器等高对齐 |