HTML5 是否允许在标题(如 h1)内使用 block-level 元素(如 div)?

Does HTML5 allow a block-level element (like div) inside a heading (like h1)?

我总是会说不,但后来我从 Semantic UI (and Fomantic UI) 中看到这段代码,一个非常流行的 front-end 框架:

<h2 class="ui icon header">
  <i class="settings icon"></i>
  <div class="content">
    Account Settings
    <div class="sub header">Manage your account settings and set e-mail preferences.</div>
  </div>
</h2>

代码让我觉得不寻常有两个原因:(1) <i> 标签已被重新用作图标的通用挂钩,以及 (2) 嵌套的 <div> 就在右边在 <h2> 元素里面。我质疑第一个的语义,以及第二个的有效性。

现在我想该代码在所有主要浏览器中都可以工作,否则他们不会使用它,但它看起来并不符合习惯。更重要的是,它是否有效?


注意:我在问题中使用了术语'block-level element'(每个人都理解),但正如MDN docs指出的那样:

The distinction of block-level vs. inline elements was used in HTML specifications up to 4.01. In HTML5, this binary distinction is replaced with a more complex set of content categories. While the "inline" category roughly corresponds to the category of phrasing content, the "block-level" category doesn't directly correspond to any HTML5 content category, but "block-level" and "inline" elements combined together correspond to the flow content in HTML5.

这是令人讨厌的代码,完全不符合规范。在 h2 中,您只能有 内联元素 短语内容元素 ,例如 spanstrongem, 等等。 <i> 标签通常用于图标,所以这没什么好惊讶的。但是 div ...?糟糕到令人震惊。将它们切换为 <span>,代码将有效。

这是关于 h1、h2 等可以包含的内容的官方规范。所谓“措辞内容”:https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#phrasing_content

编辑:MDN 不是官方规范,正如评论中的原始发布者所指出的那样。但是,它基于官方规范。 HTML 上的权威来源据说是 Web 超文本应用技术工作组 (WHATWG) 的 HTML 生活标准。他们提供了关于 phrasing content and headings (h1-h6) 的有用信息。

HTML 源自 SGML,旨在标准化纸质文档的布局。按照这个逻辑,H1到H6标签是为不同级别的标题做的,所以简单的说一个标题就是一种广告,一定要简短。

因此,H标签原则上不应包含层级信息。

此外,div 标记在 SGML 中不存在,在早期的 HTML 版本中也不存在。 DIV 标签是微软为了取代 LAYER 标签而制作的,这是许多旨在淘汰除 IE 之外的其他浏览器的策略的结果。这个故事是众所周知的,微软也因为其中的几个事实而受到谴责。

根据 HTML5 规范,它是无效的...但是很多 UI 库不遵循这种严格的语义方式,甚至 Google 正在使用 <center> 在其主页中使用 HTML5 Doctype 标记。所以这不是“必须”,也许只是“应该”......遵循规范是一个很好的做法,但开发人员不应该为此付出太多努力。

此外,检查 html 标记的有效性是一种 google 做法,检查下面的 link... https://validator.w3.org/nu/#textarea