🌐 第四章 Web网站的运行原理
📄 一句话概括

网页是用 HTML(超文本标记语言) 写出来的——它的全部工作只有一件:给内容贴标签,说明"这段是标题、这段是段落、这个位置放一张图"。标签订完,浏览器自己决定怎么画。所以 HTML 不是编程语言,它不"执行"什么,只是描述;而那几个标签组合起来会变成一棵树(DOM),这棵树才是浏览器真正读的东西——也是脚本能改、搜索引擎能抓、读屏软件能念的东西。

📝 本节和 4.1 的分工

4.1 把网站拆成四件套(域名 / 服务器主机 / Web 服务器软件 / 内容文件)。 本节接过其中"内容文件"那一件,拆开看:网页文件里面到底写了什么。

一句话对照:4.1 讲网站由什么组成,4.2 讲网页由什么组成。

一、先把名字拆开:HTML 是什么

HTML = Hyper Text Markup Language = 超文本标记语言。

这四个词,每一个都有用:

词 意思 落在哪
Hyper(超) 能"跳"——从这一页跳到另一页 <a> 超链接(第五节)
Text(文本) 内容是文字 纯文本文件,记事本就能写
Markup(标记) 给内容贴标签,说明它是什么 第五节那张标签清单
Language(语言) 一门描述用的语言 但它不是编程语言
❗ 最重要的一句:HTML 不是编程语言

编程语言(Java、Python)有变量、判断、循环,能被"执行",会算出结果。

HTML 一样都没有。它不执行、不计算,只做一件事:给内容贴上"这是什么"的标签。

最贴切的类比是给搬家的纸箱贴标签: - 你在箱子上写"厨房用品""易碎"——贴标签不改变箱子里的东西,只是说明它是什么 - 到了新家,别人看着标签决定往哪儿放——这个"别人"就是浏览器

所以:HTML 负责说明,浏览器负责呈现。 两者是分开的(这条在第六节还会再翻一层)。

二、标签:HTML 的全部家当

标签(tag)长这样:

<p>这是一段文字</p>
│            │
开标签      闭标签(多个斜杠)

三条规则:

  1. 成对出现:开头 <p>、结尾 </p>,中间夹着内容
  2. 可以带属性:<a href="https://example.com">点我</a>——href 是属性名,引号里是值。属性写在开标签里
  3. 空元素不成对:<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 里的东西都不显示,但**不显示 ≠ 不重要**

初学者最容易觉得"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> 标签,是整件事的起点:

❗ 为什么叫"超文本",为什么叫"Web"

没有链接,网页就只是一份电子文档——和 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 树(文档对象模型)。

(对应上面第二张图)

❗ 为什么"树"这件事值得单独拎出来

因为这棵树是浏览器真正使用的东西,源码只是原料:

  1. 页面是按树画的——浏览器遍历这棵树,才知道谁在谁里面、谁该显示在谁下面
  2. 脚本改的是树,不是文件——JS 让某个元素消失,是改这棵树上的一个节点;你硬盘上那个 .html 文件一个字都没变(这就是为什么 F12 里"看源码"和"看元素"常常不一样)
  3. 搜索和读屏软件读的也是树——所以标签贴得准不准,直接决定它们能不能读懂你的页面

一句话: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>你好),刷新看看——页面照样显示。这就是第五节的"浏览器容错",亲手踩一次比看十遍文字都记得牢。

八、常见误区

  1. ❌ "HTML 是编程语言" → 是标记语言:没有变量、判断、循环,不执行逻辑,只描述"这是什么";贴标签不改变内容
  2. ❌ "标签写错页面就废了" → 浏览器极其宽容,会自动猜着补上照样显示;但错误不会报给你,所以结构问题只能靠 F12 的元素面板自己看
  3. ❌ "图片是嵌在 HTML 文件里的" → 图片是引用(<img> 只写了地址),所以每张图都是单独一次请求(收 4.1)
  4. ❌ "用 <font>、<center> 调样式挺方便" → 那些早淘汰了:样式归 CSS,HTML 只管内容和结构——分离才能"改一处、全站生效"
  5. ❌ "改了 HTML 刷新却没变" → 多半是浏览器缓存(收 4.1 的缓存命中);用 Ctrl + F5 强制刷新
  6. ❌ "文件后缀无所谓,.txt 也一样" → 真正起作用的是服务器给的 Content-Type(text/html);但很多服务器按后缀判断,所以后缀要写对
  7. ❌ "中文乱码是浏览器的问题" → 是 charset 声明和文件实际编码不一致。记一条铁律:文件存 UTF-8,页面写 <meta charset="UTF-8">
  8. ❌ "HTML 写完了,屏幕上就该长那样" → 中间隔着浏览器:HTML 是原料,绘制是浏览器干的(收 4.1);样式丢了 HTML 还在,这就是分离的好处

九、动手自测

❓ 自测一下
  1. HTML 四个字母分别是什么意思?为什么它不算"编程语言"?
  2. 一个网页的骨架里,<head> 和 <body> 各管什么?哪个不显示在页面上?
  3. <meta charset="UTF-8"> 是干什么的?写错了会出现什么现象?
  4. 为什么 HTML 被称为"标记"语言?用搬家的类比说一遍。
  5. Web 的"网"字,和哪个标签直接相关?为什么说"没有它网页就只是电子文档"?
  6. <img> 标签把图片"嵌"进页面了吗?这和 4.1 的"上百次请求"有什么关系?
  7. 什么是 DOM 树?为什么"脚本改的是树,不是文件"?
  8. 为什么 <font color="red"> 这种写法被淘汰了?用"200 个页面改成蓝色"的例子说明。
  9. 页面里 <a href="#top"> 的 #top 会发给服务器吗?
  10. 为什么 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 的元素面板看真实的结构树。

十、下一步学什么

相关笔记