# 02-Flexbox布局
## 📋 学习目标
- 理解Flexbox布局模型
- 掌握容器和项目属性
- 实现常见布局模式
- 解决实际布局问题
## 🎯 Flexbox基础
### 启用Flex布局
```css
.container {
display: flex; /* 块级flex容器 */
/* 或 */
display: inline-flex; /* 行内flex容器 */
}
```
### 主轴和交叉轴
```
默认(flex-direction: row):
→ 主轴(Main Axis)水平方向
↓ 交叉轴(Cross Axis)垂直方向
flex-direction: column 时:
↓ 主轴垂直方向
→ 交叉轴水平方向
```
## 📦 容器属性
### flex-direction(主轴方向)
```css
.container {
/* 水平,起点在左 */
flex-direction: row;
/* 水平,起点在右 */
flex-direction: row-reverse;
/* 垂直,起点在上 */
flex-direction: column;
/* 垂直,起点在下 */
flex-direction: column-reverse;
}
```
### flex-wrap(换行)
```css
.container {
/* 不换行(默认) */
flex-wrap: nowrap;
/* 换行,第一行在上 */
flex-wrap: wrap;
/* 换行,第一行在下 */
flex-wrap: wrap-reverse;
}
```
### flex-flow(复合属性)
```css
.container {
/* flex-direction 和 flex-wrap 的简写 */
flex-flow: row wrap;
flex-flow: column nowrap;
}
```
### 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;
}
/* 实际应用 */
.header {
display: flex;
justify-content: space-between;
}
/* Logo在左,导航在右 */
```
### align-items(交叉轴对齐)
```css
.container {
/* 起点对齐 */
align-items: flex-start;
/* 终点对齐 */
align-items: flex-end;
/* 居中对齐 */
align-items: center;
/* 基线对齐 */
align-items: baseline;
/* 拉伸填满(默认) */
align-items: stretch;
}
/* 垂直居中 */
.center-box {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
```
### align-content(多行对齐)
```css
.container {
flex-wrap: wrap;
/* 起点对齐 */
align-content: flex-start;
/* 终点对齐 */
align-content: flex-end;
/* 居中对齐 */
align-content: center;
/* 两端对齐 */
align-content: space-between;
/* 环绕对齐 */
align-content: space-around;
/* 均匀分布 */
align-content: space-evenly;
/* 拉伸(默认) */
align-content: stretch;
}
```
### gap(间距)
```css
.container {
display: flex;
/* 行和列间距 */
gap: 20px;
/* 分别设置 */
row-gap: 20px;
column-gap: 10px;
/* 简写 */
gap: 20px 10px; /* 行 列 */
}
```
## 🎁 项目属性
### order(排序)
```css
.item {
/* 数值越小越靠前,默认0 */
order: 1;
}
.item:first-child {
order: 2; /* 放到最后 */
}
.item:last-child {
order: -1; /* 放到最前 */
}
```
### flex-grow(放大比例)
```css
.item {
/* 不放大(默认) */
flex-grow: 0;
/* 放大,占据剩余空间 */
flex-grow: 1;
}
/* 三列布局,中间列自适应 */
.sidebar {
flex-grow: 0;
width: 200px;
}
.main {
flex-grow: 1; /* 占据剩余空间 */
}
```
### flex-shrink(缩小比例)
```css
.item {
/* 空间不足时缩小,默认1 */
flex-shrink: 1;
/* 不缩小 */
flex-shrink: 0;
}
/* 防止图片缩小 */
img {
flex-shrink: 0;
}
```
### flex-basis(初始大小)
```css
.item {
/* 根据内容自动计算(默认) */
flex-basis: auto;
/* 固定大小 */
flex-basis: 200px;
/* 百分比 */
flex-basis: 50%;
/* 0需要带单位 */
flex-basis: 0px;
}
```
### flex(复合属性)
```css
.item {
/* flex-grow flex-shrink flex-basis */
flex: 1; /* 1 1 0% */
flex: auto; /* 1 1 auto */
flex: none; /* 0 0 auto */
flex: 0 1 auto; /* 默认值 */
/* 常用值 */
flex: 1; /* 平均分配空间 */
flex: 0 0 200px; /* 固定宽度 */
}
/* 三列等宽布局 */
.col {
flex: 1;
}
/* 固定宽度 + 自适应 */
.sidebar {
flex: 0 0 250px;
}
.main {
flex: 1;
}
```
### align-self(单个项目对齐)
```css
.item {
/* 继承容器的align-items(默认) */
align-self: auto;
/* 其他值同align-items */
align-self: flex-start;
align-self: flex-end;
align-self: center;
align-self: baseline;
align-self: stretch;
}
/* 某个项目特殊对齐 */
.special-item {
align-self: flex-end;
}
```
## 🎨 常见布局
### 水平垂直居中
```css
.center-container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
```
### 等高列布局
```css
.row {
display: flex;
}
.col {
flex: 1;
/* 自动等高 */
}
```
### 圣杯布局
```css
.container {
display: flex;
min-height: 100vh;
flex-direction: column;
}
.header, .footer {
flex: 0 0 auto;
}
.content {
display: flex;
flex: 1;
}
.sidebar {
flex: 0 0 200px;
}
.main {
flex: 1;
}
```
### 固定底部
```css
.page {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.content {
flex: 1;
}
.footer {
flex: 0 0 auto;
}
```
### 网格布局
```css
.grid {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.grid-item {
flex: 0 0 calc(33.333% - 14px);
}
/* 响应式 */
@media (max-width: 768px) {
.grid-item {
flex: 0 0 calc(50% - 10px);
}
}
@media (max-width: 480px) {
.grid-item {
flex: 0 0 100%;
}
}
```
### 导航栏
```css
/* 水平导航 */
.nav {
display: flex;
justify-content: space-between;
align-items: center;
}
.nav-left {
display: flex;
gap: 20px;
}
.nav-right {
display: flex;
gap: 10px;
margin-left: auto;
}
/* 垂直导航 */
.sidebar-nav {
display: flex;
flex-direction: column;
gap: 10px;
}
```
### 卡片布局
```css
.card {
display: flex;
flex-direction: column;
height: 100%;
}
.card-header {
flex: 0 0 auto;
}
.card-body {
flex: 1;
}
.card-footer {
flex: 0 0 auto;
}
```
### 媒体对象
```css
.media {
display: flex;
gap: 16px;
}
.media-image {
flex: 0 0 auto;
width: 100px;
}
.media-body {
flex: 1;
}
```
## 🔧 实战技巧
### 防止内容溢出
```css
.item {
/* 防止flex项目被挤压 */
min-width: 0;
min-height: 0;
}
.text-container {
flex: 1;
min-width: 0;
}
.text {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
```
### 自动边距对齐
```css
.container {
display: flex;
}
.item:last-child {
margin-left: auto; /* 推到最右边 */
}
/* 垂直居中某个元素 */
.special {
margin-top: auto;
margin-bottom: auto;
}
```
### 响应式Flexbox
```css
.container {
display: flex;
flex-direction: column;
}
@media (min-width: 768px) {
.container {
flex-direction: row;
}
}
/* 或使用flex-wrap */
.responsive-flex {
display: flex;
flex-wrap: wrap;
}
.item {
flex: 1 1 300px; /* 最小300px,会自动换行 */
}
```
## 📚 完整示例
### 响应式头部
```html