你在谈论 HTML5 吗?由于此时该规范应该取代任何其他规范,因此我们将坚持下去。
我不会详细介绍每个单独的元素,但是如果您需要查找某些内容,请参考以下内容:
http://www.w3.org/TR/html5-author/
讨论“内容模型”的部分
元素预期内容的描述
在这里:http ://www.w3.org/TR/html5-author/content-models.html
您可以在特定元素的规范中看到一些示例:
http://www.w3.org/TR/html5-author/the-html-element.html#the-html-element(html
元素):
一个head
元素后跟一个body
元素。
具体例子
a
我们从第一个链接(在a
元素上)得知它的内容模型是透明的,但前提是没有交互式内容后代。
通过查看“透明”的定义,我们看到a
它从其父级继承其内容模型。这意味着您的初始定义不正确并且a
确实可以包含 a div
,但前提是其父级可以。上面的文档甚至包括嵌套“透明”内容模型元素的示例。
由于a
不能包含任何“交互内容”模型元素,它根本不能包含button
元素。这是有道理的,因为对于哪个元素主动响应点击会有冲突。
span
当我们查看第二个链接时span
,我们看到它的内容模型是“短语内容”,它基本上是段落级文本的文本和标记。该定义并不完全具体,但它确实包含一个指南:
大多数被归类为短语内容的元素只能包含本身被归类为短语内容的元素,而不是任何流内容。
由于div
没有“短语内容”模型(它是“流内容”),span
因此无法包含它。这意味着span
应该遵循上述规则,并且只包含任何其他“短语内容”元素和/或嵌入的内容或文本。如果上述规则被打破,它会在元素的“内容模型”描述中专门列出(请记住a
关于“交互内容”的元素的特殊规则。) span
没有。
br
第三个链接br
表示内容模型是“空的”。不幸的是,W3C 没有为此提供具体定义,但我认为这很明显:它根本不能包含后代。甚至没有文本节点。任何“空”内容模型元素都没有结束标记(您可以将其写为<br>
not as <br></br>
)。
你的问题
上面的规则准确吗?
第一条规则(内联与块)
你说的有误导性。HTML 没有inline
vs.block
元素的概念。这些是 CSS 样式。大多数浏览器都有一个元素display
样式的默认设置,inline
或者block
取决于它是分别是“短语”还是“流”内容模型(作为一般规则;没有什么硬性和快速性)或者只是传统的。
如果您想说“短语内容”元素不能包含“流内容”元素,那么您将是正确的,因为那是专门在规范中的。这实际上也有效,因为span
不能包含div
(如您所示)。
但是,说不a
应该包括任何div
内容是错误的。 a
可以包括div
只要它的父母可以。如果a
包含在 aspan
中,则不能包含div
。但是,如果a
包含在body
或其他div
中,它可以。
至于浏览器“宽容”,这对于许多不能花时间创建有效 HTML 的开发人员来说非常方便,但对于我们这些想要花时间的人来说可能是一种痛苦。浏览器通常不会像您所说的那样改变“HTML 结构”——它们改变的是 DOM。还有一点,网络供应商规范与我上面发布的“网络作者”规范有点不同,但我们是作者。
第二条规则(p
包含p
)
这是真的,因为我遗漏了一个重要的点:Context
.
从p
元素规范:
可以使用此元素的上下文:
预期流内容的位置。
由于p
是“短语内容”,这意味着p
不能将另一个放在 a 中,p
因为预期的是“短语内容”,而不是“流内容”。
还有其他规则吗?
HTML5 规范包含大量元素,因此我无法在此处详细介绍所有这些细节。我详细介绍了内容span
和a
内容div
,以及p
因为您特别提出了这些内容。看看这个答案有多长!
您需要做的是查看您对规范本身有疑问的任何元素。查看上下文和内容模型部分,看看您对元素的使用是否有效。
总之
当您对元素的工作方式有疑问时,请参阅规范。要回答有关如何使用元素(关于其容器和内容)的问题,请查看:
这告诉你什么可以包含元素,它可以包含什么,以及何时。
如果您对您的 HTML 是否有效有疑问,您可以随时使用非常好的 W3C 标记验证服务:
http://validator.w3.org/
如果您使用的是 Chrome,您可以查看 Chrome Inspector (F12) 并将输出 DOM 与源 HTML 本身进行比较。例如,您会注意到 Chromep
在生成 DOM 时会自动关闭嵌套标签。