只要内容里有 <、>、&,就必须写成实体,否则浏览器会把它当标签解析。
| 写法 | 渲染结果 | 说明 |
|---|---|---|
| < > | < > | 小于号 / 大于号,写代码示例必备 |
| & | & | 与符号。&nbsp; 这类写错会产生奇怪文本 |
| " | " | 双引号,属性值里嵌套时用 |
| ' | ' | 单引号(注意:旧 IE 不支持,用 ' 更稳) |
| | A B | 不换行的空格,四个连着才留得住三个空格 |
| © / ® / ™ | © ® ™ | 版权 / 注册 / 商标 |
| — / – | — – | 长破折号 / 短连接号 |
| · | · | 中点,面包屑分隔符常用 |
| 代 | 代 | 十进制数字实体,任意 Unicode 都能这么写 |
| 代 | 代 | 同一字的十六进制写法 |
不需要。只要页面声明了 <meta charset="UTF-8"> 且文件真的存成 UTF-8,中文、emoji(😀)、数学符号(∑)都可以直接写。实体的现代用途只剩两类:展示标签语法的教程页,以及不确定文件编码的旧环境。
反过来,内容里出现用户输入的 <script> 之类文本时,要在输出到 HTML 时做转义(这是防 XSS 的关键一步,和「模板里写 {{ }} 时 Vue/React 已自动转义」是同一件事的两面)。
<!-- 普通注释 -->
<!--[if IE]> 条件注释:IE 10+ 已彻底废弃,别再用 <![endif]-->
<!-- 注意:注释里不能再出现连续的两个减号 --
也不要试图注释掉一段含 -- 的脚本,解析会提前结束 -->
三条现状:① 注释会随 HTML 一起发给用户,别写内部接口地址、密钥、 TODO 里的客户名字;② 浏览器不会执行注释里的脚本,但「注释掉密码」这种写法每年都会被扫到一次;③ 大段被注释的死代码请删掉,交给版本控制。
| 项目 | 现代约定 | 说明 |
|---|---|---|
| 标签大小写 | 全部小写 | <DIV> 合法但罕见;HTML 不区分大小写,XHTML 和 Vue 模板区分,混写最容易出问题 |
| 属性值引号 | 始终加引号 | 值里含空格、& 时不加就错;统一加引号最省心 |
| 布尔属性 | required 直接写,不用 required="required" | 同理 disabled、checked、autoplay;注意 JS 里 el.getAttribute('disabled') 拿到的是 "" 而不是 "true" |
| 自闭合标签 | <meta charset="UTF-8">,不写 /> | <br/> 是 XHTML 遗产,HTML5 里那个斜杠被忽略;void 元素(br、img、input、hr、meta、link、source)永远没有结束标签 |
| 缩进 | 两个空格(本站与 Vue 官方风格一致) | 制表符也合法,同一个项目里别混用;交给 Prettier/编辑器统一 |
| DOCTYPE 与首行 | 第一行 <!DOCTYPE html> | 前面有空行会让浏览器进入怪异模式(第二章) |