2024-02-28·19 min read

现代 CSS 布局完全指南

掌握 Flexbox、Grid 和 Container Queries 等现代 CSS 布局技术

CSS布局前端

现代 CSS 布局完全指南

CSS 布局技术在过去几年有了巨大的进步。本文将介绍现代 CSS 布局的核心技术。

Flexbox 布局

Flexbox 是一维布局的最佳选择:

.container {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 1rem;
}

/* 响应式 Flexbox */
.card-container {
  display: flex;
  flex-wrap: wrap;
  gap: 2rem;
}

.card {
  flex: 1 1 300px; /* grow shrink basis */
}

常用 Flexbox 模式

垂直居中:

.center {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
}

等高列:

.columns {
  display: flex;
}

.column {
  flex: 1;
  padding: 1rem;
}

Grid 布局

Grid 是二维布局的强大工具:

.grid-container {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 2rem;
}

/* 复杂布局 */
.app-layout {
  display: grid;
  grid-template-areas:
    "header header header"
    "sidebar main aside"
    "footer footer footer";
  grid-template-columns: 200px 1fr 200px;
  grid-template-rows: auto 1fr auto;
  min-height: 100vh;
}

.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }

Grid 的强大功能

自动填充:

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

网格线命名:

.named-grid {
  display: grid;
  grid-template-columns: [start] 1fr [content-start] 3fr [content-end] 1fr [end];
}

.content {
  grid-column: content-start / content-end;
}

Container Queries

容器查询是响应式设计的游戏改变者:

.card-container {
  container-type: inline-size;
  container-name: card;
}

@container card (min-width: 400px) {
  .card {
    display: grid;
    grid-template-columns: 150px 1fr;
  }
}

@container card (min-width: 600px) {
  .card {
    grid-template-columns: 200px 1fr;
    gap: 2rem;
  }
}

CSS 逻辑属性

使用逻辑属性支持多语言布局:

/* 传统方式 */
.box {
  margin-left: 1rem;
  padding-right: 2rem;
}

/* 逻辑属性 */
.box {
  margin-inline-start: 1rem;
  padding-inline-end: 2rem;
}

/* 逻辑尺寸 */
.container {
  max-inline-size: 1200px; /* 相当于 max-width */
  min-block-size: 100vh;   /* 相当于 min-height */
}

Subgrid

Subgrid 让嵌套网格更加灵活:

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

.child-grid {
  display: grid;
  grid-template-columns: subgrid;
  grid-column: span 2;
}

CSS Layers

使用级联层管理样式优先级:

@layer reset, base, components, utilities;

@layer reset {
  * {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
  }
}

@layer base {
  body {
    font-family: system-ui, sans-serif;
    line-height: 1.5;
  }
}

@layer components {
  .btn {
    padding: 0.5rem 1rem;
    border-radius: 0.25rem;
  }
}

响应式设计新特性

clamp() 函数

.fluid-text {
  font-size: clamp(1rem, 2vw + 1rem, 3rem);
}

.fluid-spacing {
  padding: clamp(1rem, 5vw, 3rem);
}

aspect-ratio

.video-container {
  aspect-ratio: 16 / 9;
  width: 100%;
  background: #000;
}

.square {
  aspect-ratio: 1;
  width: 100%;
  max-width: 300px;
}

实用布局模式

圣杯布局

.holy-grail {
  display: grid;
  grid-template: auto 1fr auto / auto 1fr auto;
  min-height: 100vh;
}

header {
  grid-column: 1 / 4;
}

main {
  grid-column: 2 / 3;
}

footer {
  grid-column: 1 / 4;
}

卡片布局

.cards {
  --min: 250px;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(var(--min), 1fr));
  gap: 2rem;
}

总结

现代 CSS 提供了强大而灵活的布局工具:

  • Flexbox - 一维布局的首选
  • Grid - 复杂二维布局的解决方案
  • Container Queries - 组件级响应式设计
  • 逻辑属性 - 国际化友好的布局
  • 新函数 - clamp()、min()、max() 等

掌握这些技术,可以轻松创建复杂、响应式的现代网页布局。