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 字的「我的自我介绍」:标题分级、重点加粗、含一个上下标、含一个特殊字符(如 &copy;)。

验收:标签层级合理;全部正确闭合;无多余 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 重置计时

S 演讲者视图 · T 切换主题 · ← → 翻页 · F 全屏 · O 总览 · R 重置计时