Home
avatar

TheBlockSky

CSS 现代布局:Grid 与 Flexbox 实战技巧

前言

CSS 布局经历了从表格布局到浮动布局,再到 Flexbox 和 Grid 的演进。如今,Flexbox 和 Grid 已经成为现代 Web 布局的两大基石。本文将结合实际场景,分享一些实用的布局技巧。

Flexbox 实战

经典导航栏

.nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 1rem 2rem;
}

.nav-links {
  display: flex;
  gap: 1.5rem;
  list-style: none;
}

卡片列表自适应

.card-list {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}

.card {
  flex: 1 1 300px;
  /* 等价于 flex-grow: 1; flex-shrink: 1; flex-basis: 300px */
}

粘性底部布局

.page {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}

.content {
  flex: 1;  /* 撑满剩余空间,将 footer 推到底部 */
}

.footer {
  flex-shrink: 0;
}

Grid 实战

响应式文章网格

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

auto-fillminmax() 的组合是实现响应式网格的经典方案,无需任何媒体查询。

经典博客布局

.blog-layout {
  display: grid;
  grid-template-columns: 1fr 300px;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "header  header"
    "content aside"
    "footer  footer";
  gap: 2rem;
}

.header { grid-area: header; }
.content { grid-area: content; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }

@media (max-width: 768px) {
  .blog-layout {
    grid-template-columns: 1fr;
    grid-template-areas:
      "header"
      "content"
      "aside"
      "footer";
  }
}

瀑布流布局

.masonry {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1rem;
}

.masonry-item {
  break-inside: avoid;
}

.masonry-item:nth-child(1) {
  grid-row: span 2;
}

Flexbox vs Grid 选择指南

场景推荐原因
一维导航栏Flexbox主轴排列灵活
二维整体布局Grid行列同时控制
未知数量的卡片Grid + auto-fill自动填充网格
居中对齐Flexboxalign/justify 简洁
不规则网格Grid精确控制位置

实用技巧

1. 使用 gap 替代 margin

/* ❌ 旧方式 */
.flex > * + * {
  margin-left: 1rem;
}

/* ✅ 新方式 */
.flex {
  display: flex;
  gap: 1rem;
}

2. 自动等分布局

.equal-grid {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 1fr;
  gap: 1rem;
}

3. 内容自适应最小宽度

.grid-item {
  min-width: 0;  /* 防止 Grid 溢出 */
  overflow-wrap: break-word;
}

总结

Flexbox 擅长一维排列,Grid 擅长二维布局。两者结合使用可以应对几乎所有现代 Web 布局需求。掌握 gapauto-fillminmax() 等新特性,能让你的 CSS 代码更简洁、更强大。

CSS 前端 布局 Grid Flexbox