CSS 布局从早期的 floatposition,发展到现在以 Flexbox 和 Grid 为核心的现代布局方案。 本文整理了一些常用场景及其最佳实践。

Flexbox:一维布局利器

Flexbox 适合处理单行或单列的元素排列。以下是我最常用的几个场景:

1. 水平居中 + 垂直居中

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

2. 两端对齐导航栏

.navbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

3. 等宽多列布局

.card-list {
  display: flex;
  gap: 1rem;
}
.card {
  flex: 1;  /* 等分剩余空间 */
}

4. 内容自动撑满剩余空间

.page {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}
.main-content {
  flex: 1;  /* 撑满页脚上方的所有空间 */
}

Grid:二维布局王者

Grid 适合同时控制行和列的复杂布局。几个典型场景:

1. 响应式卡片网格

.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 1.5rem;
}

auto-fill 配合 minmax() 是实现无需媒体查询的响应式布局的关键技巧—— 列数会根据容器宽度自动调整。

2. 经典圣杯布局

.layout {
  display: grid;
  grid-template-areas:
    "header  header  header"
    "sidebar main    aside"
    "footer  footer  footer";
  grid-template-columns: 200px 1fr 200px;
}
.header  { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main    { grid-area: main; }
.aside   { grid-area: aside; }
.footer  { grid-area: footer; }

Flexbox vs Grid:如何选择

一个简单的判断原则:

  • 内容驱动布局(内容决定尺寸)→ 用 Flexbox
  • 容器驱动布局(先有网格,内容放进去)→ 用 Grid
  • 处理单行/单列的对齐和分布 → 用 Flexbox
  • 处理多行多列的整体布局 → 用 Grid

两者不是非此即彼的关系。在实际项目中,经常是 Grid 做页面大框架, Flexbox 做组件内部的对齐——配合使用效果最好。

浏览器兼容性

Flexbox 和 Grid 在现代浏览器中都有很好的支持(覆盖 97% 以上的用户)。 如果项目需要支持 IE11,Flexbox 基本可用(部分 bug), Grid 则需要降级方案或使用 autoprefixer。

掌握 Flexbox 和 Grid 之后,布局不再是 CSS 的痛点。 与其记忆大量属性,不如多动手练习——用得多了自然就熟了。