我问这个是因为我遇到了今天最奇怪的问题。显然有效的HTML文档无法正确呈现。
标记包含许多深层嵌套的<b>
标记。 Here's an example
似乎在~10级之后,浏览器会在最后的某处移动标签。 HTML验证器报告:
第82行,第24列:结束标记b违反了嵌套规则。
然后我得到一些关于杂散结束标记的错误,如果第一个错误确实有意义。但对我来说却没有。如果嵌套规则正确嵌套,它会违反哪些嵌套规则?
答案 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>
等),浏览器会将其从列表中删除它在解析过程中使用,可能会发生各种奇怪的事情。