Warning:
This wiki has been archived and is now read-only.
HTML5/syntax
HTML 语法
编写 HTML 文档
DOCTYPE 声明
HTML文档必须以一个DOCTYPE开始。
DOCTYPE因为历史原因而作为必须选项存在。如果省略了DOCTYPE,浏览器会采用不符合某些标准的渲染模式。因此在文档中加入DOCTYPE,可以保证浏览器尽最大可能地遵循相关标准。
一个DOCTYPE必须包含以下部分,并严格按照顺序出现:
- 一个ASCII字符串"<!DOCTYPE",大小写不敏感。
- 一个或多个空白字符。
- 一个ASCII字符串"html",大小写不敏感。
- 一个可选的历史遗留的DOCTYPE字符串,或者一个可选的已过时但被允许的DOCTYPE字符串(下文有具体声明)。
- 一个或多个空白字符。
- 一个编码为U+003E的大于符号(>)。
由于有些HTML生成器无法输出简短形式的DOCTYPE,即"<!DOCTYPE html>",标准允许在DOCTYPE中(上文所述的位置)插入一个历史遗留的DOCTYPE字符串。该字符中必须有以下内容组成:
- 一个或多个空白字符。
- 一个ASCII字符串"SYSTEM",大小写不敏感。
- 一个或多个空白字符。
- 一个编码为U+0022的双引号,或者编码为U+0027的单引号。
- 字符串"about:legacy-compat"。
- 一个对应的编码为U+0022的双引号,或者编码为U+0027的单引号(与第4步中使用的相匹配)。
不应该使用历史遗留的DOCTYPE字符串,除非文档由不能生成简短形式的DOCTYPE的系统生成。
为了帮助用户从HTML4和XHTML1完成升级,标准允许在DOCTYPE中(上文所述的位置)插入一个已过时但被允许的DOCTYPE字符串。该字符中必须有以下内容组成:
- 一个或多个空白字符。
- 一个ASCII字符串"PUBLIC",大小写不敏感。
- 一个或多个空白字符。
- 一个编码为U+0022的双引号,或者编码为U+0027的单引号。
- 从下面表格的第1列中任取一个字符串,下文中“被选行”指被选择的字符串所在的行。
- 一个对应的编码为U+0022的双引号,或者编码为U+0027的单引号(与第4步中使用的相匹配)。
- 如果被选行的第2列非空,一个或多个空白字符。
- 如果被选行的第2列非空,一个编码为U+0022的双引号,或者编码为U+0027的单引号。
- 如果被选行的第2列非空,被选行的第2列中的字符串。
- 如果被选行的第2列非空,一个对应的编码为U+0022的双引号,或者编码为U+0027的单引号(与第8步中使用的相匹配)。
过时但被允许的DOCTYPE字符串中可以使用的公共及系统标识符
公共标识符 | 系统标识符 |
---|---|
-//W3C//DTD HTML 4.0//EN | |
-//W3C//DTD HTML 4.0//EN | http://www.w3.org/TR/REC-html40/strict.dtd |
-//W3C//DTD HTML 4.01//EN | |
-//W3C//DTD HTML 4.01//EN | http://www.w3.org/TR/html4/strict.dtd |
-//W3C//DTD XHTML 1.0 Strict//EN | http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd |
-//W3C//DTD XHTML 1.1//EN | http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd |
当一个DOCTYPE中含有过时但被允许的DOCTYPE字符串时,这个DOCTYPE被称为已过时但被允许的DOCTYPE。由于已过时但被允许的DOCTYPE含有非必要的冗长信息,作者不应该使用之。
元素
共有5种元素:空元素、原始文本元素、RCDATA元素、外来元素以及常规元素。
- 空元素
- area、base、br、col、command、embed、hr、img、input、keygen、link、meta、param、source、track、wbr
- 原始文本元素
- script、style
- RCDATA元素
- textarea、title
- 外来元素
- 来自MathML命名空间和SVG命名空间的元素。
- 常规元素
- 其他HTML允许的元素都称为常规元素。
标签在标记中起到标记元素的开始和结束的作用。原始文本、RCDATA以及常规元素都有一个开始标签来表示开始,一个结束标签来表示结束。某些元素的开始和结束标签是可以省略的,将在后文详述。如果规定标签不能被省略,那么就绝对不能省略它。空元素只有一个开始标签,且不能为空元素设置结束标签。外来元素可以有一个开始标签和配对的结束标签,或者只有一个自闭合的开始标签,且后者情况下该元素不能有结束标签。
元素的内容必须紧随开始标签(特定情况下可省略)之后,且在结束标签(同样在特定情况下可省略)之前。一个元素中可以出现的内容由它的内容模型决定,在本标准的前面部分章节中已经有详细说明。一个元素不能包含它的内容模型不允许的内容。除了内容模型的限制之外,此5类元素还有额外的语法限制。
空元素不能有任何内容(因为空元素没有结束标签,自然没办法在开始标签和结束标签之间放内容)。
原始文本元素可以包含文本,但有下文所述的限制。
RCDATA元素可以包含文本和字符引用,但是文本中不能包含意义不明的符号。另外此类元素还有下文所述的额外限制。
对于外来元素,当开始标签自闭合时,不能包含任何内容(因为没有结束标签,所以不能在开始标签和结束标签之间放内容)。当开始标签不自闭合时,其内容可以包含文本、字符引用、CDATA块、其他元素和注释,但是文本不能包含编码为U+003C的小于符号(<)或者意义不明的符号。
HTML语法不支持命名空间声明,外来元素也无法使用命名空间。
例如以下HTML片段:
<p>
<svg>
<metadata>
<!-- 下面这元素是非法的 -->
<cdr:license xmlns:cdr="http://www.example.com/cdr/metadata" name="MIT"/>
</metadata>
</svg>
</p>
最里面的cdr:license
最终会在元素在SVG命名空间下,因为"xmlns:cdr"属性不会起作用(这和XML不同)。事实上,就如该元素上面的注释所说,这个元素其实是非标准的,因为SVG标准在SVG命名空间下没有定义叫"cdr:license"的元素。
常规元素可以包含文本、字符引用、其他元素以及注释,但是文本不能包含编码为U+003C的小于符号(<)或者意义不明的符号。在内容模型和本章节的给出的限制之外,有些常规元素在可以包含的内容方面有额外的限制,如下所述。
标签包含一个标签名,用于指定元素的名称。HTML元素的名称只使用编码在U+0030数字0(0)到U+0039数字9(9)、U+0061小写字母A到U+007A小写字母Z、U+0041大写字母A到U+005A大写字母Z这些区间内的字符。在HTML语法中,标签名(包括外来元素)可以用任何形式的大小写字母组合形式,只要所有字符转化为小写以后和元素的标签名称相等即可,即标签名是大小写不敏感的。
开始标签
开始标签必须符合以下格式:
- 开始标签的第一个字符必须是编码为U+003C的小于符号(<)。
- 之后的若干个字符必须是元素的标签名称。
- 如果之后有若干个属性,则必须先有一个或多个空白字符。
- 随后开始标签可以包含一定数量的属性,属性的具体语法在下文进行阐述。各个属性之间必须通过一个或多个空白字符分隔。
- 在属性之后(没有属性时,在标签名之后),可以有一个或多个空白字符。(有些属性要求其后紧随空格,具体见下文的属性章节)。
- 随后,如果该元素是空元素或者外来元素,则可以有一个编码为U+002F的斜杠符号(/)。该字符对于空元素没有作用,但对于外来元素,该符号表示开始标签自闭合。
- 最后,开始标签必须以一个编码为U+003E的大于符号(>)关闭。
结束标签
结束标签必须符合以下格式:
- 结束标签的第一个字符必须是编码为U+003C的小于符号(<)。
- 第二个字符必须是编码为U+002F的斜杠符号(/)。
- 之后的若干个字符必须是元素的标签名称。
- 在标签名之后,可以有一个或多个空白字符。
- 最后,结束标签必须以一个编码为U+003E的大于符号(>)关闭。
属性
一个元素的属性出现在它的开始标签内。
属性由名称和值组成。属性的名称必须由一个或多个字符组成,且不能包含以下字符:空白字符、编码为U+0000的NULL字符,U+0022的双引号(")、U+0027的单引号(')、U+003E的大于符号(>)、U+002F的斜杠(/)、U+003D的等号(=)、控制字符以及其他非Unicode定义的字符。在HTML语法中,属性的名称(包括外来元素)可以由任何形式的大小写字符组成,只要所有字符转化为大写以后和属性名称相同即可。
属性的值由文本和字符引用混合而成,文本中不得包含意义不明的符号。
属性可以通过以下4种形式定义:
- 空属性语法
-
只有属性名称,此时属性值隐式地指定为空字符串。
下例中的
disabled
属性通过空属性语法定义:<input disabled>
如果一个空属性语法定义的属性之后还有另一个属性,则2个属性间必须用一个空格字符分隔。
- 不带引号的语法
-
属性名称后跟随一个或多个空格字符,随后一个编码为U+003D的等号,随后一个或多个字符,其后跟随属性的值。此时除了上文给定的限制外,属性的值还不得包含空格、编码为U+0022的双引号(")、U+0027的单引号(')、U+003D的等号(=)、U+003C的小于符号(<)、U+003E的大于符号(>)以及U+0060的波浪号(`),同时属性值不能是一个空字符串。
下例中的
value
属性通过不带引号的语法定义:<input value=yes>
如果一个用不带引号的语法定义的属性之后还有另一个属性,或者其后是一个在开始标签一节第6步中定义的可选的编码为U+002F的斜杠(/),则两者之间必须通过一个空格字符分隔。
- 单引号包含的语法
-
属性名称后跟随一个或多个空格字符,随后一个编码为U+003D的等号,随后一个或多个字符,之后一个编码为U+0027的单引号('),之后是属性的值,此时属性的值除了上文给出的限制之外,还不能包含编码为U+0027的单引号('),最后是一个编码为U+0027的单引号(')。
下例中的
type
属性通过单引号包含的语法定义:<input type='checkbox'>
如果一个由单引号包含的语法定义的属性之后还有另一个属性,则2个属性间必须通过一个空格字符分隔。
- 双引号包含的语法
-
属性名称后跟随一个或多个空格字符,随后一个编码为U+003D的等号,随后一个或多个字符,之后一个编码为U+0022的单引号(),之后是属性的值,此时属性的值除了上文给出的限制之外,还不能包含编码为U+0022的单引号("),最后是一个编码为U+0022的单引号(")。
下例中的
name
属性通过单引号包含的语法定义:<input name="be evil">
如果一个由双引号包含的语法定义的属性之后还有另一个属性,则2个属性间必须通过一个空格字符分隔。
一个开始标签上不得有2个或以上属性的名称在大小写不敏感的环境下相等。
如果一个外来元素含有一个带命名空间的属性,且该属性的本地名称和命名空间由下表的第1个和第2个单元格表示,则该属性必须用同一行中第3个单元格中给出的字符串作为属性名称。
本地名称 | 命名空间 | 属性名称 |
---|---|---|
actuate | XLink namespace | xlink:actuate |
arcrole | XLink namespace | xlink:arcrole |
href | XLink namespace | xlink:href |
role | XLink namespace | xlink:role |
show | XLink namespace | xlink:show |
title | XLink namespace | xlink:title |
type | XLink namespace | xlink:type |
base | XML namespace | xml:base |
lang | XML namespace | xml:lang |
space | XML namespace | xml:space |
xmlns | XMLNS namespace | xmlns |
xlink | XMLNS namespace | xmlns:xlink |
其他带命名空间的属性无法用HTML语法表示。
可选标签
某些标签可以被省略。
当一个元素的开始标签被省略时,不代码这个元素不存在,此时这个开始标签是隐式的,但依旧存在。一个HTML文档永远有一个作为根的html元素,即使字符串<html>没有出现在任何标记中。
html元素的开始标签可以省略,前提为第一个子节点不是注释。
html元素的结束标签可以省略,前提为元素之后没有紧随一个注释。
head元素的开始标签可以省略,前提为第一个子节点是一个元素。
head元素的结束标签可以省略,前提为元素之后没有紧随一个空格字符或者注释。
body元素的开始标签可以省略,前提为元素内容为空,或者内容的第一项不是一个空白字符或注释,同时内容的第一项不能是script或者style元素。
body元素的结束标签可以省略,前提为元素之后没有紧随一个注释。
li元素的结束标签可以省略,前提为该li元素之后紧随着另一个li元素,或者其父元素已经没有其他内容。
dt元素的结束标签可以省略,前提为该元素之后紧随着另一个dt元素或者一个dd元素。
dd元素的结束标签可以省略,前提为该元素之后紧随着另一个dd元素或者一个dt元素,或者其父元素已经没有其他内容。
p元素的结束标签可以省略,前提为该元素之后紧随着一个address、article、aside、blockquote、dir、div、dl、fieldset、footer、form、h1、 h2、 h3、 h4、 h5、 h6、 header、 hgroup、 hr、 menu、 nav、 ol、 p、 pre、 section、 table或ul元素,或者其父元素已经没有其他内容并且父元素不是一个a元素。
rt元素的结束标签可以省略,前提为该元素之后紧随着另一个rt元素或者一个rp元素,或者其父元素已经没有其他内容。
rp元素的结束标签可以省略,前提为该元素之后紧随着另一个rp元素或者一个rt元素,或者其父元素已经没有其他内容。
optgroup元素的结束标签可以省略,前提为该元素之后紧随着另一个optgroup元素,或者其父元素已经没有其他内容。
option元素的结束标签可以省略,前提为该元素之后紧随着另一个option元素或者一个optgroup元素,或者其父元素已经没有其他内容。
colgroup元素的开始标签可以省略,前提为其内容的第一项是一个col元素,并且要求该元素没有紧随着一个结束标签被省略了的colgroup元素(元素内容为空的情况下不能省略开始标签)。
colgroup元素的结束标签可以省略,前提为元素之后没有紧随一个空格字符或者注释。
thead元素的结束标签可以省略,前提为该元素之后紧随着一个tbody或者tfoot元素。
tbody元素的开始标签可以省略,前提为其内容的第一项是一个tr元素,并且要求该元素没有紧随着一个结束标签被省略了的tbody、thead或tfoot元素(元素内容为空的情况下不能省略开始标签)。
tbody元素的结束标签可以省略,前提为该元素之后紧随着一个tbody或者tfoot元素,或者其父元素已经没有其他内容。
tfoot元素的结束标签可以省略,前提为该元素之后紧随着一个tbody元素,或者其父元素已经没有其他内容。
tr元素的结束标签可以省略,前提为该元素之后紧随着另一个tr元素,或者其父元素已经没有其他内容。
td元素的结束标签可以省略,前提为该元素之后紧随着一个td或th元素,或者其父元素已经没有其他内容。
th元素的结束标签可以省略,前提为该元素之后紧随着一个td或th元素,或者其父元素已经没有其他内容。
但是如果开始标签内有属性,则开始标签不能省略。
内容模型限制
由于历史原因,某些特定元素在内容模型的限制之外,还有自身额外的限制。
table元素不能包含tr元素,虽然本标准描述的内容模型允许这么做(如果标记中有一个tr元素出现在table的子节点中,,事实上会导致一个隐式的tbody开始标签被创建出现)。
pre元素和textarea元素的开始标签之后可以紧随一个可选的换行符,这不会影响到对元素的处理。其他地方出现的换行都会指定元素的内容新起一行(否则换行都会被当作可选换行符处理,并且被忽略)。
以下2个pre块是等价的:
<pre>Hello</pre>
<pre>
Hello</pre>
原始文本与 RCDATA 元素内容限制
在原始文本和RCDATA元素中的文本中,不允许出现一个字符串"</"(编码为U+003C的小于号、U+002F的斜杠),该字符串后跟随着在大小写不敏感环境下与元素标签名相同的字符串,再之后跟随着一个编码为U+0009的TAB符号、U+000A的换行符、U+000C的换页符、U+000D的回车符、U+0020的空格、U+003E的大于符号(>)或U+002F的斜杠(/)。
文本
文本可以出现在元素、属性值和注释中。文本必须由Unicode字符组成。文本不得包含编码为U+0000的字符。文本不得包含Unicode永久未定义的字符(非字符)。文本不得包含除空格以外的控制字符。另外关于哪些内容可以或不可以出现在文本中,随着其所处的位置,会有额外的限制,在其他章节会详细阐述。
换行
在HTML中换行可以通过一个编码为U+000D的回车符,一个编码为U+000A的换行符,或者编码为U+000D的回车符和U+000A的配对表示。
当允许出现字符引用时,表示编码为U+000A的换行符(不包含编码为U+000D的回车符)的字符引用同样表示换行。
字符引用
在其他章节中的某些案例中有说到,文本可以和字符引用混合出现。这种方法可以用来转义在文本中不能合法出现的字符。
字符引用必须以一个编码为U+0026的于符号(&)作为起始,其后的字符引用有三种形式:
- 命名字符引用
- &符号之后必须跟随一个命名字符引用章节提供的名称,且大小写必须相符。命名必须以编码为U+003B的分号(;)结束。
- 十进制数字型字符引用
- &符号之后必须跟随一个编码为U+0023的井号(#),其后是一个或多个编码在U+0030数字0到U+0039数字9之间的数字,用于以十进制数字表示一个Unicode中,根据下文所述的定义所允许的编码。数字之后必须以编码为U+003B的分号(;)结束。
- 十六进制数字型字符引用
- &符号之后必须跟随一个编码为U+0023的井号(#),其后是一个编码为U+0078的小写字母X或者编码为U+0058的大写字母X,之后是一个或多个编码在U+0030数字0到U+0039数字9、U+0061小写字母A到U+0066小写字母F、U+0041大写字母A到U+0046大写字母F之间的字符,用于以十六进制数字表示一个Unicode中,根据下文所述的定义所允许的编码。数字之后必须以编码为U+003B的分号(;)结束。
上文所述的数字型字符引用可用来指定的Unicode编码需除去U+0000、U+000D以及永久未定义的Unicode字符(非字符)和空格以外的控制字符。
一个意义不明的&符号是指在一个编码为U+0026的&于符号(&)之后跟随了一个或多个编码范围在U+0030数字0到U+0039数字9、U+0061小写字母A到U+007A小写字母Z、U+0041大写字母A到U+005A大写字母Z之间的字符,后面又跟随了一个编码为U+003B的分号(;),且这些字符不和任何在命名字符引用章节中给出的名称匹配。
CDATA 段落
CDATA段落必须由以下部分有序组成:
- 字符串"<![CDATA["
- 可选的文本,且文本中不得出现字符串"]]>"
- 字符串"]]>"
CDATA段落只能在外来内容(MathML或SVG)中使用。如下示例中,CDATA段落用来转义ms元素中的内容
<p>You can add a string to a number, but this stringifies the number:</p>
<math>
<ms><![CDATA[x<y]]></ms>
<mo>+</mo>
<mn>3</mn>
<mo>=</mo>
<ms><![CDATA[x<y3]]></ms>
</math>
注释
注释必须以4个有序字符开始:编码为U+003C的小于号、U+0021的感叹号、U+0020的横线、U+0020的横线(<!--)。在此之后,注释内容可以包含文件,但文本中不可以出现编码为U+003E的大于号(>)、编码为U+002D的减号(-)加上U+003E的大于号(>)、连续2个编码为U+002D的减号(--),且文本不能以编码为U+002D的减号(-)结束。最后,注释必须以3个有序字符结束:编码为U+002D的减号、U+002D的减号、U+003E的大于号(-->)。