网站
引入
Flexbox 用来处理一维布局,也就是主要沿着一条轴排列元素。
它很适合做导航栏、按钮组、卡片列表、垂直居中和左右分布。
正文
定义
定义
Flexbox 是 CSS 的一维弹性布局模型,用于控制容器中子元素在主轴和交叉轴上的排列、对齐和空间分配。
使用 Flexbox 时,父元素叫 flex 容器,直接子元素叫 flex 项目。
基础语法
.container {
display: flex;
}只要给父元素设置 display: flex;,它的直接子元素就会按 Flexbox 规则排列。
<div class="nav">
<a href="#">首页</a>
<a href="#">文章</a>
<a href="#">关于</a>
</div>.nav {
display: flex;
gap: 16px;
}主轴和交叉轴
Flexbox 中最重要的是两个方向:
| 名称 | 说明 |
|---|---|
| 主轴 | flex 项目主要排列的方向 |
| 交叉轴 | 和主轴垂直的方向 |
默认情况下,主轴是从左到右。
也就是子元素会横向排列。
容器常见属性
| 属性 | 作用 |
|---|---|
display: flex; | 创建 flex 容器 |
flex-*direction* | 设置主轴方向 |
justify-content | 设置主轴上的对齐方式 |
align-items | 设置交叉轴上的对齐方式 |
flex-wrap | 控制是否换行 |
gap | 设置项目之间的间距 |
flex-direction
flex-direction 用来设置主轴方向。
.container {
display: flex;
flex-direction: row;
}常见值:
| 值 | 作用 |
|---|---|
row | 默认值,横向从左到右排列 |
row-reverse | 横向从右到左排列 |
column | 纵向从上到下排列 |
column-reverse | 纵向从下到上排列 |
justify-content
justify-content 控制项目在主轴上的对齐方式。
.container {
display: flex;
justify-content: center;
}常见值:
| 值 | 作用 |
|---|---|
flex-start | 靠主轴起点排列 |
flex-end | 靠主轴终点排列 |
center | 居中排列 |
space-between | 两端对齐,中间平均分布 |
space-around | 每个项目两侧都有空间 |
space-evenly | 所有间距完全平均 |
align-items
align-items 控制项目在交叉轴上的对齐方式。
.container {
display: flex;
align-items: center;
}常见值:
| 值 | 作用 |
|---|---|
stretch | 默认值,拉伸填满交叉轴 |
flex-start | 靠交叉轴起点 |
flex-end | 靠交叉轴终点 |
center | 交叉轴居中 |
baseline | 按文字基线对齐 |
水平垂直居中
Flexbox 很常用于居中。
.center-box {
display: flex;
justify-content: center;
align-items: center;
min-height: 200px;
}justify-content: center; 负责主轴居中。
align-items: center; 负责交叉轴居中。
换行 flex-wrap
默认情况下,flex 项目会尽量排在一行。
如果空间不够,可以允许换行。
.cards {
display: flex;
flex-wrap: wrap;
gap: 16px;
}常见值:
| 值 | 作用 |
|---|---|
nowrap | 默认值,不换行 |
wrap | 空间不够时换行 |
wrap-reverse | 反方向换行 |
项目常见属性
| 属性 | 作用 |
|---|---|
flex | 设置项目放大、缩小和基础尺寸 |
flex-grow | 设置剩余空间如何放大 |
flex-shrink | 设置空间不足时如何缩小 |
flex-basis | 设置项目基础尺寸 |
align-self | 单独控制某个项目的交叉轴对齐 |
order | 调整项目排列顺序 |
flex 简写
flex: 1 1 auto; 代表 flex-grow flex-shrink flex-basis 这三个值的简写
.item {
flex: 1;
}flex: 1; 常用来让多个项目平均分配剩余空间。
<div class="columns">
<div class="item">左</div>
<div class="item">中</div>
<div class="item">右</div>
</div>.columns {
display: flex;
gap: 16px;
}
.item {
flex: 1;
}三个 .item 会尽量等宽排列。
例子
两端对齐导航栏
<header class="header">
<div class="logo">Logo</div>
<nav class="menu">导航</nav>
</header>.header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px;
}卡片列表
<div class="cards">
<article class="card">卡片 1</article>
<article class="card">卡片 2</article>
<article class="card">卡片 3</article>
</div>.cards {
display: flex;
flex-wrap: wrap;
gap: 16px;
}
.card {
flex: 1 1 240px;
padding: 16px;
border: 1px solid #dddddd;
}flex: 1 1 240px; 表示卡片基础宽度是 240px,同时可以放大和缩小。
特点
- Flexbox 适合一维布局
- 父元素设置
display: flex;后,直接子元素成为 flex 项目 justify-content控制主轴对齐align-items控制交叉轴对齐gap可以直接设置项目间距flex: 1;常用于平均分配空间
注意事项
- Flexbox 是一维布局,不适合所有二维网格场景
justify-content和align-items的方向会受flex-direction影响- 只有 flex 容器的直接子元素才是 flex 项目
- 如果需要同时控制行和列,更适合使用 CSS Grid
理解
可以把 Flexbox 理解为一排可以自动伸缩的盒子。
它最擅长解决“这一行或这一列里的元素怎么排列、怎么对齐、怎么分空间”的问题。
做导航、居中、按钮组、卡片横排时,Flexbox 通常很顺手。
引出
Flexbox 适合一维布局,如果要同时控制行和列,可以继续学习 CSS Grid。