简介:这份《HTML.CSS.JavaScript标准教程(实例版·第2版)》素材包面向Web前端入门学习者与需要巩固基础的开发者,围绕HTML、CSS、JavaScript三条主线,讲解页面结构、样式布局、交互逻辑,并覆盖HTML5音视频与离线存储、CSS响应式布局、DOM操作及ES6常用特性等进阶点。压缩包共528个文件,约35.9MB,以286个html演示页面为主,搭配115个jpg、67个gif图文素材、23个ppt、5个css及少量db、docx、psd等辅助文件,便于按章节对照实例源码和效果图边看边练。已有275人学习下载,适合通过具体代码示例快速建立前端知识框架。书中内容涉及表格、表单与语义化标签,选择器、盒模型、浮动、定位、Flexbox、Grid等布局方式,以及JavaScript函数、对象、数组与闭包。读者可从完整示例页面、样式表、课件与素材中获得可直接运行的练习环境,既能跟着动手,也能参考其中结构完成自己的页面改造与功能扩展。
1. 实例版标准教程:HTML、CSS、JavaScript 到底该怎么学才不白费
HTML、CSS、JavaScript 三件套是前端的地基,几乎所有从业者都觉得自己会,可真动手写的时候却总在同样几个地方卡住:标签选错、样式不生效、脚本一报错就不知道从哪查起。这本实例版标准教程把所有知识点拆成能直接运行的页面示例,对新手来说是最低成本的入门路径,对写过几年代码的人则是查漏补缺的参考手册。它解决的核心问题,是把零散的知识串成一条能动手的链路——从写页面骨架,到用样式控制布局,再到用脚本操作页面内容。适合刚入门想系统打基础的人,也适合写过一些页面但没整理过规范的前端开发者。读这套教程只有一个要求:每个例子都亲手敲一遍,不要复制粘贴。
2. 搭好练习环境:用最小示例把三件套串成完整链路
2.1 准备编辑器与现代浏览器
练前端不需要重型工具。我一般会挑一款轻量代码编辑器,装好中文界面和代码高亮,能直接打开整个项目文件夹就够了,不要在插件数量上纠结。真正重要的动作是熟悉浏览器的开发者工具:在页面上右键选择「检查」,打开调试面板。这是后面所有排错的主战场,也是这套教程里反复会用到的入口。
调试工具里最常用的四个面板值得提前认识:元素面板看 HTML 结构和实际生效的样式,控制台看脚本报错,网络面板看资源请求是否成功,源代码面板用来给脚本打断点。实例练习中 90% 的问题都能在这四个面板里找到线索。准备阶段到此为止,不需要数据库,不需要构建工具,三件套练习的起点就是纯静态文件。
2.2 最小三件套示例:一个文件看清三层关系
先创建一个最简单的页面,把三种技术放在同一个文件里,感受它们的协作方式:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>最小三件套示例</title> <style> /* CSS:负责外观,类选择器控制样式 */ .highlight { color: #c7254e; font-weight: bold; } </style> </head> <body> <!-- HTML:负责结构,id 供脚本查找元素 --> <p id="app" class="highlight">这里是原始文字</p> <!-- JavaScript:负责行为,必须放在目标元素之后 --> <script> const app = document.getElementById('app'); app.textContent = 'HTML、CSS、JavaScript 跑通了'; console.log('app 内容已更新:', app.textContent); </script> </body> </html>这个文件虽小,但把三件套的职责边界画得很清楚:head 里的 style 管外观,body 底部的 script 管行为,中间是纯 HTML 结构。注意脚本放在了 body 尾部,因为浏览器按顺序解析页面,脚本执行时它要操作的元素必须已经存在于 DOM 里;如果放在 head 中,getElementById('app')会拿到 null,直接报错。这是新手最常踩的坑,后面避坑章节会再展开。
打开浏览器预览,按快捷键打开开发者工具,你应该能在控制台看到「app 内容已更新」这行日志,页面上那段文字也被脚本替换掉了。到这里,三件套的最小链路就通了。
2.3 用本地服务预览:两条命令与目录规范
双击 index.html 也能看到效果,但我建议从一开始就使用本地静态服务。原因是后面学到 fetch 请求时,直接打开本地文件会被浏览器拦截请求,报跨域错误;用服务方式打开则没有这个问题,而且网络面板能真实展示每个资源的加载状态。
常见做法是在项目根目录起一个轻量静态服务:
# 在项目根目录执行,把当前目录发布成一个网站 python -m http.server 8080 # 出现 Serving HTTP on 0.0.0.0 port 8080 后, # 浏览器访问 http://localhost:8080 即可预览8080 是端口号,可以换成任意未被占用的端口;想停掉服务就按 Ctrl + C。改动代码后不需要重启服务,直接刷新浏览器即可。如果你没有 Python 环境,换成任何能起静态服务的工具都行,原理一致。
目录规范也建议从第一天就建立起来:
my-project/ ├── index.html ├── css/ │ └── style.css ├── js/ │ └── main.js └── images/ └── logo.png按 css、js、images 分目录,后续引用路径就统一写成相对于 index.html 的./css/style.css。不要把所有文件堆在同一个文件夹里,目录习惯养好了,换到任何项目都不会乱。
3. HTML 结构与 CSS 布局:先写对骨架,再调样式
很多实例练习卡住,不是因为代码难,而是结构没写对就开始调样式。这一章把两件事拆开:先用语义化标签把页面骨架立住,再谈盒模型、选择器优先级和 Flexbox 布局。顺序不能反——结构对了,样式问题至少少一半。
3.1 页面骨架与语义化标签怎么选
语义化不是给浏览器看的花架子,它让页面在没有样式时依然结构可读,也让 CSS 和 JavaScript 有明确的定位锚点。判断标准很简单:这块内容本质是什么,就用对应的标签,而不是一律用 div 糊上去。常用标签的用途如下表。
| 标签 | 典型用途 | 使用提示 |
|---|---|---|
| header | 页面或区块的头部 | 一个页面可以有多个,不只在页面顶部 |
| nav | 导航链接集合 | 主导航放这里;页脚的少量链接不一定要用 nav |
| main | 当前页面的主体内容 | 一个页面一般只有一个 main |
| article | 可独立复用内容块 | 一篇帖子、一条评论都属于这类 |
| section | 主题相关的区块 | 通常内部带一个 h1-h6 标题 |
| aside | 侧边栏或与主体弱相关的内容 | 广告、相关推荐常用 |
| footer | 页面或区块底部 | 版权、联系方式 |
一个标准的页面骨架可以写成这样:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>语义化骨架</title> </head> <body> <header> <h1>站点名称</h1> <nav> <ul> <li><a href="./index.html">首页</a></li> <li><a href="./about.html">关于</a></li> </ul> </nav> </header> <main> <article> <h2>文章标题</h2> <p>正文内容……</p> </article> <aside> <p>相关推荐</p> </aside> </main> <footer> <p>版权信息</p> </footer> </body> </html>请注意 head 里的 viewport meta 标签,它告诉移动端浏览器按真实设备宽度渲染页面,做响应式布局时没有这行声明会到处出问题。标题层级 h1 到 h6 也要按层递进,不要从 h1 直接跳到 h4,屏幕阅读器和搜索引擎对标题层级很敏感。
3.2 盒模型与选择器优先级:样式不生效的根源
样式不生效,十次里有八次是盒模型和优先级问题。盒模型决定元素尺寸怎么算,优先级决定两条冲突的规则谁赢。新手经常一脸懵的情况是:明明在样式表里写了width: 200px,实际量出来却是 230px,因为默认的 content-box 盒模型只把 width 算给内容区,padding 和 border 都往外加。
常见的做法是统一改成 border-box:
/* 把默认外边距清掉,把盒模型统一为 border-box */ * { box-sizing: border-box; margin: 0; padding: 0; }box-sizing: border-box表示 width 属性包含 padding 和 border,布局时直观得多。推荐在练习阶段就把这条全局重置放到样式表的开头,这是目前最主流的写法,可以省掉大量调尺寸的时间。
选择器优先级也是一个高频坑点。优先级可粗略记成一组权重:
| 选择器 | 权重 | 例子 |
|---|---|---|
| 标签选择器 | 1 | p { } |
| 类选择器 | 10 | .highlight { } |
| id 选择器 | 100 | #app { } |
| 内联样式 | 1000 | style="color: red" |
权重会累加,比如.nav .item是 10 + 10 = 20,nav li是 1 + 1 = 2,前者赢。而!important是最后手段,它会压过普通规则,但用多了整个样式表就变成没人敢动的雷区,能不用就不用。我个人的经验是:写样式尽量用类选择器,不要用 id 选择器,更不要用内联样式,后面想覆盖时会非常被动。
提示:遇到样式不生效,先打开开发者工具的元素面板,里面能看到每条规则的实际状态和被覆盖的原因,比自己盯着代码猜快得多。
3.3 Flexbox 与响应式:常用布局参数和断点
布局在现代浏览器里就两个主流方案:Flexbox 管一维排列,Grid 管二维网格。实例练习里遇到的导航、卡片、居中需求,Flexbox 基本都能解决,优先级最高。
一个典型导航布局是这样写的:
<style> .nav { display: flex; /* 容器变成弹性盒子 */ justify-content: space-between; /* 主轴两端对齐,中间留白 */ align-items: center; /* 交叉轴垂直居中 */ gap: 16px; /* 项目间距,替代 margin 的现代写法 */ } .nav .list { display: flex; gap: 12px; list-style: none; } </style> <header class="nav"> <span class="logo">我的站点</span> <ul class="list"> <li><a href="#">首页</a></li> <li><a href="#">文章</a></li> <li><a href="#">关于</a></li> </ul> </header>Flexbox 最关键的参数其实就五个,建议每个都动手改一遍看效果:
| 属性 | 作用 | 常用值 |
|---|---|---|
| justify-content | 主轴对齐方式 | flex-start / center / space-between / space-around |
| align-items | 交叉轴对齐方式 | stretch / center / flex-start / flex-end |
| flex-direction | 主轴方向 | row / column |
| flex-wrap | 是否换行 | nowrap / wrap |
| flex | 项目的伸缩简写 | flex: 1 表示等分剩余空间 |
响应式布局的起步做法,是给容器用flex-wrap: wrap配合flex弹性值,再在断点处调整:
.card-list { display: flex; flex-wrap: wrap; gap: 16px; } .card { flex: 1 1 200px; /* 每个卡片最小 200px,空间足够就放大 */ } /* 屏幕宽度超过 768px 时,改成固定三列 */ @media (min-width: 768px) { .card { flex: 0 0 calc((100% - 32px) / 3); /* 减去两段 gap 再除 3 */ } }flex: 1 1 200px三个值分别是 grow(放大比例)、shrink(缩小比例)、basis(基准尺寸),flex: 1单独用表示等分剩余空间。断点选 768px 只是常见起点,应该按内容实际换行情况来调,不要背死值。测试响应式不需要真机,用开发者工具里的设备模拟器拖拽窗口宽度就能看到效果。
4. JavaScript 与 DOM:事件、渲染与请求的落地写法
HTML 和 CSS 把页面画出来,JavaScript 负责让它响应操作。翻遍实例版教程里的脚本例子,本质上就是三类活儿:绑定事件、渲染数据、请求数据。把这三类写法练成肌肉记忆,后面学任何框架都会顺手很多。
4.1 事件绑定:从内联属性到事件委托
事件绑定有三种常见写法:内联 onclick 属性、元素.onclick属性、addEventListener。前两种在示例代码里很常见,但各有局限——内联和.onclick只能挂一个处理函数,后挂的会覆盖前者;addEventListener可以挂多个监听器,是实际项目里的标准做法。
<button id="saveBtn">保存</button> <ul id="todoList"> <li>const topics = [ { id: 1, name: 'HTML 语义化', done: true }, { id: 2, name: 'CSS 盒模型', done: false }, { id: 3, name: 'JavaScript 事件', done: false }, ]; // 方式一:模板字符串 + map + join,适合静态数据 const listEl = document.getElementById('topicList'); listEl.innerHTML = topics .map(function (topic) { const status = topic.done ? '已完成' : '未完成'; return '<li>async function loadTopicList() { const listEl = document.getElementById('topicList'); // 请求前先给用户反馈,避免白屏 listEl.textContent = '加载中...'; try { const response = await fetch('./data/topics.json'); // 路径相对当前页面 if (!response.ok) { throw new Error('请求失败,状态码:' + response.status); } const data = await response.json(); // 解析 JSON,失败也进 catch renderList(data); // 复用 4.2 里的渲染函数 } catch (error) { // 网络错误、HTTP 错误、JSON 解析错误都收在这里 console.error('加载失败:', error); listEl.textContent = '加载失败,请刷新重试'; } } loadTopicList();async/await让异步代码读起来像同步写法,但必须配try/catch兜底。请求前给列表区域一个「加载中」提示,是最便宜也最有效的用户体验优化;请求失败时把错误打到控制台,同时给用户一个明确的失败提示,不要留一片空白。需要提醒的是,fetch 的路径是相对当前页面 URL 来解析的,如果页面在pages/目录里,路径要写成../data/topics.json,这点和前面图片路径的坑是一致的。
5. 实例练习避坑清单:五个高频翻车点与排查路径
这一章把这套教程最常见的五个高频坑按「现象 → 原因 → 解决」整理出来。前四项在调试工具里都能直接定位,最后一项是纯编码问题,养成习惯即可。下表先给一个总览,后面逐条展开。
| 翻车点 | 首选排查面板 | 核心判断 |
|---|---|---|
| 样式不生效 | 元素面板 / 网络面板 | 看计算后样式与 css 是否 200 |
| 脚本报错功能失效 | 控制台 | 看报错行号与文件名 |
| 图片与资源 404 | 网络面板 | 看请求的完整地址 |
| 交互无反应 | 元素面板 / 控制台 | 看事件是否绑定成功 |
| 中文乱码 | 页面源码 | 看 meta charset 与文件编码 |
5.1 样式明明写了却不生效
现象:CSS 文件引用了,class 名也对,页面样式纹丝不动,开发者工具里那条规则甚至显示被划掉。原因:通常是两类,一是选择器优先级被其他规则压住,常见于用 id 选择器写样式后被类名规则覆盖的误解场景;二是类名拼错或者 CSS 文件路径 404。解决:先看元素面板,找到该元素的计算后样式,能看到最终生效值和来自哪条规则;再看网络面板确认 CSS 请求状态码是 200。养成一个习惯:同一页面避免用 id 选择器写样式,id 优先级太高,后续覆盖只能靠!important,而它一旦用多,样式表就变成没人敢动的雷区。样式不生效经常被当成玄学,其实九成是优先级和路径两个原因。
5.2 脚本报错导致整个页面功能失效
现象:页面能显示,但按钮点了没反应,控制台有一行红色报错。原因:JavaScript 按顺序执行,某个脚本在中间抛了异常,后面的事件绑定和初始化逻辑全部不会执行。最常见的抛错点是getElementById拿到 null 之后直接调属性,或者数据对象里某个字段不存在。解决:看控制台报错的文件名和行号,定位到具体代码,然后对可能拿不到的元素做判空处理:
const el = document.getElementById('app'); if (el) { // 元素存在才继续操作 el.textContent = '内容'; }还有一种是脚本顺序问题:依赖某个元素的代码,要么放到 body 底部,要么用 DOMContentLoaded 事件包裹,确保 DOM 解析完成后再执行。把一次报错当成是一条线索,顺着控制台给的定位去找,通常一分钟就能定位。
5.3 图片与资源 404:相对路径的坑
现象:页面结构在,但图片裂开,网络面板里图片请求显示 404。原因:相对路径是相对于当前页面 URL 解析的,不是相对于 CSS 文件。典型错误是在css/style.css里写url(images/logo.png),浏览器会去css/images/logo.png找,自然找不到。解决:从项目根角度写../images/logo.png(返回上一级再进 images),或者直接以斜杠开头写/images/logo.png。排查技巧:在开发者工具网络面板点开失败的请求,能看到浏览器最终请求的完整 URL,一眼就能看出路径被算到了哪一层。这个习惯对 fetch 请求同样适用。
5.4 控制台没报错但交互没反应
现象:控制台干干净净,网络请求也成功,但点击、滚动、表单提交就是不触发。原因:事件压根没绑定上。最常见是脚本在目标元素创建之前就执行了,getElementById返回 null,后面没法绑;另一种是表单按钮默认是type="submit",点击后页面直接刷新,事件还没来得及执行就重载了。解决:脚本移到 body 末尾,或包进 DOMContentLoaded;表单按钮在不打算提交时改成type="button"。如果确实需要提交,在事件回调第一行调用preventDefault()阻断默认行为。验证事件绑没绑上,最简单的办法是在回调里加一行console.log,点击后看控制台有没有输出,也可以用开发者工具给元素打断点查看事件监听器列表。
5.5 中文乱码:编码问题的两处源头
现象:页面上的中文显示成乱码,控制台输出的中文也乱码。原因:有两处源头。一是 HTML 文件缺了<meta charset="UTF-8">,浏览器用系统默认编码解析页面,中文字符全乱;二是编辑器默认按其他编码保存,文件本身就不是 UTF-8,meta 声明再对也没用。解决:模板里永远保留<meta charset="UTF-8">;新建文件时留意编辑器右下角的编码提示,统一存为 UTF-8。判断是哪一处:先在开发者工具里看 head 部分有没有 charset 声明,有的话把文件用其他编辑器重新打开并另存为 UTF-8。这个坑遇到一次之后就会长记性,因为乱码的特征太显眼了。
6. 学完怎么验证:把教程示例改造成自己的小项目
我的血泪经验是:把实例从头到尾抄一遍,价值很低;每个例子做完之后改一版,价值才高。所谓改,不是换换文字,而是做三个动作:数据拆分、布局替换、交互新增。
第一步,数据拆分。把页面里的静态内容抽成一个 JavaScript 数组或 JSON 文件,用第 4 章的方式渲染出来。这一步强迫你区分「结构」和「数据」。第二步,布局替换。把原来的表格布局换成 Flexbox 卡片布局,顺便加一个响应式断点,把 3.3 里的flex-wrap和@media用上。第三步,交互新增。在教程例子的基础上加一个过滤或排序功能,哪怕是「只显示未完成项」这种小功能,也会逼你重新读原来代码的每一行,搞清楚数据从哪来、往哪去。
改造完成后,用下面这张检查表做验证:
| 检查项 | 方法 | 通过标准 |
|---|---|---|
| 资源加载 | 开发者工具网络面板 | 无红色失败的请求 |
| 脚本错误 | 控制台面板 | 全程无报错输出 |
| 事件绑定 | 点击并观察控制台 | 每次操作都有对应日志 |
| 极端输入 | 空数据、超长文本、快速重复点击 | 页面不崩溃,布局不破 |
验证的兜底手段,是在开发者工具的源代码面板里给关键函数打断点,单步执行,看数据每一步长什么样。这比到处加 console.log 高效,也能让你真正理解代码的执行顺序。养成从数据到渲染逐步排查的习惯之后,再看框架源码就不会觉得它是黑匣子。
最后一条经验是这几年带人做实例练习攒下的:学三件套,慢就是快。一个例子改三遍,比十个例子各过一遍有用得多。教程可以合上,但手要留在键盘上。希望帮到你。
本文还有配套的精品资源,点击获取