(非空)自动关闭标签在HTML5中有效吗?

cde*_*zaq 635 html syntax w3c-validation

W3C验证不喜欢自闭合标签(那些与"端/>")上非空元素.(Void元素是那些可能不包含任何内容的元素.)它们在HTML5中仍然有效吗?

可接受的 void元素的一些示例:

<br />
<img src="" />
<input type="text" name="username" />
Run Code Online (Sandbox Code Playgroud)

被拒绝的非虚元素的一些例子:

<div id="myDiv" />
<span id="mySpan" />
<textarea id="someTextMessage" />
Run Code Online (Sandbox Code Playgroud)

注意: W3C验证器实际上接受无效的自动关闭标签:由于简单的拼写错误(\>而不是/>),作者最初遇到了问题.但是,自动关闭标签在HTML5中通常不是100%有效,并且答案详细说明了各种HTML风格的自闭标签问题.

Que*_*tin 1209

  • HTML 4中,<foo /(是的,完全没有>)意味着<foo>(这导致<br />意义<br>>(即<br>&gt;)和<title/hello/含义<title>hello</title>).这是一个SGML规则,浏览器的支持工作非常糟糕,规范建议作者避免使用语法.

  • XHTML中,<foo />意思是<foo></foo>.这是适用于所有XML文档的XML规则.也就是说,XHT​​ML通常text/html用于(历史上至少)由浏览器使用与提供的文档不同的解析器来处理application/xhtml+xml.W3C 为XHTML 提供了兼容性指南text/html.(基本上:当元素定义为EMPTY时,仅使用自动关闭标记语法(并且HTML规范中禁止结束标记)).

  • HTML5中,含义<foo /> 取决于元素的类型.

    • 在指定为void元素的 HTML元素上(实质上是"在HTML5之前存在且禁止包含任何内容的元素"),仅禁止结束标记.允许使用开始标记末尾的斜杠,但没有任何意义.它只是沉迷于XML的人(和语法荧光笔)的语法糖.
    • 在其他HTML元素上,斜杠是一个错误,但错误恢复将导致浏览器忽略它并将标记视为常规开始标记.这通常会以缺少结束标记结束,导致后续元素成为子元素而不是兄弟元素.
    • 外部元素(从SVG等XML应用程序导入)将其视为自动关闭语法.

  • "*......谁沉迷于XML.*".您似乎认为XML合规性很差.然而,HTML5的最终结果似乎是我们仍然必须处理有角度的括号(即具有XML的大多数不便之处),同时它使得使用基于XML的工具(例如模板工具或各种处理器)变得更加困难).即使从代的角度来看,似乎`<object data ="..."/>`和`<img rel="nofollow noreferrer" src ="..."> </ src>`也不行,而`<object data ="..."> </ object>`和`<img rel="nofollow noreferrer" src ="..."/>`,这使得工具一致性变得更难.这看起来像是双输局面. (21认同)
  • “在其他 HTML 元素上,斜杠是一个错误,但错误恢复将导致浏览器忽略它并将该标记视为常规开始标记。这通常会导致缺少结束标记,导致后续元素成为子元素而不是同级元素”。啊,所以这就是为什么我花了 5 个小时的时间来剖析我的 HTML 和 CSS 到它们的原子,以找到一个简单的语法问题,这个问题可以在两秒钟内在控制台中调用出来......我要回到 C (╯°□°)╯︵┻━┻ (8认同)
  • @Quentin我并不完全不同意.我觉得有点遗憾,有效的XML等价物不一定是有效的HTML5(例如`<img rel="nofollow noreferrer" ...> </ img>`而不是`<img rel="nofollow noreferrer" ...>`或`<img rel="nofollow noreferrer" .. ./>`).由于HTML5通常不那么严格(可能是XHTML失败的原因),它很可能容忍像`<img rel="nofollow noreferrer" ...> </ img>`这样的东西.不幸的是,它没有,所以基于XML的模板生成器需要知道如何区分void元素或自闭元素的生成:你甚至不能有一个规则来说所有空元素都写为`<tag> </标签>`. (5认同)
  • @Bruno - HTML早于XML.让人们转向XHTML的努力失败了.使用`text/html`,浏览器不会对斜杠赋予任何特殊含义,因此包含它没有任何实际意义.它只是让那些无法摆脱习惯的人看起来更像XML. (4认同)
  • XHTML在HTML 5即将到来之前就失败了,你不能拥有长形式的空元素,因为早于XHTML的浏览器错误修正就会把`</ br>`视为```所以`` </ br>`这将是一个双线休息.(向后兼容现实世界的坏标记(如`</ br>`)是HTML 5)的设计目标之一. (3认同)
  • @Aaron Franke:有效的 XHTML 不仅仅是 &lt;br /&gt;。大多数作者实际上并不关心是否有 100% 多语言标记,因为他们几乎从不需要服务 application/xhtml+xml,他们只关心他们的标签是自封闭的,并且引用了他们的属性,这不服务于除了他们自己之外的任何人。任何其他从事标记工作的人(可读性、可维护性,对于那些不熟悉可选标签的人)。 (3认同)
  • FROM W3C:Void 元素:area、base、br、col、embed、hr、img、input、keygen、link、meta、param、source、track、wbr “Void 元素仅具有开始标记;不得指定结束标记对于空元素。” http://www.w3.org/TR/html5/syntax.html#void-elements (2认同)
  • 使用`&lt;br /&gt;`有什么实际的缺点吗?为什么我不希望我的 HTML 文档也是有效的 XML? (2认同)

Red*_*rca 394

正如Nikita Skvortsov所指出的那样,一个自我关闭的div将无法验证.这是因为div是普通元素,而不是void元素.

根据HTML5规范,不能包含任何内容的标签(称为void元素)可以自动关闭*.这包括以下标记:

area, base, br, col, embed, hr, img, input, 
keygen, link, meta, param, source, track, wbr
Run Code Online (Sandbox Code Playgroud)

"/"在上述标签上是完全可选的,但是,<img/>它没有区别<img>,但是<img></img>无效.

*注意:外国元素也可以自我关闭,但我不认为这是答案的范围.

  • 关于@SherylHohman 的评论,我不认为规范已经改变(或者如果改变了,它又变回来了)。请参阅 https://www.w3.org/TR/html5/syntax.html#start-tags (8.1.2.1.6) - void(或外来)元素仍可能包含斜杠。 (2认同)

Mic*_*eld 62

实际上,在HTML中使用自闭标签应该像您期望的那样工作.但是如果您担心编写有效的 HTML5,您应该了解这些标记的使用在您可以使用的两种不同的两种语法形式中的行为.HTML5定义了HTML语法和XHTML语法,它们相似但不相同.使用哪一个取决于Web服务器发送的媒体类型.

更有可能的是,您的页面将被用作text/html,它遵循更宽松的HTML语法.在这些情况下,HTML5允许某些开始标记在其终止之前具有可选/.在这些情况下,/是可选的并被忽略,因此<hr>并且<hr />是相同的.HTML规范称这些"void elements",并给出一个有效的列表.严格地说,可选/仅在这些void元素的开始标记内有效; 例如,<br />并且<hr />是有效的HTML5,但<p />不是.

HTML5规范明确区分了HTML作者和Web浏览器开发人员的正确性,第二组需要接受各种无效的"遗留"语法.在这种情况下,这意味着符合HTML5的浏览器将接受非法的自闭标签<p />,并按照您的预期呈现它们.但对于作者来说,该页面不是有效的HTML5.(更重要的是,使用这种非法语法得到的DOM树可能会被严重搞砸; <span />例如,自闭标签往往会弄乱很多东西).

(在不常见的情况下,您的服务器知道如何将XHTML文件作为XML MIME类型发送,该页面需要符合XHTML DTD和XML语法.这意味着对于那些定义的元素,需要自动关闭标记.)

  • <p />将被视为开始标记,而不是自封闭标记.这意味着文档的整个剩余部分将被视为在P元素内.这不是我"可能期望的",并且会在任何非平凡的页面上产生严重的混乱. (30认同)
  • “实际上,在 HTML 中使用自闭合标签应该会像您期望的那样工作”:`&lt;a name="foo" /&gt;` 就是一个很好的例子,说明了它并非如此。您将把以下文本变成链接,而不是锚点。对于 `&lt;A&gt;` 标签,不要使用自关闭语法非常重要 (2认同)

tho*_*ter 10

HTML5的行为基本上就像没有尾随斜杠一样.在HTML5语法中没有自闭标签这样的东西.

  • 在自闭的标签非空元素,比如<p/>,<div/>将无法工作.尾部斜杠将被忽略,这些将被视为开始标记.这可能会导致嵌套问题.

    无论斜线前面是否有空格,都是如此:<p />并且<div />由于同样的原因也不起作用.

  • void元素上的自闭合标记起作用<br/>或者<img src="" alt=""/> 起作用,但这只是因为忽略了尾部斜杠,并且在这种情况下恰好会导致正确的行为.

结果是,在旧的"XHTML 1.0作为text/html"中起作用的任何东西都将继续像以前一样工作:在非void标签上的尾部斜杠也不会被接受,而void元素上的尾部斜杠工作.

还有一点需要注意:可以将HTML5文档表示为XML,这有时被称为"XHTML 5.0".在这种情况下,XML的规则适用,并且将始终处理自动关闭标签.总是需要使用XML mime类型.


Nic*_*ick 5

自闭合标签在 HTML5 中有效,但不是必需的。

<br>并且<br />都很好。

  • 根据 HTML5 规范,自闭合语法 (`/&gt;`) 不能用于非空 HTML 元素。 (13认同)
  • 问题是关于 **non-void 元素** 上的自闭合标签,例如 `&lt;p/&gt;` 或 `&lt;div/&gt;`。 (3认同)
  • 最初的问题并不是专门针对非空元素。更像是,您是否仍然可以像在 XHTML 中一样使用 `&lt;... /&gt;`,或者您是否必须删除 HTML5 中的 `/`。之后问题被多次更改。 (2认同)

And*_*erd 5

正如此示例所示,我会非常小心使用自关闭标签:

var a = '<span/><span/>';
var d = document.createElement('div');
d.innerHTML = a
console.log(d.innerHTML) // "<span><span></span></span>"
Run Code Online (Sandbox Code Playgroud)

我的直觉会<span></span><span></span>改为

  • 这在已接受的答案中有描述:`在其他 [void] HTML 元素上,斜杠是一个错误,但错误恢复将导致浏览器忽略它并将该标记视为常规开始标记。这通常会导致缺少结束标签,导致后续元素成为子元素而不是兄弟元素。` (2认同)