嵌套某些HTML标签是否有限制?

时间:2013-11-25 22:58:11

标签: html5 markup nested

我问这个是因为我遇到了今天最奇怪的问题。显然有效的HTML文档无法正确呈现。

标记包含许多深层嵌套的<b>标记。 Here's an example

似乎在~10级之后,浏览器会在最后的某处移动标签。 HTML验证器报告:

  

第82行,第24列:结束标记b违反了嵌套规则。

然后我得到一些关于杂散结束标记的错误,如果第一个错误确实有意义。但对我来说却没有。如果嵌套规则正确嵌套,它会违反哪些嵌套规则?

2 个答案:

答案 0 :(得分:2)

深层嵌套<b>标签本身应该不是问题(除了语义The b element should be used as a last resort when no other element is more appropriate(参见W3C B Element)) - 例如,this demo shows quite deep nesting并验证细

...(24 levels deep)
<b>
<b>
    Deep nesting
</b>
</b>
... (24 levels deep)

但是,也许有一些限制 - 但比你想象的要远得多。

如果我在W3C验证器上验证您的文档,它会在第90行上抱怨结束标记。如果我删除了此标记的内容(测试不匹配),则验证正常。

如果我然后单独验证我删除的标记的内容(希望进一步缩小不匹配),这也令人惊讶地验证了。

如果我把两者放在一起,验证器就会失败,这表明W3C验证器有一个限制。

作为一个有趣的最终发现 - 如果您将其全部切换为<span>个元素(例如),它就会很好地验证 - as per this conversion

答案 1 :(得分:1)

答案在HTML5规范中:http://www.w3.org/TR/2014/REC-html5-20141028/syntax.html#push-onto-the-list-of-active-formatting-elements

它说:

如果在最后一个列表标记(如果有)或列表中的任何位置(如果没有列表标记)之后的活动格式设置元素列表中已有三个元素,则具有相同的标记名称,名称空间和属性作为元素,然后从活动格式元素列表中删除最早的此类元素。出于这些目的,必须比较属性由解析器创建时的属性;如果两个元素的所有已解析属性都可以配对,则每个元素中的两个属性具有相同的名称,名称空间和值(属性的顺序无关紧要),这两个元素具有相同的属性。

所以:如果您有三个以上嵌套的“活动格式元素”(例如<b><i><u>等),浏览器会将其从列表中删除它在解析过程中使用,可能会发生各种奇怪的事情。