假设我们有这个标记:
<ul>
<li>
<span></span>
</li>
</ul>
- li 是 ul 的 child 和后代
- span 是 li 的 child 和后代
- span 是 ul 的后代
阅读specifications for ul我们有:
Content model:
Zero or more li and script-supporting elements.
内容模型的语义部分说,(强调我的):
Content model
A normative description of what content must be included as
children and descendants of the element.
我肯定是想错了,但我无法计算两者。因为 span 不是“零个或多个 li 元素” 的一部分,它是 ul 的后代。
如果规范说:“关于必须包含哪些内容作为元素的子元素的规范描述。”我会明白,但这可能会与规范的其他部分冲突。 p>
我的问题是如何解释这一点。
添加更多上下文。 ul 只能有 li 作为 child 。但是从上面的内容来看,如果一个人忘记了关于 HTML 等的所有知识,我会将其解释为以下两种情况之一:
- 它必须有零个或多个 li 元素,但也可以有任何其他元素,或者
- 只能有 li 个元素作为子元素和后代元素。
通过 “零个或多个”,后者更强大。
最佳答案
引用的描述来自 3.2.3 元素定义,相当松散甚至具有误导性。下一部分,3.2.4 内容模型,描述了内容模型的真正含义:“本规范中定义的每个元素都有一个内容模型:对元素预期内容的描述。 HTML 元素的内容必须符合元素内容模型中描述的要求。元素的内容是它在 DOM 中的子元素,模板元素除外,其中的子元素是模板内容中的元素。
因此,内容模型指定了允许的和必需的内容(虽然不是所有元素都有必需的内容),就子节点而言,这意味着子节点。这包括(如适用)元素子节点和文本节点子节点(例如,某些元素仅允许文本作为内容)。
这意味着一个 ul
元素可能只有 li
和 script
元素作为 child 。 li
元素有自己的内容模型,这是相当宽松的。没有必填内容;甚至 <ul></ul>
在 HTML5 中是允许的。
关于html - HTML 规范中的后代和内容模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22022469/