web development · 40 lessons · 30 + 15 min
网站开发
40 课时课程安排
HTML 结构 · CSS 表现 · JavaScript 行为 —— 从第一行标签到一个能上线的个人网站
按 S 进入演讲者视图 · T 切换主题 · ← → 翻页
网站开发 · 教师版课程 deck6 个模块 · 40 节课 · 6 次阶段实战 · 1 个结课项目
// overview
这是一门什么样的课
面向谁
零基础初学者。会开关电脑、会建文件夹就能上,不要求任何编程经验。
先修要求:无。
多少课时
40 节 × 45 分钟 = 30 小时。
每节固定结构:回顾 5′ + 讲授 25′ + 练习 15′(含 3′ 讲评)。
学完拿到什么
一个可上线访问的响应式个人网站 + 6 个阶段实战作品。
工具:VS Code、Chrome DevTools、GitHub Pages。
// material
三份教材,各用其所长
01W3School · HTML 教程 —— 查得到、抄得动,适合现场演示标签第 1–8 课
02W3School · CSS 教程 —— 属性齐全、示例可在线改,适合讲样式体系第 9–24 课
03廖雪峰 · JavaScript 教程 —— 讲原理、成体系,适合讲变量/作用域/对象/函数第 25–40 课
取舍原则:HTML / CSS 用 W3School(速查型),JavaScript 用廖雪峰(理解型)。
补充资源:MDN 查兼容性 · Can I use 查支持度 · CSS-Tricks 看 Flex / Grid 图解。
// rhythm
每节课的 45 分钟,固定这么用
5′回顾 · 复现上一课的代码不口头回顾,直接打开上次的文件跑一遍,用上一课的成果当引入。
25′讲授 · 老师现场敲代码讲一个点、敲一遍、错一次、调试一次。学生同步跟做,不许只看不写。
15′练习 · 当堂交付每个练习都有明确交付物和验收标准,避免"随便练练"。
3′讲评 · 抽查 2–3 份现场投屏学生的代码,指出共性问题——错误本身就是教学内容。
三条硬规矩:① 每节课都能看到结果 · ② 每节课故意写错一次 · ③ 每节课必须留下可运行的文件
// roadmap
6 个模块 · 40 节课 · 一条主线
M1HTML 基础 —— 结构:标签、语义化、表单、多媒体第 1–8 课
M2CSS 基础 —— 表现:选择器、盒模型、排版与装饰第 9–16 课
M3CSS 布局与响应式 —— 排布:Flex、Grid、媒体查询第 17–24 课
M4JavaScript 基础 —— 编程:类型、流程、数组、对象、函数第 25–32 课
M5JavaScript DOM 与交互 —— 行为:DOM、事件、数据与状态第 33–38 课
M6综合项目与发布 —— 交付:项目实战、调试、上线第 39–40 课
// outcomes
学完这门课,学生能独立做到
看得懂
拿到任意一个网页,能看懂它的结构分层、样式组织方式,能用 DevTools 定位排版问题并修好。
做得出来
能把一份设计稿或一句话需求,拆成「结构 + 样式 + 交互」三层,独立写出响应式页面。
动得起来
能用 JavaScript 操作 DOM、处理事件、管理数据状态,做出待办清单、留言板这类真实交互应用。
发得出去
能用 Git + 静态托管把作品部署上线,拿到一个可以发给别人访问的链接。
// module 01
模块一 · HTML 基础 · 第 1–8 课
01走进网页与 HTML文档骨架
02文本内容标签标题 / 段落 / 格式化
03链接与图片a / img / 路径
04列表与表格ul / ol / table
05表单与输入控件form / input
06语义化与页面结构header / main / footer
07多媒体与嵌入video / iframe / figure
08阶段实战一:个人介绍页第一次独立交付
// 模块一 · 第 01 课
走进网页与 HTML
讲授 · 25 min
- 浏览器请求 → 解析 → 渲染的粗略过程
- 文档骨架:
<!DOCTYPE html> / head / body
- 标签、属性、元素、成对标签与自闭合标签
- 注释写法 · F12 打开 DevTools 看 Elements
练习 · 15 min
新建 index.html,写一个带标题和自我介绍段落的页面,用浏览器打开,再用 DevTools 改页面上的文字(不改文件)。
验收:双击能打开;中文不乱码;能用 DevTools 说明"改的是浏览器内存,不是文件"。
易错点:存成 .txt 后缀 · 编码写成 GBK 导致乱码(统一 UTF-8)
// 模块一 · 第 02 课
文本内容标签
讲授 · 25 min
h1–h6 的层级语义(一页只用一个 h1)
p 与 br 的区别:不拿 br 当排版工具
strong/em 与 b/i 的语义差别
mark / del / ins / sub / sup · 字符实体
练习 · 15 min
做一份约 200 字的「我的自我介绍」:标题分级、重点加粗、含一个上下标、含一个特殊字符(如 ©)。
验收:标签层级合理;全部正确闭合;无多余 br 撑间距。
// 模块一 · 第 03 课
链接与图片
讲授 · 25 min
a:href / target="_blank" / 页内锚点 #id
mailto: 与 tel: 的写法
img:src / alt / 宽高 / 图片格式选择
- 相对路径
./ ../ 与绝对路径的区别
练习 · 15 min
做一个导航页:3 个站外链接 + 2 张图片 + 2 个页内锚点跳转(顶部到某个区块再回来)。
验收:每个链接都能跳对位置;图片路径大小写正确;每张图都有有意义的 alt。
易错点:路径大小写不一致 · alt 写空 · 相对路径层级算错(../ 少一层)
// 模块一 · 第 04 课
列表与表格
讲授 · 25 min
ul / ol / li 与列表嵌套
dl / dt / dd 的使用场景
table / tr / th / td 的结构
caption / thead / tbody · colspan / rowspan
练习 · 15 min
用表格做一张「我的课程表」(含表头、caption、至少一处合并单元格),用列表做一份学习清单,并把清单嵌套进课程表下方。
验收:表头用 th;合并后行列对齐无误;列表层级清晰。
明确告诉学生:用表格做页面布局是历史做法,不要学。表格只用来表达二维数据。
// 模块一 · 第 05 课
表单与输入控件
讲授 · 25 min
form 的 action / method(先理解用途)
input 的 type:text / password / email / number / date / radio / checkbox / file
label 与 for 的关联 · select / textarea / button
placeholder / required / readonly / disabled
练习 · 15 min
做「社团报名表」:姓名、学号、性别单选、兴趣多选、入学日期、附件上传、个人简介文本域、提交按钮。
验收:同名 radio 只能单选;点 label 文字能选中控件;必填项不填点提交会被浏览器拦下。
易错点:radio 不写相同的 name 导致无法单选 · label 的 for 与 id 不匹配
// 模块一 · 第 06 课
语义化与页面结构
讲授 · 25 min
header / nav / main / section / article / aside / footer
- 各自的含义与使用边界(什么时候不该用)
div 与 span 的兜底定位
- 语义化的四个好处:可读性、SEO、屏幕阅读器、团队协作
练习 · 15 min
把前五课的碎片页面整合成一个完整页面:顶部导航、主内容区(含两篇文章)、侧边栏、页脚。
验收:main 只有一个;每个 section 都有标题;导航链接都在 nav 里;div 数量不超过必要数量。
// 模块一 · 第 07 课
多媒体与嵌入
讲授 · 25 min
audio / video:controls / autoplay / muted / loop / poster
source 提供多格式回退
iframe 的用途与安全注意(默认不信任外部页面)
figure / figcaption · 图片格式选择与压缩常识
练习 · 15 min
在页面中嵌入一段视频、一张带图注的图片、一个 iframe(地图或在线视频)。
验收:autoplay 必须配 muted;iframe 有宽高;图注与图片用 figure 包在一起。
// 模块一 · 第 08 课 · 阶段实战
阶段实战一 · 个人介绍页
课堂流程 · 45 min
- 3′ 需求拆解:这个页面要有哪些区块
- 5′ 画结构草图(纸上画框,标注标签)
- 25′ 编码实现,老师巡场个别辅导
- 10′ 两人一组互评 + 2′ 共性总结
验收标准
- 语义骨架完整,至少 5 个区块
- 标签全部正确闭合,缩进统一
- 图片都有有意义的 alt
- 去掉所有内容只看结构,依然读得通
这节课的交付物会一直用到第 16 课、第 23 课——它是整门课的贯穿项目,不要删。
// module 02
模块二 · CSS 基础 · 第 9–16 课
09CSS 入门语法 / 三种引入
10选择器基础类 / ID / 命名规范
11选择器进阶与层叠伪类 / 优先级
12颜色、单位与字体CSS 变量
13文本排版行高 / 溢出省略
14盒模型border-box / margin
15背景与装饰圆角 / 阴影 / 渐变
16阶段实战二:美化个人页从能用 → 好看
// 模块二 · 第 09 课
CSS 入门
讲授 · 25 min
- CSS 的作用:把"结构"和"表现"彻底分开
- 语法:
选择器 { 属性: 值; } · 注释写法
- 三种引入方式:行内 / 内部 / 外部,为什么推荐外部
- 用 DevTools 的 Styles 面板实时改样式
练习 · 15 min
给第 8 课的个人页挂上外部样式表 style.css,完成前 5 条样式:背景色、字体、字号、行高、内容区最大宽度并居中。
验收:页面无内联样式;样式表路径正确;改一行 CSS 刷新后页面有变化。
// 模块二 · 第 10 课
选择器基础
讲授 · 25 min
- 基本选择器:元素 / 类 / ID / 通配
- 复合选择器:交集
p.hl(连写)· 并集 h1, h2(逗号·也叫分组)· 后代 nav a(空格)· 子代 nav > a
- class 可复用,id 全页唯一 —— 样式优先用 class
- 命名规范:小写 + 短横线 · BEM 初识(block__element--modifier)
- 给同一元素加多个类的写法与顺序
练习 · 15 min
为第 8 课页面里的导航、卡片、按钮添加类名并写样式,要求类名可读、能看懂它管什么。
验收:不使用 id 写样式;类名用英文小写 + 短横线;同一元素上复用类(如 btn btn-primary)。
// 模块二 · 第 11 课
选择器进阶与层叠
讲授 · 25 min
- 伪类:
:hover :focus :active :first-child :nth-child(even)
- 伪元素:
::before ::after 与 content
- 优先级权重:内联 1000 / id 100 / class 10 / 元素 1,同权重后来居上
- 继承与层叠 ·
!important 为什么是危险动作
练习 · 15 min
① 5 道优先级判断题(给代码问最终颜色);② 给按钮加 hover 效果和 ::before 小图标装饰。
验收:能口述算出权重;伪元素有 content;不使用 !important。
这节课的目标是一句话:让学生能自己回答「为什么我的样式没生效」。
// 模块二 · 第 12 课
颜色、单位与字体
讲授 · 25 min
- 颜色写法:hex / rgb / rgba(透明度)/ hsl
- 单位:px / em / rem / % / vw / vh 的区别与选型
- 字体栈与中文字体回退顺序 · Web 字体引入思路
- CSS 变量:
--color-primary 与 var()
练习 · 15 min
为页面定义 8 个 CSS 变量(主色、文字三档、背景、边框等)与一套字号阶梯(14 / 16 / 18 / 24 / 32 / 48),并在页面中全部引用变量。
验收:样式表里不出现硬编码颜色;改一个变量,全站生效。
// 模块二 · 第 13 课
文本排版
讲授 · 25 min
text-align / decoration / transform / indent
line-height 与可读性(正文 1.5–1.8)· letter-spacing / word-spacing
white-space 与换行控制
- 溢出省略:单行三件套 与 多行
-webkit-line-clamp
练习 · 15 min
完成一段图文排版:正文字号 16px、行高 1.7;做一处单行溢出省略(长标题)与一处两行溢出省略(简介)。
验收:省略号成功出现;调整窗口宽度时截断位置正确。
单行省略三件套:overflow: hidden + white-space: nowrap + text-overflow: ellipsis,少一个都不生效。
// 模块二 · 第 14 课
盒模型
讲授 · 25 min
- 四层结构:content / padding / border / margin
box-sizing: border-box 为什么是行业默认选择
- margin 简写顺序(上右下左)与
margin: 0 auto 居中
- 相邻 margin 合并(塌陷)现象 · 元素实际宽度公式
练习 · 15 min
用盒模型复原一个按钮和一个卡片;分别用 content-box 与 border-box 各做一次,写下两次的实际尺寸差异。
验收:能算出 width:100px + padding:20px 在两种模式下的真实宽度。
经典坑:宽度写 100% 再加 padding 导致横向溢出 —— 根因就是没设 border-box。
// 模块二 · 第 15 课
背景与装饰
讲授 · 25 min
background:color / image / repeat / position / size / 多重背景
border-radius 圆角与胶囊按钮
box-shadow 多层阴影营造层次 · text-shadow
linear-gradient / radial-gradient · background-clip: text
练习 · 15 min
做 3 个不同风格的卡片(例如:极简白、渐变霓虹、深色悬浮),用圆角、阴影、渐变各组合一次。
验收:阴影有三层以上参数(偏移 + 模糊 + 透明色);渐变方向正确;卡片视觉上"有层次"。
// 模块二 · 第 16 课 · 阶段实战
阶段实战二 · 美化个人页
课堂流程 · 45 min
- 8′ 讲排版系统:字号阶梯与间距节奏(4 / 8 / 16 / 24 / 32 / 48)
- 8′ 讲颜色系统:1 个主色 + 5 档中性色
- 25′ 改造第 8 课的个人页(结构不动,只改样式)
- 4′ 投屏展示与点评
验收标准
- 使用 CSS 变量,样式表无硬编码颜色
- 字号不超过 6 级,间距成体系
- 至少有 1 个卡片组件和 1 个按钮组件
- 全页无内联样式;HTML 结构基本未改动
// module 03
模块三 · CSS 布局与响应式 · 第 17–24 课
17display 与文档流块级 / 行内
18定位position / z-index
19浮动与清除历史与边界
20Flex 布局(一)容器属性
21Flex 布局(二)项目属性与配方
22Grid 布局二维与卡片网格
23响应式与媒体查询移动优先
24阶段实战三:响应式落地页三端验收
// 模块三 · 第 17 课
display 与文档流
讲授 · 25 min
- 标准文档流:自上而下、自左而右
block 独占一行、可设宽高
inline 不换行、宽高由内容决定、垂直 margin 无效
inline-block 兼具两者 · none 与 visibility: hidden 的区别
练习 · 15 min
把导航项分别设成三种 display 观察排版差异;用 inline-block 把导航项排成一行并留出间距。
验收:能说出为什么给 span 设宽高不生效;能说清 none 与 hidden 的区别。
一句话记住:block 管区块,inline 管文字,inline-block 管一行里的小方块。
// 模块三 · 第 18 课
定位
讲授 · 25 min
position 五个值:static / relative / absolute / fixed / sticky
- 偏移属性 top / right / bottom / left
- absolute 找最近的「定位祖先」(包含块)
z-index 与层叠顺序 · 父级层叠上下文
练习 · 15 min
实现三个效果:固定顶部导航(fixed)、卡片右上角角标(absolute + 父级 relative)、「回到顶部」悬浮按钮(fixed)。
验收:absolute 元素落在父卡片内部而不是页面角落;滚动页面时导航不动。
口诀:子绝父相 —— 想让一个元素绝对定位到某个位置,先给它的父元素加 position: relative。
// 模块三 · 第 19 课
浮动与清除
讲授 · 25 min
float 的原始用途:图文环绕
- 浮动导致父元素高度塌陷
- 清除浮动三方案:
clear / overflow: hidden / ::after clearfix
- 用浮动做双栏的历史做法及其局限
练习 · 15 min
用浮动实现双栏布局 → 用 clearfix 修复高度塌陷 → 再用 Flex 重写一遍,写下两者的差异感受。
验收:能复现并解释"塌陷"现象;能说出为什么现在推荐 Flex。
给学生明确结论:浮动是历史,知道它、会修它,但新代码用 Flex / Grid。
// 模块三 · 第 20 课
Flex 布局(一)· 容器属性
讲授 · 25 min
display: flex 开启弹性布局,主轴与交叉轴的概念
flex-direction:row / column
justify-content(主轴对齐 6 种)· align-items(交叉轴对齐)
flex-wrap 换行与 align-content · gap 间距
练习 · 15 min
完成三个小 demo:① 横向导航栏(两端对齐、垂直居中)② 卡片水平垂直居中(写三种不同写法)③ 自动换行的标签组。
验收:能说清"哪个方向是主轴";改 direction 后知道 justify / align 的作用轴会互换。
// 模块三 · 第 21 课
Flex 布局(二)· 项目属性与配方
讲授 · 25 min
flex-grow / flex-shrink / flex-basis 与 flex: 1 1 auto 简写
align-self 单独对齐 · order 排序
- 配方一:侧边栏固定 + 内容自适应
- 配方二:卡片等高 · 配方三:页脚吸底
练习 · 15 min
用 Flex 完成三栏布局:左栏固定 240px + 主内容自适应 + 右栏 300px;窗口变窄时纵向堆叠。
验收:主内容能随窗口伸缩;文本过长时能正常省略(min-width: 0)。
// 模块三 · 第 22 课
Grid 布局
讲授 · 25 min
display: grid · 网格线与行列定义
grid-template-columns / rows · fr 单位 · gap
repeat + auto-fit + minmax 实现自动列数
grid-template-areas 与 grid-area 命名区域
练习 · 15 min
① 用 repeat(auto-fit, minmax(240px, 1fr)) 做响应式卡片网格(不用媒体查询)② 用命名区域做一个「杂志式」大小格混排版面。
验收:改变窗口宽度时卡片列数自动变化;区域命名与内容对应正确。
选型原则:一维排布用 Flex,二维排布用 Grid。两者不是替代关系,是配合关系。
// 模块三 · 第 23 课
响应式与媒体查询
讲授 · 25 min
viewport meta 为什么必须写
- 媒体查询语法与断点:640 / 768 / 1024 / 1280
- 移动优先:
min-width 递进书写
- 流式布局(%、max-width、
clamp())· 图片自适应
练习 · 15 min
让第 16 课的个人页在 375 / 768 / 1440 三个宽度下都正常显示:内容不溢出、字号可读、卡片合理换行。
验收:三端各截一张图;手机端没有横向滚动条。
先写移动端样式,再用 min-width 逐级增强 —— 这就是移动优先。
// 模块三 · 第 24 课 · 阶段实战
阶段实战三 · 响应式落地页
课堂流程 · 45 min
- 5′ 结构规划:导航 / 首屏 / 功能卡片 / 页脚
- 5′ 导航折叠方案:纯 CSS 的 checkbox 方案(JS 方案预告)
- 25′ 编码实现
- 8′ 三端自测 + 2′ 讲评
验收标准
- 桌面端导航横排,移动端可折叠
- 卡片网格随宽度自动换行(Grid 或 Flex)
- 无横向滚动条,无元素遮挡与溢出
- 375 / 768 / 1440 三个宽度下都可用
这一版落地页是后续 JS 模块的操作对象——第 33 课起,我们给它加交互。
// module 04
模块四 · JavaScript 基础 · 第 25–32 课
25JavaScript 入门引入方式 / console
26变量与数据类型let / const / typeof
27运算符与流程控制if / switch / 真值
28循环与数组for / 数组方法
29函数参数 / 作用域 / 闭包
30对象与 JSON对象数组 / JSON
31内置对象与常用 APIString / Math / Date
32阶段实战四:班级成绩管理器控制台小工具
// 模块四 · 第 25 课
JavaScript 入门
讲授 · 25 min
- 三件套分工:HTML 结构 · CSS 表现 · JS 行为
- JS 在浏览器里能做什么(改 DOM / 发请求 / 存数据)
- 三种引入方式与
defer · 注释写法
console.log 调试法 · 如何读报错信息
练习 · 15 min
新建 main.js,用 console 输出 10 行信息(其中至少 4 行是变量计算的结果),并在 DevTools 中查看、清空。
验收:脚本被正确引入;Console 无报错;能说出报错信息里的行号指的是哪一行。
// 模块四 · 第 26 课
变量与数据类型
讲授 · 25 min
let / const / var 的区别(块级作用域、重复声明)
- 基本类型:number / string / boolean / null / undefined / object(+ symbol)
typeof 与显式、隐式类型转换
- 模板字符串
`${}` · 命名规范(小驼峰)
练习 · 15 min
写 10 行代码声明各类变量并打印类型;故意做一次字符串加数字的运算,写下并解释结果。
验收:能解释 '1' + 1 = '11';知道什么时候该用 const;变量名可读。
默认用 const,需要重新赋值时再用 let,不要用 var。
// 模块四 · 第 27 课
运算符与流程控制
讲授 · 25 min
- 算术 / 赋值 / 自增自减运算符
- 比较运算符:
== 与 === 的区别(强推 ===)
- 逻辑运算符与短路求值(
&& || 的取值技巧)· 三元运算符
if / else if / else · switch 与穿透 · 真假值
练习 · 15 min
完成两个小程序:① 成绩等级判断(90+ 优 / 80+ 良 / 60+ 及格 / 否则不及格)② 登录权限判断(用三元运算符和 if 各写一次)。
验收:使用 === 而不是 ==;能说出哪些值会被判为假。
// 模块四 · 第 28 课
循环与数组
讲授 · 25 min
for 三段式与执行顺序 · while / do-while · for...of
break / continue
- 数组:定义、下标(从 0 开始)、length 与越界
- 常用方法:
push / pop / shift / unshift / slice / splice / indexOf / includes / join
练习 · 15 min
① 用嵌套循环打印九九乘法表;② 实现数组的增、删、改、查四个操作,每做一步都打印当前数组。
验收:能说出 slice 与 splice 的区别(是否改原数组);不会写出越界循环。
// 模块四 · 第 29 课
函数
讲授 · 25 min
- 函数声明 / 函数表达式 / 箭头函数
- 参数与返回值(没有 return 就返回 undefined)
- 默认参数 · 剩余参数
...rest
- 作用域与局部 / 全局变量 · 闭包初识 · 回调函数
练习 · 15 min
把第 28 课的数组操作封装成 4 个函数;再写一个带回调的 forEachLike(arr, fn) 函数并验证效果。
验收:每个函数职责单一、命名清晰;理解"封装是为了不用复制粘贴"。
这节课的核心价值:让学生学会「把重复的代码打包成一个名字」。
// 模块四 · 第 30 课
对象与 JSON
讲授 · 25 min
- 对象字面量与键值对 · 点访问与方括号访问
- 对象里的方法 ·
this 指向初识
- 遍历:
for...in / Object.keys / entries · 对象数组
- JSON 语法 ·
JSON.stringify / JSON.parse · 浅拷贝与深拷贝
练习 · 15 min
用对象描述 3 个学生(姓名、成绩数组),输出平均分、最高分,并按总分从高到低排序打印。
验收:能说清点访问和方括号访问各自的适用场景;知道 JSON 的键必须用双引号。
// 模块四 · 第 31 课
内置对象与常用 API
讲授 · 25 min
- String:
trim / slice / split / replace / includes / padStart
- Math:
round / floor / ceil / random 与随机整数区间公式
- Date 与时间戳 ·
toLocaleString 格式化
- Number(
toFixed / parseInt)· 数组高阶方法初识(map / filter / reduce / sort)· try/catch
练习 · 15 min
写三个小工具:① 把日期格式化成 YYYY-MM-DD;② 随机点名(从数组里随机取一个);③ 按条件过滤数组(如分数大于 80 的)。
验收:随机点名能取到区间两端;能用比较函数把 [10, 2, 1] 正确排序。
// 模块四 · 第 32 课 · 阶段实战
阶段实战四 · 班级成绩管理器
课堂流程 · 45 min
- 5′ 需求与数据结构设计(学生对象数组)
- 30′ 编码:录入 / 统计平均最高最低 / 按分数排序 / 按姓名查询
- 8′ 边界测试:空数组、非数字输入、重名
- 2′ 讲评与代码走查
验收标准
- 四个功能全部实现,控制台输出清晰
- 函数职责单一、命名可读(如
getAverage)
- 非数字输入有处理,不出现 NaN
- 至少使用一次 map / filter / reduce
注意:这节课故意不做界面。下一模块我们会把这份「数据层」搬到页面上。
// module 05
模块五 · JavaScript DOM 与交互 · 第 33–38 课
33DOM 入门找到元素 / 改内容
34事件处理监听 / 冒泡 / 委托
35样式与类操作classList / 暗黑模式
36动态创建与表单交互渲染列表 / 校验
37数据与状态localStorage / 重渲染
38阶段实战五:待办清单一个像真产品的应用
// 模块五 · 第 33 课
DOM 入门
讲授 · 25 min
- DOM 树与节点关系(父 / 子 / 兄弟)
document.querySelector / querySelectorAll
- 读写内容:
textContent / innerText / innerHTML 的区别与风险
- 读写属性:
getAttribute / setAttribute / dataset
练习 · 15 min
用 JS 读取并修改页面上 5 个元素:改标题文字、改图片 src、改链接 href、给卡片加一个 data 属性、批量把所有列表项加上序号前缀。
验收:能用 querySelector 选中带类名和带 id 的元素;知道 querySelectorAll 返回的不是数组。
// 模块五 · 第 34 课
事件处理
讲授 · 25 min
addEventListener(类型, 回调)
- 常见事件:click / input / change / submit / mouseenter / keydown
- 事件对象:
event.target / value / key · preventDefault()
- 事件冒泡与事件委托(在父元素上监听)
练习 · 15 min
① 输入框实时字数统计;② 表单提交时阻止默认跳转并校验必填项、给错误提示;③ 用事件委托给一个列表的所有项(含后来新增的项)绑定点击。
验收:能解释为什么循环绑定事件不如委托一次;提交后页面不刷新。
// 模块五 · 第 35 课
样式与类操作
讲授 · 25 min
element.style.xxx 与 CSS 属性名的驼峰转换
classList.add / remove / toggle / contains(推荐用法)
dataset 读写 data-* · JS 设置 CSS 变量(setProperty)
getComputedStyle 读取最终样式 · 配合 transition 做过渡
练习 · 15 min
① 实现「暗黑模式切换」按钮:切换 <body> 上的类名 + 用 CSS 变量换色;② 做一组标签,点击切换选中态(只允许一个选中)。
验收:样式写在 CSS 里,JS 只负责切类名;切换主题后刷新页面样式仍正确。
核心原则:JS 只负责「切类名」,样式规则留在 CSS 里。
// 模块五 · 第 36 课
动态创建与表单交互
讲授 · 25 min
createElement / append / insertBefore / remove
- 用模板字符串批量渲染列表(与 createElement 的取舍)
- 表单校验:必填、长度、正则初识 ·
trim() 去空格
- 错误提示的呈现方式 · 简单防抖思路
练习 · 15 min
实现「动态留言板」:输入 → 添加 → 删除;空输入拒绝提交,超过 100 字提示,新留言出现在列表最前面。
验收:新元素确实插入了 DOM(不是只创建了对象);重复提交不会重复绑事件。
// 模块五 · 第 37 课
数据与状态
讲授 · 25 min
localStorage.setItem / getItem / removeItem 与 JSON 配合
- 数据与视图分离:改数据 → 重新渲染 → 更新 DOM
- 数组筛选与搜索(
filter + includes)
- 渲染函数拆分(renderList / renderCount)· 简单模块化
练习 · 15 min
给第 36 课的留言板加两个能力:① 刷新页面数据还在(localStorage);② 顶部搜索框能按关键词筛选留言。
验收:存的是字符串不是对象;刷新后列表与计数一致;搜索时删除功能仍正常。
// 模块五 · 第 38 课 · 阶段实战
阶段实战五 · 待办清单
功能拆解 · 45 min
- 新增 / 删除 / 编辑任务文字
- 勾选完成 / 全部-未完成-已完成 三种筛选
- 剩余未完成数量计数
- localStorage 持久化 · 刷新不丢数据
验收标准
- 七个功能全部可用,无 console 报错
- 刷新后数据与勾选状态保留
- 使用事件委托处理列表交互
- 渲染逻辑集中在一个 render 函数里
这个应用可以作为结课作品的「作品展示」区块——它足够小,也足够完整。
// module 06
模块六 · 综合项目与发布 · 第 39–40 课
第 39 课 · 项目实战(一)
选题与功能清单(MVP 三条)→ 页面结构与样式搭建 → 数据层设计(数组 + 对象 + localStorage)。
交付:项目静态页面 + 数据层脚本。
第 40 课 · 项目实战(二)与上线
交互收尾 → 调试与代码整理 → 部署上线 → 3 分钟演示与自评 → 课程回顾与进阶路线。
交付:线上可访问链接 + README。
选题建议:个人简历网站 · 读书观影清单 · 校园活动报名 · 学习打卡应用 —— 任选其一,越具体越好。
// 模块六 · 第 39 课
综合项目实战(一)
课堂流程 · 45 min
- 5′ 选题 + 功能清单:只写 3 条 MVP 功能
- 10′ 页面结构草图 + 样式方向(配色与字号系统)
- 25′ 搭结构、写样式
- 5′ 数据层设计:数组 + 对象 + 存储方案
验收标准
- 页面结构与项目主题匹配,至少 4 个区块
- 复用自己的颜色变量与字号阶梯
- 响应式:手机与桌面都可用
- 数据层函数独立,可单独测试
提醒学生:先把三条核心功能做完,再去想「加分项」——做不完的项目等于零。
// 模块六 · 第 40 课
综合项目实战(二)与上线
课堂流程 · 45 min
- 5′ 交互实现收尾(渲染函数 + 事件委托)
- 8′ 调试与代码整理:去全局变量、加注释、统一命名
- 7′ 部署上线:GitHub 仓库 → 开启 Pages → 拿到链接
- 15′ 每人 3 分钟演示 + 自评 + 互评
结课验收
- 线上链接可访问,手机端能用
- Console 无报错
- README 写清项目说明与所用技术
- 演示时能讲清一个技术决策的原因
进阶路线:ES6+ 深入 → 模块化与打包 → fetch 与后端接口 → Vue / React → 工程化与 CI
// closing
40 节课的一句话总结
主线
结构(HTML)→ 表现(CSS)→ 排布(Flex / Grid)→ 编程(JS)→ 交互(DOM)→ 交付(上线)。
一个贯穿项目:从第 1 课做到第 40 课,学生看得见自己的成长。
三个抓手
① 每节课都能看到结果 ② 每节课故意写错一次 ③ 每个练习都有可验收的交付物。
把「错误」变成教学内容,把「调试」变成核心能力。
按 O 打开总览 · T 切换主题 · S 回到演讲者视图 · R 重置计时