什么是Flexbox?
Flexbox(弹性盒子)是一种一维布局模型,用于在行或列中排列元素,使元素能够响应式地适应可用空间。
Flexbox的优势:
- 轻松实现元素的垂直和水平居中
- 自动分配容器内的空间
- 轻松创建响应式布局
- 改变元素的显示顺序
- 处理不同尺寸的元素
- 简化复杂布局的实现
Flexbox的基本概念
- Flex容器:设置了
display: flex的元素 - Flex项目:Flex容器的直接子元素
- 主轴:Flex项目排列的主要方向
- 交叉轴:与主轴垂直的方向
- 主轴起点/终点:主轴开始和结束的位置
- 交叉轴起点/终点:交叉轴开始和结束的位置
Flex容器和Flex项目
要使用Flexbox,需要将一个容器元素设置为flex容器:
CSS
.container {
display: flex;
}
容器内的直接子元素自动成为flex项目:
项目 1
项目 2
项目 3
Flex容器的显示模式
| 属性值 | 描述 |
|---|---|
| flex | 生成块级Flex容器 |
| inline-flex | 生成内联Flex容器 |
Flex容器属性
1. flex-direction
定义主轴的方向:
CSS
.container {
flex-direction: row; /* 默认值:从左到右 */
/* flex-direction: row-reverse; */
/* flex-direction: column; */
/* flex-direction: column-reverse; */
}
| 属性值 | 描述 |
|---|---|
| row | 主轴为水平方向,起点在左端 |
| row-reverse | 主轴为水平方向,起点在右端 |
| column | 主轴为垂直方向,起点在上沿 |
| column-reverse | 主轴为垂直方向,起点在下沿 |
2. justify-content
定义项目在主轴上的对齐方式:
CSS
.container {
justify-content: flex-start; /* 默认值 */
/* justify-content: flex-end; */
/* justify-content: center; */
/* justify-content: space-between; */
/* justify-content: space-around; */
/* justify-content: space-evenly; */
}
| 属性值 | 描述 |
|---|---|
| flex-start | 项目对齐主轴起点 |
| flex-end | 项目对齐主轴终点 |
| center | 项目在主轴居中 |
| space-between | 项目均匀分布,首尾项目贴边 |
| space-around | 项目均匀分布,每个项目两侧空间相等 |
| space-evenly | 项目均匀分布,所有间隔相等 |
3. align-items
定义项目在交叉轴上的对齐方式:
CSS
.container {
align-items: stretch; /* 默认值 */
/* align-items: flex-start; */
/* align-items: flex-end; */
/* align-items: center; */
/* align-items: baseline; */
}
| 属性值 | 描述 |
|---|---|
| stretch | 项目拉伸填满交叉轴(如果项目未设置高度) |
| flex-start | 项目对齐交叉轴起点 |
| flex-end | 项目对齐交叉轴终点 |
| center | 项目在交叉轴居中 |
| baseline | 项目按基线对齐 |
4. flex-wrap
定义项目是否换行:
CSS
.container {
flex-wrap: nowrap; /* 默认值 */
/* flex-wrap: wrap; */
/* flex-wrap: wrap-reverse; */
}
| 属性值 | 描述 |
|---|---|
| nowrap | 不换行,项目可能会缩小以适应容器 |
| wrap | 换行,项目按顺序排列在多行 |
| wrap-reverse | 换行,但行顺序反转 |
5. align-content
定义多行项目在交叉轴上的对齐方式(当项目有多行时生效):
CSS
.container {
align-content: stretch; /* 默认值 */
/* align-content: flex-start; */
/* align-content: flex-end; */
/* align-content: center; */
/* align-content: space-between; */
/* align-content: space-around; */
}
6. flex-flow
flex-direction和flex-wrap的简写:
CSS
.container {
flex-flow: row wrap;
}
Flex项目属性
1. order
定义项目的排列顺序:
CSS
.item {
order: 2; /* 默认值为0 */
}
2. flex-grow
定义项目的放大比例:
CSS
.item {
flex-grow: 1; /* 默认值为0 */
}
3. flex-shrink
定义项目的缩小比例:
CSS
.item {
flex-shrink: 1; /* 默认值为1 */
}
4. flex-basis
定义项目在分配多余空间之前的主轴尺寸:
CSS
.item {
flex-basis: 100px; /* 默认值为auto */
}
5. flex
flex-grow, flex-shrink 和 flex-basis的简写:
CSS
.item {
flex: 1; /* 等同于 flex: 1 1 0% */
/* flex: 0 1 auto; */
/* flex: 2 1 200px; */
}
6. align-self
允许单个项目有与其他项目不一样的对齐方式:
CSS
.item {
align-self: center; /* 默认值为auto */
}
| 属性值 | 描述 |
|---|---|
| auto | 继承容器的align-items值 |
| flex-start | 项目对齐交叉轴起点 |
| flex-end | 项目对齐交叉轴终点 |
| center | 项目在交叉轴居中 |
| baseline | 项目按基线对齐 |
| stretch | 项目拉伸填满交叉轴 |
Flexbox布局模式
等分布局
CSS
.container {
display: flex;
}
.item {
flex: 1;
}
固定+自适应布局
CSS
.sidebar {
flex: 0 0 200px; /* 不放大,不缩小,固定200px */
}
.main {
flex: 1; /* 自适应剩余空间 */
}
圣杯布局
CSS
.container {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.header, .footer {
flex: 0 0 auto;
}
.content {
flex: 1;
display: flex;
}
.sidebar {
flex: 0 0 200px;
}
.main {
flex: 1;
}
实际应用示例
导航菜单
CSS
.nav {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem;
background-color: #333;
}
.nav-logo {
font-size: 1.5rem;
font-weight: bold;
}
.nav-menu {
display: flex;
gap: 1rem;
}
卡片布局
CSS
.card-container {
display: flex;
flex-wrap: wrap;
gap: 1rem;
justify-content: center;
}
.card {
flex: 1 1 300px;
max-width: 400px;
}
表单布局
CSS
.form-group {
display: flex;
flex-direction: column;
gap: 0.5rem;
margin-bottom: 1rem;
}
@media (min-width: 768px) {
.form-group {
flex-direction: row;
align-items: center;
}
.form-label {
flex: 0 0 150px;
}
.form-input {
flex: 1;
}
}
Flexbox交互演示
容器属性
布局属性
项目属性
生成的CSS代码
CSS
.flex-container {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: stretch;
flex-wrap: nowrap;
align-content: stretch;
gap: 10px;
}
Flexbox最佳实践
- 使用Flexbox进行一维布局,Grid进行二维布局
- 优先使用简写属性(如flex)
- 合理使用flex-grow、flex-shrink和flex-basis
- 注意浏览器兼容性,必要时使用前缀
- 结合媒体查询创建响应式布局
- 使用gap属性设置项目间距(现代浏览器支持)
提示: Flexbox特别适合以下场景:导航菜单、卡片布局、表单布局、垂直居中、等分布局和圣杯布局。
浏览器兼容性
Flexbox在现代浏览器中有很好的支持:
Chrome
29+
Firefox
28+
Safari
9+
Edge
12+
IE
11(部分支持)
注意: 在IE11中,Flexbox有一些已知问题,需要使用特定的hack或回退方案。