(非无效)自动关闭标记在HTML5中有效吗?


668

W3C验证不喜欢自闭标签(那些最终以“ />上“)非空元素。(无效元素是可能永远不包含任何内容的元素。)它们在HTML5中仍然有效吗?

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

<br />
<img src="" />
<input type="text" name="username" />

被拒绝的非空元素的一些示例:

<div id="myDiv" />
<span id="mySpan" />
<textarea id="someTextMessage" />

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


2
@本:哦,对不起,我认为你是对的。在这种情况下,我误解了最初的问题,我以为OP想要知道自闭合标签在HTML5中是否完全有效。但这意味着他只是在代码中打了错字,或者他不知道如何适当地写自闭标签,这使W3C验证器将他的代码标记为无效是有意义的。
Sk8erPeter

16
为了节省以后的读者的时间:是的,问题的语法不正确,否则,您不应更改它。OP已明确并合理地解释了原因。由于它引起提示此问题的验证错误,因此不应更正语法。
乔丹·格雷

2
你们还在为斜线应该面对的方向而斗争吗?来吧。
BoltClock

3
@BoltClock是的,仍在战斗。伙计们:如果这个问题是关于的\>,那么应该把它作为一个无用的“修正我的打字错误”问题来解决。答案全部解决/>。该/>版本是唯一有用的版本。随它去。
吉尔斯(Gilles)'“ SO-不要邪恶”

1
然后必须重新措辞该问题,因为W3C验证程序实际上接受自动关闭标签。在不损害其相对于原始意图的完整性的情况下,很难以这种方式重新表述该问题。因此,如果我们想要遵守SO的规则,那么可能就不得不在诸如此类的问题上牺牲清晰度,即使为了更好地处理问题,似乎编辑问题是唯一明智的选择。平均。如果还有其他类似问题,我们可以开始对meta的另一讨论。
osa 2015年

Answers:


1238
  • HTML 4中<foo /(是,完全没有>)意味着<foo>(导致<br />含义<br>>(即<br>&gt;)和<title/hello/意义<title>hello</title>)。这是一条SGML规则,浏览器在支持方面做得很差,并且该规范建议作者避免使用语法

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

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

    • 在指定为void元素的 HTML元素上(本质上是“在HTML5之前存在并且被禁止包含任何内容的元素”),最终标签被简单地禁止了。开始标记末尾的斜杠是允许的,但没有任何意义。对于那些沉迷于XML的人(和语法突出显示)来说,它只是语法糖。
    • 在其他HTML元素上,斜杠是一个错误,但是错误恢复将导致浏览器将其忽略,并将该标记视为常规的开始标记。这通常会导致缺少结束标记,从而导致后续元素成为子元素而不是兄弟元素。
    • 外部元素(从SVG等XML应用程序导入)将其视为自动关闭语法。

24
……对XML着迷的人。 ” 您似乎暗示XML合规性不好。但是,HTML5的最终结果似乎是,无论如何,我们仍然必须处理尖括号(即XML的大多数不便之处),同时使使用基于XML的工具(例如模板工具或各种处理器)更加困难)。即使从一代来看,它似乎<object data="..." /><img src="..."></src>没有确定,而<object data="..."></object><img src="..." />是,这使得它更难工具的一致性。这看起来像是输了。
布鲁诺

7
@Bruno-HTML早于XML。使人们转向XHTML的努力失败了。使用时text/html,浏览器不会对斜杠赋予任何特殊含义,因此将其包括在内没有任何实际用途。对于那些无法摆脱习惯的人来说,它只是使它看起来更像XML。
Quentin

6
@昆汀我并不完全不同意。我只是觉得有点遗憾的是有效的XML等效不一定有效HTML5(如<img ...></img>代替<img ...><img ... />)。由于HTML5总体上没有那么严格(可能是XHTML失败的原因),所以它很可能可以容忍<img ...></img>。不幸的是,事实并非如此,因此基于XML的模板生成器需要知道如何区分void元素或自闭合元素的产生:您甚至没有一条规则可以将所有空元素都写为<tag></tag>
2014年

3
XHTML失败之前HTML 5甚至在地平线上,你不能早已形成,因为早XHTML会做这样的事情处理浏览器纠错空元素</br>作为<br>这样<br></br>会是一个双行。(与现实世界中不良标记(如</br>)的向后兼容性是HTML 5的设计目标之一)。
昆汀2014年

1
从W3C:无效元素:区域,基,br,col,嵌入,hr,img,输入,keygen,链接,meta,param,源,轨道,wbr“无效元素只有一个开始标签;不得指定结束标签用于无效元素。” w3.org/TR/html5/syntax.html#void-elements
Fabio Nolasco 2015年

406

正如Nikita Skvortsov所指出的,自关闭div不会生效。这是因为div是普通元素,而不是void元素

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

area, base, br, col, embed, hr, img, input, 
keygen, link, meta, param, source, track, wbr

在上面的标记中,“ /”是完全可选的,因此<img/>与并无区别<img>,但<img></img>无效。

*注意:外部元素也可以自动关闭,但我认为此答案不在此范围内。


1
IE10的开发人员工具给我“ HTML1500:标记不能自动关闭。请使用显式关闭标记。” 在<meta charset =“ UTF-8” />行上,为什么会这样呢?
印第

好的,我发现自闭标签不应该带有斜杠(删除它可以解决我的错误)。引用:tiffanybbrown.com/2011/03/23/…–
詹姆斯in Indy

规格已更改。现在,“无效”或“自闭”的元素应该包括斜线,当如HTML 5 DOCTYPE服务。但是,如果将其用作XHTML,则可能需要使用斜杠(在这种情况下,请检查文档)。在实际使用中,即使/包括了结束符,页面也通常会按预期显示,但是这种情况是没有保证的(它取决于浏览器是否有效地为您重新编写代码,并按您的预期进行解释。)由于某些原因,您的页面需要通过HTML 5验证,如果您关闭void元素的标签,则该页面可能不会通过。
SherylHohman

关于@SherylHohman的评论,我不认为该规范已更改(或者,如果已更改,则已更改)。请参阅w3.org/TR/html5/syntax.html#start-tags(8.1.2.1.6)-void(或外部)元素可能仍包含斜杠。
克里斯·C

63

在实践中,在HTML中使用自动关闭标签应该可以按预期工作。但是如果您担心写作有效 HTML5,则应该了解此类标记的使用在两种可以使用的两种语法形式中的行为方式。HTML5定义了HTML语法和XHTML语法,它们相似但不相同。使用哪一种取决于Web服务器发送的媒体类型。

您的网页很有可能以的形式使用text/html,它遵循更宽松的HTML语法。在这些情况下,HTML5允许某些开始标记在终止>之前具有可选的/。在这些情况下,/是可选的并且被忽略,因此<hr><hr />相同。HTML规范将这些称为“无效元素”,并给出有效列表。严格来说,可选的/只在这些void元素的开始标记内有效;例如,<br />并且<hr />是有效的HTML5,但<p />不是。

HTML5规范对HTML作者和Web浏览器开发人员的正确选择进行了明确区分,第二组要求接受所有无效的“旧版”语法。在这种情况下,这意味着符合HTML5的浏览器将接受非法的自关闭标签(例如)<p />,并按您期望的方式呈现它们。但是对于作者而言,该页面不是有效的HTML5。(更重要的是,DOM树您使用这种非法语法的获得可以认真搞砸了;自我封闭的<span />标签,例如,倾向于把事情搞得一团糟了很多)。

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


31
<p />将被视为开始标签,而不是自闭合标签。这意味着文档的其余部分将被视为位于P元素内。那不是我“可能期望的”,并且会在任何不重要的页面上造成严重的混乱。
mhsmith

12

HTML5的行为基本上就像没有尾部斜杠一样。HTML5语法中没有自动关闭标记之类的东西。

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

    不管斜杠前面是否有空格,这都是正确的:出于相同的原因<p />,它<div />也不起作用。

  • void元素上的自闭合标签类似于<br/><img src="" alt=""/> 起作用,但这仅是因为尾部的斜杠被忽略了,在这种情况下碰巧会导致正确的行为。

结果是,在旧的“ XHTML 1.0用作text / html”中工作的所有内容都将像以前一样继续工作:非空标记的尾部斜杠在此处也不被接受,而void元素的尾部斜杠也可以工作。

还有一点需要注意:可以将HTML5文档表示为XML,有时也称为“ XHTML 5.0”。在这种情况下,将应用XML规则,并且将始终处理自闭合标签。它总是需要与XML mime类型一起提供。


4

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

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


12
根据HTML5规范,自闭语法(/>)不能用于非无效HTML元素。
naXa

2
问题是关于非空元素(例如<p/>或)上的自闭合标签<div/>
thomasrutter

2
最初,问题不是专门针对非空元素。更像是,您仍可以<... />像在XHTML中一样使用它,还是必须/在HTML5中删除它。之后,该问题被多次更改。
尼克

无论哪种方式,答案都是斜线将被忽略,这将破坏未声明为void的元素,但将与void元素兼容。
thomasrutter

4

如本例所示,我将非常注意使用自动关闭标签:

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

我的直觉会一直<span></span><span></span>代替


2
在接受的答案中对此进行了描述:On other [than void] HTML elements, the slash is an error, but error recovery will cause browsers to ignore it and treat the tag as a regular start tag. This will usually end up with a missing end tag causing subsequent elements to be children instead of siblings.
Palec

-1

但是-仅作记录-这是无效的:

<address class="vcard">
  <svg viewBox="0 0 800 400">
    <rect width="800" height="400" fill="#000">
  </svg>
</address>

这里的斜线将使其再次有效:

    <rect width="800" height="400" fill="#000"/>

1
那是因为svg是用xml而不是html编写的。它使用不同的解析规则
电动咖啡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.