网页是用 HTML(超文本标记语言) 写出来的——它的全部工作只有一件:给内容贴标签,说明"这段是标题、这段是段落、这个位置放一张图"。标签订完,浏览器自己决定怎么画。所以 HTML 不是编程语言,它不"执行"什么,只是描述;而那几个标签组合起来会变成一棵树(DOM),这棵树才是浏览器真正读的东西——也是脚本能改、搜索引擎能抓、读屏软件能念的东西。
4.1 把网站拆成四件套(域名 / 服务器主机 / Web 服务器软件 / 内容文件)。 本节接过其中"内容文件"那一件,拆开看:网页文件里面到底写了什么。
一句话对照:4.1 讲网站由什么组成,4.2 讲网页由什么组成。
一、先把名字拆开:HTML 是什么
HTML = Hyper Text Markup Language = 超文本标记语言。
这四个词,每一个都有用:
| 词 | 意思 | 落在哪 |
|---|---|---|
| Hyper(超) | 能"跳"——从这一页跳到另一页 | <a> 超链接(第五节) |
| Text(文本) | 内容是文字 | 纯文本文件,记事本就能写 |
| Markup(标记) | 给内容贴标签,说明它是什么 | 第五节那张标签清单 |
| Language(语言) | 一门描述用的语言 | 但它不是编程语言 |
编程语言(Java、Python)有变量、判断、循环,能被"执行",会算出结果。
HTML 一样都没有。它不执行、不计算,只做一件事:给内容贴上"这是什么"的标签。
最贴切的类比是给搬家的纸箱贴标签: - 你在箱子上写"厨房用品""易碎"——贴标签不改变箱子里的东西,只是说明它是什么 - 到了新家,别人看着标签决定往哪儿放——这个"别人"就是浏览器
所以:HTML 负责说明,浏览器负责呈现。 两者是分开的(这条在第六节还会再翻一层)。
二、标签:HTML 的全部家当
标签(tag)长这样:
<p>这是一段文字</p>
│ │
开标签 闭标签(多个斜杠)
三条规则:
- 成对出现:开头
<p>、结尾</p>,中间夹着内容 - 可以带属性:
<a href="https://example.com">点我</a>——href是属性名,引号里是值。属性写在开标签里 - 空元素不成对:
<img src="logo.png" alt="图片">、<br>、<meta>——它们不包内容,只交代一件事
标签名大小写不敏感(<P> 和 <p> 效果一样),但大家都写小写,这是习惯也是规范。
一个网页的标准骨架(图一)
任何一个网页,剥到最外面都是这个架子:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>我的第一张网页</title>
</head>
<body>
这里放人看得见的内容
</body>
</html>
逐行说清:
| 行 | 干什么 | 不说会怎样 |
|---|---|---|
<!DOCTYPE html> |
声明"我是 HTML5" | 浏览器按"老规矩"猜,可能进入怪异模式 |
<html> |
整份文档的根 | 必须有 |
<head> |
给浏览器看的说明书 | 缺了页面照显示,但编码、标题全乱 |
<meta charset="UTF-8"> |
这份文件用什么编码读 | 中文变乱码(新手第一个坑) |
<title> |
浏览器标签页上显示的字 | 标签页显示文件名或网址 |
<body> |
给人看的内容 | 页面空白 |
(对应上面第一张图)
初学者最容易觉得"head 是可有可无的装饰"。实际上:
- charset 写错 → 整个页面中文全乱码
- title 就是收藏夹和搜索结果的标题
- <link> 引用的 CSS 文件失效 → 页面变成没有装修的毛坯(第六节)
head 是给"机器"看的:浏览器、搜索引擎、读屏软件都只读这里。
常用标签清单(够写一个网站首页了)
| 标签 | 干什么 | 说明 |
|---|---|---|
<h1> ~ <h6> |
六级标题 | <h1> 是页面大标题,一个页面通常只放一个(这关系到搜索引擎怎么理解你的页面) |
<p> |
段落 | 最常用的一个 |
<a href="..."> |
超链接 | Web 的命根子(第三节单独讲) |
<img src="..." alt="..."> |
图片 | 注意:图片是"引用"不是"嵌入"(第四节) |
<ul> / <ol> / <li> |
无序 / 有序列表 | 导航菜单本质就是一个列表 |
<table> / <tr> / <td> |
表格 | 只用来放数据,不要拿来排版(老做法,见误区) |
<div> / <span> |
通用容器 | div 独占一行(块级)、span 跟着文字走(行内);主要给 CSS 提供"抓手" |
<form> / <input> / <button> |
表单 | 输入框、按钮——4.1 说的"输入密码登录"从这儿开始 |
<br> / <hr> |
换行 / 分隔线 | 空元素,不成对 |
记忆窍门:标签名基本都是英文的缩写——p = paragraph(段落),h = heading(标题),img = image,a = anchor(锚点,链接的原名)。
三、超链接:Web 之所以是"网"
<a href="https://www.example.com">点我去看看别的地方</a>
这个小小的 <a> 标签,是整件事的起点:
没有链接,网页就只是一份电子文档——和 PDF 没本质区别。
有了 <a>,页面之间能互相指向:A 页跳到 B 页,B 页跳到 C 页,全世界几亿个网页被链接织成一张网——这正是 Web(蜘蛛网) 这个名字的由来。
收 1.4 的账:1.4 说过"互联网 ≠ WWW"。现在能说得更准了—— 互联网是那套传输的网络(第三章全部内容); WWW(万维网)是跑在它上面的一种服务,而这个服务的核心机制就是用超链接把文档连起来。 换个说法:互联网是路,Web 是路上跑的一种车。
链接有几种写法,都脱不开 4.1 拆过的那五段 URL:
| 写法 | 例子 | 意思 |
|---|---|---|
| 外链 | href="https://www.example.com" |
跳到别的网站 |
| 站内链接 | href="/about.html" |
跳到自己网站的另一个页面 |
| 锚点链接 | href="#top" |
跳到本页某一段——服务器收不到它(收 4.1) |
| 邮件 / 电话 | href="mailto:[email protected]" |
唤起邮件客户端 |
四、图片是"引用"不是"嵌入"
这一点和 4.1 的"上百次请求"直接对上:
<img src="images/logo.png" alt="公司标志">
HTML 文件里没有图片本身,只有一行"图片在哪"的地址。 浏览器读到这行,再单独发一次请求去把图取回来。
所以一个页面里的每一个 <img>、每一个 <link> 引用的 CSS,都等于一次新的请求:
| 页面里有 | 请求数 |
|---|---|
| 1 个 HTML 文件 | 1 |
| 3 张图片 | +3 |
| 1 个 CSS 文件 | +1 |
| 1 个 JS 文件 | +1 |
| 合计 | 6 次 |
这就是 4.1 说的"一次打开网页 = 几十上百次请求"的具体来源——不是网络玄学,是文件本来就这么多。
src 里是相对路径(images/logo.png,相对于当前网页的位置)或绝对路径(完整 URL)。
路径写错,浏览器拿到的就是 404(收 4.1 的状态码),页面上显示一个破图图标。
排障口诀:F12 → 网络面板 → 看哪条红了。红的那条就是路径错的那个文件。
五、标签嵌套 → 一棵树
标签是一层套一层的:<html> 里装 <head> 和 <body>,<body> 里装标题和段落。这种嵌套不能交叉:
<p><a href="#">点我</p></a> ← 错(交叉了,像两只手胡乱扣)
<p><a href="#">点我</a></p> ← 对
浏览器读完这些嵌套,会把它组织成一棵树——这棵树叫 DOM 树(文档对象模型)。
(对应上面第二张图)
因为这棵树是浏览器真正使用的东西,源码只是原料:
- 页面是按树画的——浏览器遍历这棵树,才知道谁在谁里面、谁该显示在谁下面
- 脚本改的是树,不是文件——JS 让某个元素消失,是改这棵树上的一个节点;你硬盘上那个
.html文件一个字都没变(这就是为什么 F12 里"看源码"和"看元素"常常不一样) - 搜索和读屏软件读的也是树——所以标签贴得准不准,直接决定它们能不能读懂你的页面
一句话:HTML 是"写给人看的原料",DOM 是"机器实际用的成品"。
对比一下: - Java 写错一个分号 → 编译不过,直接报错 - HTML 少个闭标签 → 浏览器猜着补上,页面照样显示
这叫容错,好处是网页"抗揍"(互联网上大量写得潦草的页面还能跑);坏处是错误不报给你——结构错了、标签嵌套乱了,可能只是"看着有点怪",你根本不知道哪里有问题。
所以新手遇到"样式怎么调都不对",第一步永远是:F12 → 元素面板,看这棵树到底长成什么样了(很可能和你以为的不一样)。
六、结构与表现分离
4.1 说网页有四件:HTML 骨架 / CSS 装修 / JS 水电 / 图片家具。本节负责骨架,但必须说清分工边界:
| 谁 | 管什么 | 负责 |
|---|---|---|
| HTML | 内容与结构 | "这里是一个标题、这里是一段话、这个位置是一张图" |
| CSS | 表现 | "这个标题多大、什么颜色、离上面多远" |
| JS | 行为 | "点这个按钮时发生什么" |
这个分工是刻意设计的,不是巧合。反例最能说明问题——早年(现在也偶尔见到)有人这样写:
<font color="red" size="5">大标题</font>
<center>这一段居中</center>
这种写法已经被淘汰了,原因是:
假设网站有 200 个页面,全都写了 <font color="red">。现在老板说"红色改成蓝色":
- 混着写:改 200 个文件,而且必然会漏
- 分离着写:CSS 里改一行
所以现代做法是:HTML 里只管"这是什么",把所有"长什么样"交给 CSS 文件。这也正是 4.1 说的——浏览器要为每个 CSS 文件单独发一次请求(代价),换来的是改一处、全站生效(收益)。
引用 CSS 有两种位置:<link> 引进外部文件(推荐,能复用、能被浏览器缓存)、或 <style> 直接写在页面里(临时测试用)。
七、动手 Demo39:手写你的第一张网页
1. 建文件夹、建文件
新建一个文件夹(比如 mysite),在里面新建文本文件,命名为 index.html。
(index 是惯例上的"首页文件名"——服务器收到"访问根目录"的请求时,默认就找它。)
2. 把这段抄进去(手抄一遍比复制有用,标签的写法会自然记住)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>我的第一张网页</title>
</head>
<body>
<h1>你好,这是我的网页</h1>
<p>这是第一段文字。</p>
<a href="https://www.example.com">点我去看看别的地方</a>
</body>
</html>
3. 存盘时编码选 UTF-8(记事本右下角 / 另存为对话框里选)。这是防中文乱码的关键一步——文件存的编码必须和 charset 说的一致。
4. 双击打开——浏览器里出页面了。看地址栏:开头是 file://(收 4.1:本地直读硬盘,没走网络)。
5. 现在把它"上线"(收 4.1 的 Demo38 第 3 步)
cd mysite
python -m http.server 8000
浏览器打开 http://localhost:8000 —— 这一次走的是真的 HTTP:请求进了门房、门房找到 index.html、发回响应。盯着那个命令行窗口,刷新一次就多一行日志。
6. 打开 F12 看那棵树(本节图二的实证)
F12 → 元素(Elements) 面板 → 展开那个 html 小三角。
你会看到和第五节那张树一模一样的结构(html → head/body → h1/p/a)。
再点几下 <body>、<h1>,右侧会显示它的样式——"树上哪个节点、用了什么样式"一目了然,这就是排障的主战场。
7. 30 秒实验:三件小事
① 在元素面板里双击 <h1> 里的文字改一改——页面上立刻变,但硬盘上的文件没变(刷新就恢复了)。这验证了"脚本/工具改的是树,不是文件"。
② 把 charset 改成 GBK 存盘、刷新 —— 中文乱码。改回 UTF-8 恢复正常。
③ 把 <h1> 改成 <h6>、把 <a> 的 href 换成一个不存在的地址 —— 体会标签决定"这是什么",浏览器决定"长什么样"。
把 index.html 里的 <h1> 那行删掉闭标签(写成 <h1>你好),刷新看看——页面照样显示。这就是第五节的"浏览器容错",亲手踩一次比看十遍文字都记得牢。
八、常见误区
- ❌ "HTML 是编程语言" → 是标记语言:没有变量、判断、循环,不执行逻辑,只描述"这是什么";贴标签不改变内容
- ❌ "标签写错页面就废了" → 浏览器极其宽容,会自动猜着补上照样显示;但错误不会报给你,所以结构问题只能靠 F12 的元素面板自己看
- ❌ "图片是嵌在 HTML 文件里的" → 图片是引用(
<img>只写了地址),所以每张图都是单独一次请求(收 4.1) - ❌ "用
<font>、<center>调样式挺方便" → 那些早淘汰了:样式归 CSS,HTML 只管内容和结构——分离才能"改一处、全站生效" - ❌ "改了 HTML 刷新却没变" → 多半是浏览器缓存(收 4.1 的缓存命中);用
Ctrl + F5强制刷新 - ❌ "文件后缀无所谓,
.txt也一样" → 真正起作用的是服务器给的Content-Type(text/html);但很多服务器按后缀判断,所以后缀要写对 - ❌ "中文乱码是浏览器的问题" → 是
charset声明和文件实际编码不一致。记一条铁律:文件存 UTF-8,页面写<meta charset="UTF-8"> - ❌ "HTML 写完了,屏幕上就该长那样" → 中间隔着浏览器:HTML 是原料,绘制是浏览器干的(收 4.1);样式丢了 HTML 还在,这就是分离的好处
九、动手自测
- HTML 四个字母分别是什么意思?为什么它不算"编程语言"?
- 一个网页的骨架里,
<head>和<body>各管什么?哪个不显示在页面上? <meta charset="UTF-8">是干什么的?写错了会出现什么现象?- 为什么 HTML 被称为"标记"语言?用搬家的类比说一遍。
- Web 的"网"字,和哪个标签直接相关?为什么说"没有它网页就只是电子文档"?
<img>标签把图片"嵌"进页面了吗?这和 4.1 的"上百次请求"有什么关系?- 什么是 DOM 树?为什么"脚本改的是树,不是文件"?
- 为什么
<font color="red">这种写法被淘汰了?用"200 个页面改成蓝色"的例子说明。 - 页面里
<a href="#top">的#top会发给服务器吗? - 为什么 Java 写错会报错、HTML 写错却照常显示?这对排障意味着什么?
答案:
① Hyper(超,能跳)+ Text(文本)+ Markup(标记,贴标签)+ Language(语言)。它不是编程语言,因为没有变量/判断/循环,不执行、不计算,只给内容贴"这是什么"的标签。
② <head> 是给浏览器看的说明书(编码、标题、引用的 CSS),一个字都不显示;<body> 是给人看的内容,屏幕上一切可见元素都出自它。
③ 声明这份文件用什么编码读。它和文件实际保存的编码必须一致;不一致时中文会变成乱码。
④ 像给搬家纸箱贴标签:写"厨房用品""易碎"并不改变箱子里的东西,只是说明它是什么;到了新家,别人照标签决定往哪放——那个"别人"就是浏览器。
⑤ <a> 超链接。没有链接,每个网页都只是一份孤立的电子文档;有了链接,页面互相指向、织成一张网,才有 Web(蜘蛛网) 这个名字。互联网是路,Web 是路上跑的一种车(收 1.4)。
⑥ 没有。<img> 里只是"图片在哪"的地址,图片要再单独发一次请求去取。页面上有 3 张图 + 1 个 CSS + 1 个 JS,加上 HTML 本身就是 6 次请求——这正是"打开一个网页几十上百次请求"的来源。
⑦ 浏览器把嵌套的标签组织成一棵树(文档对象模型)。页面按这棵树绘制;脚本改的是树上的节点,硬盘上的 .html 文件一个字不变(所以 F12 的"元素"和"源码"常常不一样)。
⑧ 因为结构和表现混在了一起。200 个页面都写死红色,要改成蓝色就得改 200 个文件还必然漏;分离后 CSS 里改一行全站生效。代价是浏览器要为 CSS 文件多发一次请求。
⑨ 不会。# 后面是锚点,只给浏览器自己用来"跳到本页某一段",从不出现在发给服务器的请求里(收 4.1 的 URL 拆解)。
⑩ Java 有严格的语法检查(编译不过直接报错);HTML 的浏览器会容错——猜着补上、照样显示。所以 HTML 排障不能靠"有没有报错",只能靠 F12 的元素面板看真实的结构树。
十、下一步学什么
- ☑ 4.3 设计Web网页的外观(样式表) —— 下一节:设计Web网页的外观(样式表)。本节把"内容文件"拆到了标签层,也撂下一句"
<font color>那套淘汰了";下一节来履行那句话——"表现"到底写在哪、怎么写。
相关笔记
- Web网站是如何构建的(Web网站) —— 上一节:网站四件套;本节接手其中的"内容文件",拆到标签层
- 通信过程中所使用的语言(网络架构) —— 应用层这一格终于看到实物了:HTTP 传的就是这些 HTML 文本
- 根据端口号分配数据到应用程序(端口号、已知端口号) —— 门房守着 80 / 443;
localhost:8000里的 8000 就是自己手工指定的端口 - 网络的网络(互联网) —— "互联网 ≠ WWW" 的旧账:本节用
<a>超链接把 WWW 的"网"字说清了 - 网络的电话簿(域名解析、主机名、DNS) —— 缓存老账:改了 HTML 刷新没变,是浏览器缓存而不是服务器的问题
- 用TCP对数据进行分割处理(序列号、ACK号) —— 一个 HTML 文本文件在传输层是怎么被切成段、再拼回来的
- 运行和管理服务器(服务器、云服务、内部部署) ——
python -m http.server的原始出处;本节把它当"门房日志"来看