设计技巧

CSS Flexbox 布局完全指南

2025-07-20 · 阅读约 12 分钟

← 返回首页

在 Flexbox 出现之前,CSS 布局是一件令人头疼的事情。浮动(float)和定位(position)能实现布局,但语义不清晰、代码难维护。Flexbox 的出现彻底改变了前端布局的方式,让复杂的布局变得简单直观。

核心概念:两个轴

Flexbox 的一切围绕"两个轴"展开:

理解这两个轴,就理解了 Flexbox 的 80%。

容器属性

在父元素上设置 display: flex,它就变成了 Flex 容器,子元素自动成为 Flex 项目。

.container {
    display: flex;
    
    /* 主轴方向 */
    flex-direction: row;          /* 默认:水平排列 */
    flex-direction: column;       /* 垂直排列 */
    
    /* 主轴对齐 */
    justify-content: flex-start;  /* 左对齐(默认) */
    justify-content: center;      /* 居中 */
    justify-content: space-between; /* 两端对齐 */
    justify-content: space-around;  /* 等间距 */
    
    /* 交叉轴对齐 */
    align-items: stretch;         /* 拉伸填满(默认) */
    align-items: center;          /* 垂直居中 */
    align-items: flex-start;      /* 顶部对齐 */
    
    /* 是否换行 */
    flex-wrap: nowrap;            /* 不换行(默认) */
    flex-wrap: wrap;              /* 换行 */
}

项目属性

子元素(Flex 项目)可以控制自己在主轴方向上的行为:

.item {
    /* 放大比例:当容器有剩余空间时,如何分配 */
    flex-grow: 0;    /* 默认不放大 */
    flex-grow: 1;    /* 按比例放大 */
    
    /* 缩小比例:当空间不足时,如何缩小 */
    flex-shrink: 1;  /* 默认按比例缩小 */
    flex-shrink: 0;  /* 不缩小 */
    
    /* 初始大小 */
    flex-basis: auto;     /* 默认:内容大小 */
    flex-basis: 200px;    /* 固定初始宽度 */
    
    /* 简写:grow shrink basis */
    flex: 1;       /* 等同于 flex: 1 1 0% */
    flex: none;    /* 等同于 flex: 0 0 auto */
    
    /* 单独对齐(覆盖容器的 align-items) */
    align-self: center;
}

实战:常见布局一行搞定

/* 水平垂直居中 */
.center-box {
    display: flex;
    justify-content: center;
    align-items: center;
}

/* 导航栏:Logo 左,菜单右 */
.navbar {
    display: flex;
    justify-content: space-between;
    align-items: center;
}

/* 等宽三栏布局 */
.three-columns {
    display: flex;
}
.three-columns > * {
    flex: 1;
}

/* 底部固定,内容自适应 */
.page {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}
.page .content { flex: 1; }
.page .footer  { flex: none; }

常见问题与技巧

小结

Flexbox 是一维布局的利器,掌握它可以解决日常 90% 的布局需求。核心就是理解两个轴 + 六个对齐属性。建议在实际项目中多用多练,形成肌肉记忆。当需要二维布局(同时控制行和列)时,再考虑 CSS Grid。