据我所知,这是正确的:
<div> <p>some words</p> </div>
但这是错误的:
<p> <div>some words</div> </p>
第一个可以通过 W3C 验证器(XHTML 1.0) ,但是第二个不能。我知道没有人会像第二个那样编写代码。我只想知道为什么。
那其他标签的包容关系呢?
因为 div标记的优先级高于 p标记。p标记表示段落标记,而 div标记表示文档标记。
div
p
你可以在一个文档标签中写很多段落,但是你不能在一个段落中写一个文档。和 DOC 文件一样。
简而言之,不可能在 DOM 中的 <p>中放置 <div>元素,因为打开的 <div>标记将自动关闭 <p>元素。
<p>
<div>
寻找允许的包含关系的权威场所是 HTML 规范。比如说 http://www.w3.org/TR/html4/sgml/dtd.html。它指定哪些元素是块元素,哪些是内联元素。对于这些列表,搜索标记为“ HTML 内容模型”的部分。
对于 P 元素,它指定以下内容,这表明 P 元素只允许包含内联元素。
<!ELEMENT P - O (%inline;)* -- paragraph -->
这与 http://www.w3.org/TR/html401/struct/text.html#h-9.3.1一致,即 P 元素“不能包含块级元素(包括 P 本身)”
在 X HTML 之后,约定已经改变了,现在它是 XML 和 HTML 约定的混合体,所以这就是为什么第二种方法是错误的,W3C 验证器接受根据标准和约定正确的事情。
根据 HTML5,div元素的 内容模型是 流量含量
文档和应用程序主体中使用的大多数元素都归类为流内容。
这包括 p元素,其中 只能使用的 流量含量是预期的。
因此,div元素可以包含 p元素。
然而,p元素的 内容模型是 措辞内容
短语内容是文档的文本,以及 在段落内部标记文本,运行“ a href =”https://www.w3.org/TR/html5/dom.html # phrasing-content“ rel =”noReferrer“ > phrasing 内容 表格 段落.
这不包括 div元素,只能使用中的 流量含量是预期的。
因此,p元素不能包含 div元素。
由于 p元素的 结束标签可以省略,因此当 p元素后面紧跟着 div元素(除其他外)时,可以省略以下内容
被解析为
<p></p> <div>some words</div> </p>
最后一个 </p>是个错误。
</p>
<!-- Example of data from the client database: --> <!-- Name: Stephane Boyera, Tel: (212) 555-1212, Email: sb@foo.org --> <DIV id="client-boyera" class="client"> <P><SPAN class="client-title">Client information:</SPAN> <TABLE class="client-data"> <TR><TH>Last name:<TD>Boyera</TR> <TR><TH>First name:<TD>Stephane</TR> <TR><TH>Tel:<TD>(212) 555-1212</TR> <TR><TH>Email:<TD>sb@foo.org</TR> </TABLE> </DIV>
你注意到什么了吗? : 没有 <p>元素的结束标记。说明书上的错误?没有.
您可能会问: 那么 <p>元素如何知道在哪里停止?
来自 W3docs:
如果省略结束标记,则认为段落的结尾与下一个块级别元素的开头匹配。
简单来说 : <div>是一个块元素,它的开始标记将导致关闭父 <p>,因此 <div>永远不能嵌套在 <p>中。
但是相反的情况呢? 你可能会问
好吧..。
根据 O’Reilly HTML 和 XHTML 袖珍参考,第四版(第50页)
<div> . . . </div> 开始/结束标签 需要/需要
<div> . . . </div>
也就是说,<div>元素的结束只能由它的结束标记 </div>决定,因此内部的 <p>元素不会破坏它。
</div>