全栈开发学习系列
阶段一(编程基础)8/8篇 ✅ 完结
—— 阶段二:Web 全栈 ——
09 HTML 基础:网页骨架与语义化标签 ✅
10 CSS 基础:样式、布局与响应式(当前篇)
11 JavaScript 基础:变量、DOM 与事件
12 HTTP 协议基础:请求、响应与状态码
13 FastAPI 入门:构建第一个 RESTful API
14 PostgreSQL 基础:数据库设计与 SQL 操作
15 认证授权:JWT、Session 与 Cookie
16 综合实战:带登录的博客系统

CSS 基础:样式、布局与响应式

从朴素文本到专业页面,掌握网页样式与布局的核心技能
基础篇CSSFlex 布局
读完本篇你将能
用三种方式将 CSS 引入 HTML 页面,使用元素/类/ID/伪类选择器精准定位元素,理解盒模型并正确计算元素尺寸,掌握文本与颜色样式属性,用 Flex 布局实现水平/垂直排列,编写响应式页面适配不同屏幕,为上一篇的个人主页添加完整样式。
目录
01 从毛坯房到精装修:CSS 入门
02 CSS 选择器:精准定位元素
03 盒模型:元素的尺寸密码
04 文本与颜色:页面的妆容
05 Flex 布局:一维排列之王
06 响应式设计:适配所有屏幕
07 实战:精装修个人主页
08 动手练习

01 从毛坯房到精装修:CSS 入门

上一篇你用 HTML 搭建了个人主页的骨架——结构完整但毫无样式:默认黑色字体、左对齐文本、蓝色下划线链接。就像拿到一套毛坯房,户型是对的,但水泥墙面裸露、没有地板、没有灯具。

CSS(Cascading Style Sheets,层叠样式表)就是精装修:刷墙、铺地板、装灯具、摆家具。HTML 定义“是什么”,CSS 定义“长什么样”。

层叠的含义:当多条规则同时作用于同一元素时,浏览器按优先级叠加应用样式。

CSS 三种引入方式

1. 内联样式:在 HTML 元素的 style 属性中直接写 CSS

2. 内部样式表:在 <head> 中的 <style> 标签内写 CSS

3. 外部样式表:在单独的 .css 文件中写 CSS,用 <link> 引入

html
<!-- 方式一:内联样式 -->
<p style="color: red;">红色文字</p>
<!-- 方式二:内部样式表 -->
<style>
  p { color: blue; }
</style>
<!-- 方式三:外部样式表 -->
<link rel="stylesheet" href="style.css">
小贴士
实际开发中 99% 使用外部样式表。原因:HTML 和 CSS 分离便于维护,同一个 .css 文件可以被多个页面复用,浏览器会缓存外部文件加快加载速度。

02 CSS 选择器:精准定位元素

你知道了 CSS 可以给元素加样式,但页面上有几十个 <p> 标签,怎么只给其中某个加样式?这就需要选择器——告诉浏览器“选中哪些元素”。

比喻:装修工人拿着设计图,图上标注“主卧刷浅蓝、次卧刷米黄、客厅铺木地板”。选择器就是这些标注。

基本选择器

选择器类型语法示例选中范围
元素选择器标签名 {}p {}所有 <p> 元素
类选择器.类名 {}.card {}class="card" 的元素
ID 选择器#ID名 {}#header {}id="header" 的元素(唯一)

组合选择器

后代选择器:.nav a {} — 选中 .nav 内部所有 <a>(不管嵌套多深)

子元素选择器:.nav > a {} — 只选中 .nav 直接子级的 <a>

伪类选择器:a:hover {} — 鼠标悬停时的 <a>

css
1/* 元素选择器:所有段落 */
2p {
3  color: #333333;
4  line-height: 1.8;
5}
6
7/* 类选择器:导航链接 */
8.nav-link {
9  color: #c026d3;
10  text-decoration: none;
11}
12
13/* ID 选择器:页面主标题 */
14#main-title {
15  font-size: 32px;
16  font-weight: bold;
17}
18
19/* 后代选择器:导航栏内的链接 */
20.nav a {
21  padding: 8px 16px;
22}
23
24/* 伪类选择器:鼠标悬停 */
25.nav-link:hover {
26  color: #a21caf;
27}
小贴士
类选择器是最常用的选择器。一个元素可以有多个类(class="card active"),一个类可以应用于多个元素。ID 选择器唯一性约束更强,适合标识页面上独一无二的元素(如 #header、#footer)。

03 盒模型:元素的尺寸密码

选择器解决了“给谁加样式”的问题,盒模型解决“元素占多大空间”的问题。

每个 HTML 元素都是一个矩形盒子,从内到外有四层结构:

1. content(内容):文字、图片等实际内容

2. padding(内边距):内容到边框的留白

3. border(边框):元素的边框线

4. margin(外边距):元素与其他元素之间的间距

margin(外边距)
border(边框)
padding(内边距)
content(内容)

关键属性 box-sizing

content-box(默认):width 只包含 content,加上 padding 和 border 后实际更宽

border-box:width 包含 content + padding + border,设置多少就是多少

常见错误
width: 200px; padding: 20px; — 实际宽度 240px
box-sizing: border-box; width: 200px; padding: 20px; — 实际宽度 200px
css
.box {
  box-sizing: border-box;
  width: 200px;
  padding: 20px;
  border: 2px solid #c026d3;
  margin: 16px;
}
小贴士
在项目初始化时,用通配符选择器 * 给所有元素设置 box-sizing: border-box,可以避免 90% 的尺寸计算错误。这是前端开发的事实标准做法。

04 文本与颜色:页面的妆容

盒模型搞定了空间尺寸,现在来给内容本身做造型——文字大小、颜色、对齐方式、背景色。

文本相关属性

color:文字颜色

font-size:字号(推荐 px 或 rem)

font-weight:字重(normal / bold / 400 / 700)

line-height:行高(推荐 1.5-1.8 倍字号)

text-align:对齐方式(left / center / right)

text-decoration:下划线(none / underline)

颜色表示法

表示法格式示例适用场景
HEX#RRGGBB#c026d3最常用
RGBrgb(r,g,b)rgb(192,38,211)需要计算颜色值时
RGBArgba(r,g,b,a)rgba(192,38,211,0.5)需要半透明时
css
1body {
2  color: #333333;
3  font-size: 16px;
4  line-height: 1.8;
5  background-color: #ffffff;
6}
7
8h1 {
9  color: #c026d3;
10  font-size: 32px;
11  font-weight: bold;
12  text-align: center;
13}
14
15a {
16  color: #c026d3;
17  text-decoration: none;
18}
19
20.card {
21  background-color: #f5d0fe;
22  border: 1px solid #c026d3;
23  border-radius: 8px;
24  padding: 20px;
25}

05 Flex 布局:一维排列之王

文本和颜色让页面变好看了,但元素还是从上到下堆叠——导航栏没法水平排列,卡片没法并排展示。CSS 布局解决这个问题。

历史背景:以前用 float 和 position 做布局,代码复杂、容易出错。2013 年 Flex 布局成为标准,一维排列变得极其简单。

Flex 的核心概念:给父元素设置 display: flex,它就变成“弹性容器”,子元素自动变成“弹性项目”,可以水平或垂直排列。

容器属性

属性可选值作用
flex-directionrow / column主轴方向(水平/垂直)
justify-contentflex-start / center / space-between / space-around主轴对齐方式
align-itemsflex-start / center / stretch交叉轴对齐方式
flex-wrapnowrap / wrap是否换行

子元素属性

flex: 1 — 自动填充剩余空间

flex-shrink: 0 — 不缩小

css
1/* 导航栏:水平均匀排列 */
2.nav {
3  display: flex;
4  justify-content: space-between;
5  align-items: center;
6  padding: 16px 24px;
7}
8
9/* 导航链接组 */
10.nav-links {
11  display: flex;
12  gap: 16px;
13}
14
15/* 卡片网格:自动换行 */
16.card-grid {
17  display: flex;
18  flex-wrap: wrap;
19}
20
21.card-item {
22  flex: 1 1 calc(33.33% - 16px);
23  margin: 8px;
24}
常见错误
用 float: left 做布局 — 需要清除浮动、容易塌陷
用 display: flex — 一行代码搞定对齐和分布
小贴士
gap 属性在 Flex 布局中可以设置子元素间距(gap: 16px),比用 margin 更简洁。但旧版浏览器可能不支持,生产环境可用 margin 替代。

06 响应式设计:适配所有屏幕

Flex 布局解决了排列问题,但手机屏幕 375px、平板 768px、电脑 1920px——同一页面怎么适配所有宽度?

第一步:viewport meta 标签

html
<meta name="viewport" content="width=device-width, initial-scale=1.0">

没有这行代码,手机浏览器会把页面按 980px 宽度渲染再缩小,导致文字极小。

第二步:相对单位 + max-width

用百分比宽度代替固定像素:width: 100%

用 max-width 限制最大宽度:max-width: 1200px

图片自适应:img { max-width: 100%; height: auto; }

第三步:媒体查询 @media

css
1/* 默认样式(移动端优先) */
2.card-grid {
3  display: flex;
4  flex-direction: column;
5}
6
7/* 平板:768px 以上变两列 */
8@media (min-width: 768px) {
9  .card-grid {
10    flex-direction: row;
11    flex-wrap: wrap;
12  }
13  .card-item {
14    flex: 1 1 calc(50% - 16px);
15  }
16}
17
18/* 桌面:1024px 以上变三列 */
19@media (min-width: 1024px) {
20  .card-item {
21    flex: 1 1 calc(33.33% - 16px);
22  }
23}

移动端优先策略:先写移动端样式(最简单),再用 @media (min-width: ...) 逐步增强大屏体验。这比“桌面优先再降级”更高效。

小贴士
在 macOS 上用 Chrome DevTools 测试响应式:右键检查 → 切换设备工具栏(Cmd+Shift+M),可以选择 iPhone/iPad 等设备预设,实时查看不同屏幕下的效果。

07 实战:精装修个人主页

现在把前六节的知识综合起来,给上一篇的个人主页穿上 CSS 外衣。

css
1/* 全局重置 */
2* {
3  margin: 0;
4  padding: 0;
5  box-sizing: border-box;
6}
7body {
8  font-family: sans-serif;
9  color: #333333;
10  line-height: 1.8;
11  background-color: #f9fafb;
12}
13/* 头部导航 */
14.nav {
15  display: flex;
16  justify-content: space-between;
17  align-items: center;
18  padding: 16px 24px;
19  background-color: #ffffff;
20  border-bottom: 1px solid #e5e7eb;
21}
22.nav-links {
23  display: flex;
24  gap: 24px;
25}
26.nav-link {
27  color: #333333;
28  text-decoration: none;
29}
30.nav-link:hover {
31  color: #c026d3;
32}
33/* 主内容区 */
34main {
35  max-width: 1200px;
36  margin: 0 auto;
37  padding: 40px 24px;
38}
39/* 卡片样式 */
40.card {
41  background-color: #ffffff;
42  border: 1px solid #e5e7eb;
43  border-radius: 8px;
44  padding: 24px;
45  margin-bottom: 24px;
46}
47footer {
48  text-align: center;
49  padding: 24px;
50  color: #999999;
51}
52/* 响应式:移动端导航垂直 */
53@media (max-width: 768px) {
54  .nav {
55    flex-direction: column;
56    gap: 12px;
57  }
58  .nav-links {
59    flex-direction: column;
60    align-items: center;
61  }
62}

这段 CSS 做了什么——全局重置避免盒模型问题,Flex 布局让导航栏水平排列,卡片样式用 border-radius 和 padding 做出圆角留白,媒体查询让导航在窄屏幕下垂直堆叠。

把这段 CSS 保存为 style.css,与上一篇的 HTML 文件放在同一目录,在 HTML 的 <head> 中加上 <link rel="stylesheet" href="style.css">,刷新浏览器就能看到效果。

08 动手练习

🟢 基础验证
创建一个 HTML 文件,包含一个 h1 和一个 p。编写外部 CSS 文件,将 h1 设为品红色(#c026d3)、居中、32px,将 p 设为深灰色(#333333)、16px、行高 1.8。用 <link> 引入 CSS 文件。
🟡 组合应用
用 Flex 布局实现一个水平导航栏。要求:导航栏包含 logo(左侧)和 4 个链接(右侧均匀分布),链接在鼠标悬停时变色,整个导航栏有底部边框线。提示:用 justify-content: space-between 让 logo 和链接组分居两端。
🔴 开放挑战
实现一个响应式卡片网格。要求:桌面端 3 列、平板 2 列、手机 1 列;每张卡片有圆角边框、内边距、阴影效果;卡片内包含标题、描述文本和一个按钮。提示:综合使用 Flex + flex-wrap + 媒体查询 + box-shadow。
知识回顾
CSS 引入方式选择器优先级盒模型box-sizing文本样式Flex 布局justify-content响应式设计媒体查询移动端优先
下一篇预告
11 JavaScript 基础:变量、DOM 与事件
CSS 让页面变好看了,但它还是静止的——下一篇学习 JavaScript,让网页能响应用户的点击和输入,从静态页面进化为交互式应用。