六维教程

CSS 综合实战

这是 CSS 系列课程的收官篇。从系列第一课开始,选择器、盒模型、Flexbox、Grid、响应式,一路学到现在。今天不用单个知识点做例子,而是从零做一个完整的个人博客首页,把学过的内容全部串起来。这也是正式做项目前最好的热身。

第一步,先想清楚再做

很多人写页面上来就写代码,写到一半发现缺东少西。正确姿势是先列需求清单。以个人博客首页为例,需要这些区块:

  • 顶部导航栏,站名加几个链接
  • 主体区域,左侧文章列表,右侧个人简介
  • 每篇文章是一张卡片,标题、摘要、日期
  • 底部版权信息

设计风格定为简洁风,白底、深灰文字、一个蓝色主色调。颜色和间距后面会用 CSS 变量统一管理,方便调整。

第二步,语义化 HTML

结构用语义化标签搭好,header、nav、main、section、aside、footer,一个都不能少。语义化对 SEO 和屏幕阅读器友好,也方便自己维护。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>小明的博客</title>
  <link rel="stylesheet" href="base.css">
  <link rel="stylesheet" href="layout.css">
  <link rel="stylesheet" href="components.css">
</head>
<body>
  <header class="site-header">
    <a href="#" class="logo">小明博客</a>
    <nav class="main-nav">
      <a href="#">首页</a>
      <a href="#">文章</a>
      <a href="#">关于</a>
    </nav>
  </header>

  <main class="layout">
    <section class="posts">
      <article class="card">
        <h2>CSS 响应式设计入门</h2>
        <p class="card-date">2026-08-19</p>
        <p>响应式设计的三大支柱,流式布局、弹性图片和媒体查询。</p>
      </article>
      <article class="card">
        <h2>CSS 动画入门</h2>
        <p class="card-date">2026-08-18</p>
        <p>用 @keyframes 写出自动播放的多段动画。</p>
      </article>
    </section>

    <aside class="profile">
      <h3>关于我</h3>
      <p>前端学习者,正在把 CSS 从头到尾啃一遍。</p>
    </aside>
  </main>

  <footer class="site-footer">© 2026 小明博客</footer>
</body>
</html>

第三步,全局样式

每个浏览器默认样式不同,比如 margin 和 padding 都有差异。处理方式有两个流派。reset 是把默认样式全部清零,一切从零开始。normalize 是尽量抹平浏览器差异,保留有用的默认值。个人小项目用简化版 reset 就够:

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;  /* 宽高包含 padding 和 border,布局更好算 */
}

html {
  font-size: 16px;
}

body {
  font-family: "Microsoft YaHei", sans-serif;
  color: #333;
  background: #f7f7f7;
  line-height: 1.6;
}

img {
  max-width: 100%;
  height: auto;
}

box-sizing 这一行非常关键。改成 border-box 后,width 就是最终的盒子总宽,做响应式时算尺寸省心很多。

第四步,样式文件怎么组织

页面变复杂后,所有样式挤在一个文件里会很难维护,按职责拆分是常见做法。base 放 reset 和全局默认值,layout 放页面骨架布局,components 放卡片、按钮这类组件,utilities 放工具类比如 .text-center。文件拆开后用多个 link 标签引入,注意顺序,后面的样式表会覆盖前面的同名规则,所以按 base、layout、components 从底层到上层的顺序排。

@import 也能引入样式,但它在加载时是串行的,性能比 link 差,实际项目尽量不用。

第五步,Grid 和 Flexbox 协同

整页骨架用 Grid 的区域法划分,一目了然。导航和卡片内部用 Flexbox 排细节,两者各司其职。

/* layout.css */
.layout {
  display: grid;
  grid-template-columns: 1fr 280px;  /* 左侧文章区自适应,右侧固定 */
  grid-template-areas: "posts profile";
  gap: 24px;
  max-width: 1100px;
  margin: 0 auto;
  padding: 24px 16px;
}

.posts { grid-area: posts; }
.profile { grid-area: profile; }

/* components.css */
.card {
  background: #fff;
  border-radius: 8px;
  padding: 20px;
  margin-bottom: 16px;
  transition: transform 0.3s, box-shadow 0.3s;
}

.card:hover {
  transform: translateY(-4px);
  box-shadow: 0 6px 16px rgba(0, 0, 0, 0.1);
}

.main-nav {
  display: flex;
  gap: 20px;
}

.site-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  max-width: 1100px;
  margin: 0 auto;
  padding: 16px;
}

第六步,响应式适配

小屏幕上一左一右太挤,改成单列,侧边栏挪到下面:

/* layout.css */
@media (max-width: 768px) {
  .layout {
    grid-template-columns: 1fr;
    grid-template-areas: "posts" "profile";
  }
}

配合响应式课里学的 viewport 和弹性图片,手机上的体验就不会差。

第七步,动效点缀

动效不用多,点缀即可。卡片 hover 上浮已经写了。再给卡片加一个入场动画,页面加载时淡入上浮,用动画课里的知识就能实现:

@keyframes rise-in {
  from {
    opacity: 0;
    transform: translateY(20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.card {
  animation: rise-in 0.5s ease-out;
}

第八步,兼容性检查

上线前做三件事。第一,拿不准的特性去 caniuse.com 查浏览器支持情况。第二,个别老浏览器需要的 -webkit- 前缀,现在主流特性基本不需要手动加了,真需要时可以用自动加前缀的工具处理。第三,想用新特性又怕老浏览器白屏,用 @supports 做特性检测:

@supports (display: grid) {
  .layout { display: grid; }
}

最后一步,按 F12 打开 Chrome 开发者工具,用设备模拟模式切换几个常见机型看效果,手机、平板、电脑各看一眼,重点检查有没有横向滚动条。

课程总结与下一步

到这里,CSS 系列课程全部结束。回顾一下主线,先学选择器和盒模型理解样式作用机制,再学 Flexbox 和 Grid 搞定布局,然后用响应式、变量、动效让页面适应各种屏幕并且活起来,最后用实战把知识串成整体。这套体系已经能支撑你独立完成大部分静态页面。

后续想继续深入,方向有四个。想提升写作效率,学预处理器 Sass 或 Less。想规范团队代码,学 BEM 命名方法论。想快速出活,学 Tailwind 和 Bootstrap 这类框架。想追踪前沿,关注 container queries、:has 选择器、subgrid 这些新特性。不管选哪个方向,基础打牢了,一切都只是时间问题。

上一篇
CSS 媒体查询
下一篇
CSS scroll-behavior属性