Are (non-void) self-closing tags valid in HTML5?
W3C验证器不喜欢非void元素上的自闭标签(以"
可接受的void元素的一些示例:
1 2 3 | <br /> <img src="" /> <input type="text" name="username" /> |
被拒绝的非空元素的一些例子:
1 2 | <span id="mySpan" /> <textarea id="someTextMessage" /> |
注意:W3C验证器实际上接受无效的自动关闭标签:由于简单的拼写错误(
-
在HTML 4中,
(是的,完全没有 > )意味着 (这导致 意味着> (即> )并且意味着 hello )。这是一个SGML规则,浏览器的支持工作非常糟糕,规范建议作者避免使用语法。 -
在XHTML中,
表示 。这是适用于所有XML文档的XML规则。也就是说,XHT??ML通常用作text/html (历史上至少)由浏览器使用与用作application/xhtml+xml 的文档不同的解析器进行处理。 W3C为XHTML提供了遵循text/html 的兼容性指南。 (基本上:当元素定义为EMPTY时,仅使用自动关闭标记语法(并且HTML规范中禁止结束标记))。 -
在HTML5中,
的含义取决于元素的类型。- 在指定为void元素的HTML元素上(实质上是"在HTML5之前存在且禁止包含任何内容的元素"),仅禁止结束标记。允许使用开始标记末尾的斜杠,但没有任何意义。它只是沉迷于XML的人(和语法荧光笔)的语法糖。
- 在其他HTML元素上,斜杠是一个错误,但错误恢复将导致浏览器忽略它并将标记视为常规开始标记。这通常会以缺少结束标记结束,导致后续元素成为子元素而不是兄弟元素。
- 外部元素(从SVG等XML应用程序导入)将其视为自动关闭语法。
正如Nikita Skvortsov所指出的那样,一个自我关闭的div将无法验证。这是因为div是普通元素,而不是void元素。
根据HTML5规范,不能包含任何内容的标签(称为void元素)可以自动关闭*。这包括以下标记:
1 2 | area, base, br, col, embed, hr, img, input, keygen, link, meta, param, source, track, wbr |
但是,"/"在上述标签上是完全可选的,因此
*注意:外国元素也可以自我关闭,但我不认为这是答案的范围。
实际上,在HTML中使用自闭标签应该像您期望的那样工作。但是,如果您担心编写有效的HTML5,您应该了解这些标记的使用在您可以使用的两种不同的两种语法形式中的行为。 HTML5定义了HTML语法和XHTML语法,它们相似但不相同。使用哪一个取决于Web服务器发送的媒体类型。
很可能,您的页面将作为
是相同的。 HTML规范称这些"void elements",并给出一个有效的列表。严格地说,可选/仅在这些void元素的开始标记内有效;例如,
HTML5规范明确区分了HTML作者和Web浏览器开发人员的正确性,第二组需要接受各种无效的"遗留"语法。在这种情况下,这意味着符合HTML5的浏览器将接受非法的自闭标签,如
(在不常见的情况下,您的服务器知道如何将XHTML文件作为XML MIME类型发送,该页面需要符合XHTML DTD和XML语法。这意味着对于那些定义的元素,需要自动关闭标记。)
HTML5的行为基本上就像没有尾随斜杠一样。在HTML5语法中没有自闭标签这样的东西。
-
非空元素(如
,)上的自闭标签根本不起作用。尾部斜杠将被忽略,这些将被视为开始标记。这可能会导致嵌套问题。 无论斜杠前面是否有空格,都是如此:
和也不会出于同样的原因。 -
像
或这样的void元素上的自闭标签可以工作,但这只是因为忽略了尾部斜杠,在这种情况下恰好会导致正确的行为。
结果是,在旧的"XHTML 1.0作为text / html"中起作用的任何东西都将继续像以前一样工作:在非void标签上的尾部斜杠也不会被接受,而void元素上的尾部斜杠工作。
还有一点需要注意:可以将HTML5文档表示为XML,这有时被称为"XHTML 5.0"。在这种情况下,XML的规则适用,并且将始终处理自动关闭标签。总是需要使用XML mime类型。
自闭标签在HTML5中有效,但不是必需的。
我会非常小心自闭项标签,如下例所示:
1 2 3 4 | var a = '<span/><span/>'; var d = document.createElement('div'); d.innerHTML = a console.log(d.innerHTML) //"<span><span></span></span>" |
我的直觉本来是
但是 - 只是为了记录 - 这是无效的:
1 2 3 4 | <svg viewBox="0 0 800 400"> <rect width="800" height="400" fill="#000"> </svg> </address> |
这里的斜线会使它再次有效:
1 | <rect width="800" height="400" fill="#000"/> |