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

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

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


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

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


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


评论

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

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

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

@BoltClock是的,仍在战斗。伙计们:如果这个问题是关于\>的,那么应该把它作为一个无用的“修正我的类型”问题来关闭。答案全部为/>。 />版本是唯一有用的版本。随它吧。

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

#1 楼


在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提供了x4312079q的XHTML兼容性指南。 (本质上:仅当元素定义为EMPTY时才使用自闭标签语法(并且HTML规范中禁止使用结束标签)。)

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




评论


“……迷恋XML的人。”。您似乎暗示XML合规性不好。但是,HTML5的最终结果似乎是,无论如何我们仍然必须处理尖括号(即XML的大多数不便之处),同时使使用基于XML的工具(例如模板工具或各种处理器)更加困难)。即使从世代的角度来看,似乎 都不行,而 是,这使得工具一致性变得更加困难。这看起来像是输了。

–布鲁诺
14-10-23在15:48

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

–昆汀
14-10-23在15:51

@昆汀我并不完全不同意。我只是感到遗憾的是,等效的XML不一定是有效的HTML5(例如 而不是)。由于HTML5通常不太严格(可能是XHTML失败的原因),因此它很可能容忍了 之类的东西。不幸的是,事实并非如此,因此基于XML的模板生成器需要知道如何区分void元素或自闭合元素的产生:您甚至没有一条规则可以将所有空元素写为 < / tag>。

–布鲁诺
14-10-23在16:06

XHTML在HTML 5尚未出现之前就失败了,并且您不能使用长形式的空元素,因为早于XHTML的浏览器错误纠正会像将
视为
一样使

双线休息。 (与现实世界中不良标记(如
)的向后兼容性是HTML 5的设计目标之一)。

–昆汀
14-10-23在16:11



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

–法比奥·诺拉斯科(Fabio Nolasco)
15年4月28日在18:29



#2 楼

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

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

*注意:外部元素也可以是自动闭合的,但我认为这不是此答案的范围。

评论


IE10的开发人员工具给我“ HTML1500:标记不能自动关闭。请使用显式关闭标记。”在行上,为什么会这样呢?

–印第詹姆斯(James in Indy)
13-10-14在11:54



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

–印第詹姆斯(James in Indy)
13-10-14在12:11

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

– SherylHohman
19年1月28日在23:47



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

– ChristC
19年2月25日在10:43

#3 楼

在实践中,在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语法。这意味着定义此类元素需要自闭标签。)

评论


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

–mhsmith
13年5月20日在17:09


#4 楼

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


非空元素(例如<p/><div/>)上的自动关闭标签根本无法使用。尾部的斜杠将被忽略,这些将被视为开始标记。这很可能导致嵌套问题。
不管斜杠前面是否有空格,这都是正确的:<p /><div />出于相同的原因也无法工作。


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


结果是,在旧的“ XHTML 1.0用作text / html”中工作的所有内容都将像以前一样继续工作:非空标记的尾部斜杠在那儿也不被接受,而void元素的尾部斜杠也可以工作。
另外一个注意事项:可以将HTML5文档表示为XML,有时也称为“ XHTML 5.0”。在这种情况下,将应用XML规则,并且将始终处理自闭合标签。它总是需要与XML mime类型一起提供。

#5 楼

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

<br><br />都可以。

评论


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

– naXa
15年7月30日在12:20

问题是关于非空元素(例如

)上的自闭合标签。

–胸骨
16-6-28在6:06



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

–尼克
17年9月20日在8:37

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

–胸骨
19年7月10日在1:31

#6 楼

我将非常小心使用自闭合标签,如本例所示:

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


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

评论


可接受的答案对此进行了描述:在其他[void] HTML元素上,斜杠是错误,但是错误恢复将导致浏览器将其忽略,并将该标记视为常规的开始标记。这通常会导致缺少结束标记,导致后续元素成为子元素而不是兄弟元素。

– Palec
17年5月20日在19:40

#7 楼

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

<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"/>


评论


这是因为svg是用xml而不是html编写的。它使用不同的解析规则

–电动咖啡
19年8月20日在6:19

最近发表