首页 / CSS 入门教程 / Flexbox 基础

CSS 入门教程

Flexbox 基础

本教程共 44 篇 · 第 30 篇 · 更新于 2026-07-29 · 约 10 分钟阅读

Flexbox弹性布局flex-directionjustify-contentalign-itemsflex-wrap

30. Flexbox 基础

本节目标:理解 Flexbox 的核心概念,掌握容器属性和项目属性的基本用法,能实现常见布局。

什么是 Flexbox

Flexbox 是 CSS3 引入的弹性布局模块。它解决了浮动布局的诸多痛点,让横向排列、垂直居中等常见需求变得简单。

/* 开启 Flexbox 只需一行 */
.container {
    display: flex;
}

Flexbox 是目前最推荐的布局方式。所有现代浏览器都支持,可以放心使用。

核心概念

Flexbox 有两个核心角色:

  • 容器(flex container):设了 display: flex 的元素
  • 项目(flex item):容器的直接子元素
<div class="container">       <!-- 容器 -->
    <div class="item">1</div> <!-- 项目 -->
    <div class="item">2</div> <!-- 项目 -->
    <div class="item">3</div> <!-- 项目 -->
</div>
.container {
    display: flex;
}

Flexbox 有两条轴:

  • 主轴(main axis):项目排列的方向,默认水平从左到右
  • 交叉轴(cross axis):垂直于主轴的方向

搞定这两条轴,就搞定了 Flexbox 的大半。

容器属性

flex-direction —— 主轴方向

控制项目排列的方向。

.container {
    display: flex;
    flex-direction: row;            /* 水平从左到右(默认) */
    /* flex-direction: row-reverse;   水平从右到左 */
    /* flex-direction: column;        垂直从上到下 */
    /* flex-direction: column-reverse; 垂直从下到上 */
}
效果
row水平排列,从左到右(默认)
row-reverse水平排列,从右到左
column垂直排列,从上到下
column-reverse垂直排列,从下到上

flex-wrap —— 是否换行

默认情况下,项目会挤在一行。flex-wrap 控制是否允许换行。

.container {
    display: flex;
    flex-wrap: wrap;          /* 允许换行 */
    /* flex-wrap: nowrap;       不换行(默认) */
    /* flex-wrap: wrap-reverse; 反向换行 */
}
效果
nowrap不换行,项目会被压缩(默认)
wrap超出时换到下一行
wrap-reverse超出时反向换行

flex-flow —— 简写属性

flex-flow 是 flex-direction 和 flex-wrap 的简写。

.container {
    display: flex;
    flex-flow: row wrap;      /* 方向 + 换行 */
}

justify-content —— 主轴对齐

控制项目在主轴上的对齐方式。

.container {
    display: flex;
    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所有间距完全相等

align-items —— 交叉轴对齐

控制项目在交叉轴上的对齐方式。

.container {
    display: flex;
    align-items: stretch;        /* 拉伸填满容器(默认) */
    /* align-items: flex-start;    靠交叉轴起点 */
    /* align-items: flex-end;      靠交叉轴终点 */
    /* align-items: center;        交叉轴居中 */
    /* align-items: baseline;      基线对齐 */
}
效果
stretch拉伸填满容器高度(默认)
flex-start靠交叉轴起点对齐
flex-end靠交叉轴终点对齐
center交叉轴居中对齐
baseline按文字基线对齐

align-content —— 多行对齐

当有多行时,控制行与行之间的对齐方式。

.container {
    display: flex;
    flex-wrap: wrap;
    align-content: flex-start;     /* 行靠上 */
    /* align-content: center;        行居中 */
    /* align-content: space-between; 行之间等距 */
}

align-content 只在多行时生效。单行时用 align-items。

完美居中

Flexbox 让垂直居中变得极其简单。

.center-box {
    display: flex;
    justify-content: center;    /* 水平居中 */
    align-items: center;        /* 垂直居中 */
    height: 300px;
}
<div class="center-box">
    <p>完美居中</p>
</div>

过去垂直居中需要各种 hack,现在两行代码搞定。这就是 Flexbox 的魅力。

项目属性

order —— 排序

控制项目的显示顺序,值越小越靠前。默认是 0。

.item1 { order: 2; }
.item2 { order: 0; }
.item3 { order: 1; }

效果:显示顺序为 item2 -> item3 -> item1。

flex-grow —— 放大比例

控制项目如何分配剩余空间。默认是 0(不放大)。

.item {
    flex-grow: 1;     /* 所有项目等分剩余空间 */
}

.item-large {
    flex-grow: 2;     /* 占两份 */
}

flex-shrink —— 收缩比例

控制项目如何收缩。默认是 1(等比收缩)。

.item {
    flex-shrink: 1;       /* 默认,空间不足时等比收缩 */
}

.item-fixed {
    flex-shrink: 0;       /* 不收缩,保持原大小 */
}

flex-basis —— 初始大小

设置项目在分配多余空间前的初始大小。

.item {
    flex-basis: 200px;    /* 初始宽度 200px */
}

flex —— 简写属性

flex 是 flex-grow、flex-shrink、flex-basis 的简写。

.item {
    flex: 1;              /* 等于 flex: 1 1 0% */
    /* flex: 0 0 200px;     不放大不收缩,固定 200px */
    /* flex: 1 0 auto;      可放大不收缩,初始大小由内容决定 */
}

align-self —— 单独对齐

覆盖容器的 align-items,让单个项目有不同的对齐方式。

.item {
    align-self: center;       /* 这个项目居中 */
}

.item-top {
    align-self: flex-start;   /* 这个项目靠上 */
}

常见布局实例

等宽三栏

.container {
    display: flex;
}

.item {
    flex: 1;              /* 三个项目等宽 */
    padding: 20px;
}

左侧固定,右侧自适应

.container {
    display: flex;
}

.sidebar {
    width: 200px;         /* 固定宽度 */
}

.main {
    flex: 1;              /* 占满剩余空间 */
}

导航栏

.nav {
    display: flex;
    justify-content: space-between;   /* 两端对齐 */
    align-items: center;              /* 垂直居中 */
    padding: 0 20px;
    height: 60px;
    background: #333;
}

.nav-links {
    display: flex;
    gap: 20px;            /* 项目之间的间距 */
}

.nav a {
    color: white;
    text-decoration: none;
}

gap 属性可以设置项目之间的间距,比 margin 更简洁。

卡片等高

.card-list {
    display: flex;
}

.card {
    flex: 1;
    padding: 20px;
    border: 1px solid #ddd;
}

效果:所有卡片自动等高,无需额外设置。

Flexbox vs 浮动

对比项浮动Flexbox
横向排列需要 float + widthdisplay: flex 即可
垂直居中困难justify-content + align-items
等高需要 hack自动等高
顺序调整改 HTML用 order 属性
换行需要计算宽度flex-wrap: wrap

新项目优先用 Flexbox。浮动只用于文字环绕图片的场景。

浏览器兼容性

Flexbox 已被所有现代浏览器支持:

  • Chrome 29+
  • Firefox 28+(Firefox 22-27 仅支持旧版单行语法)
  • Safari 10+
  • Edge 11+
  • IE 11(部分支持,有 bug)

如果需要支持 IE 10,可以加 -ms- 前缀。IE 9 及以下不支持。

小结

  • Flexbox 是 CSS3 弹性布局,解决了浮动布局的诸多痛点
  • 容器设 display: flex,直接子元素自动成为项目
  • flex-direction 控制主轴方向,flex-wrap 控制换行
  • justify-content 控制主轴对齐,align-items 控制交叉轴对齐
  • flex 简写属性是 grow、shrink、basis 的合并
  • order 可以调整项目显示顺序,无需修改 HTML