CSS3 Flexbox 布局完全指南:从入门到实战
Introduction
CSS3 Flexbox(Flexible Box Layout Module)是 CSS3 引入的第五种布局方案,专门用于解决传统 float 和 position 难以优雅实现的一维布局问题——无论是水平居中、等高列、等宽卡片还是响应式导航栏,Flexbox 都能用几行代码优雅完成。本文涵盖 Flexbox 的全部核心概念、容器属性、项目属性及 10+ 实战场景。
基础概念:弹性容器与弹性项目
/* 1. 创建弹性容器 */
.container {
display: flex; /* 块级弹性容器 */
/* display: inline-flex; 行内级弹性容器 */
}
/* 2. 常用容器属性 */
.container {
flex-direction: row | row-reverse | column | column-reverse;
flex-wrap: nowrap | wrap | wrap-reverse;
justify-content: flex-start | flex-end | center | space-between | space-around;
align-items: stretch | flex-start | flex-end | center | baseline;
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
gap: 20px; /* 项目间距 */
}
实战:经典居中布局
/* 水平垂直同时居中 */
.parent {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
/* 响应式导航栏 */
.nav {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 2rem;
}
.nav-links {
display: flex;
gap: 1.5rem;
list-style: none;
}
/* Sticky Footer(页面内容不满时让 footer 贴底) */
.page {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.page-content { flex: 1; }
弹性项目属性
.item {
flex-grow: 1; /* 放大比例,0=不放大,默认0 */
flex-shrink: 0; /* 缩小比例,0=不缩小,默认1 */
flex-basis: auto;/* 初始主尺寸 */
/* 常用简写 */
flex: 1; /* flex: 1 1 0% 平均分配 */
flex: 0 0 200px; /* 不伸缩,固定200px */
flex: auto; /* flex: 1 1 auto 先放大后缩小 */
align-self: center; /* 覆盖容器 align-items */
margin-left: auto; /* 利用 auto margin 实现特殊对齐 */
}
运行效果
在浏览器中打开上述代码:导航栏.logo 在左、链接在右,自动响应间距;div.parent 中的子元素水平和垂直同时居中;Sticky Footer 布局中,当内容很少时 footer 自动贴底,内容超过一屏时 footer 随页面自然滚动。
常见问题
- flex-direction 默认是 row:主轴为水平方向(从左到右),交叉轴为垂直方向(从上到下)。改为 column 后主轴变为垂直方向。
- flex-grow vs flex-shrink:grow 控制空间多余时怎么分,shrink 控制空间不足时怎么缩。设为 0 表示保持固定尺寸不参与弹性调整。
- justify-content vs align-items:前者沿主轴(main axis)对齐,后者沿交叉轴(cross axis)对齐。direction 改变时两者的作用方向也会反转。
- gap 在低版本 Safari 有兼容问题:iOS Safari 14 以下需加 -webkit- 前缀。
- Flexbox 完整属性速查表:CSS-Tricks Flexbox Guide
- 交互式学习工具:Flexbox Froggy(游戏化学习)
- Flexbox vs Grid 对比:什么时候该用哪种布局