为什么 < p > 标记不能包含 < div > 标记呢?

据我所知,这是正确的:

<div>
<p>some words</p>
</div>

但这是错误的:

<p>
<div>some words</div>
</p>

第一个可以通过 W3C 验证器(XHTML 1.0) ,但是第二个不能。我知道没有人会像第二个那样编写代码。我只想知道为什么。

那其他标签的包容关系呢?

88239 次浏览

因为 div标记的优先级高于 p标记。p标记表示段落标记,而 div标记表示文档标记。

你可以在一个文档标签中写很多段落,但是你不能在一个段落中写一个文档。和 DOC 文件一样。

简而言之,不可能在 DOM 中的 <p>中放置 <div>元素,因为打开的 <div>标记将自动关闭 <p>元素。

寻找允许的包含关系的权威场所是 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>
<div>some words</div>
</p>

被解析为

<p></p>
<div>some words</div>
</p>

最后一个 </p>是个错误。

看看这个来自 HTML 规范的例子

<!-- 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>元素的结束标记。说明书上的错误?没有.

提示 # 1: <p>的结束标记是可选的

您可能会问: 那么 <p>元素如何知道在哪里停止?

来自 W3docs:

如果省略结束标记,则认为段落的结尾与下一个块级别元素的开头匹配。

简单来说 : <div>是一个块元素,它的开始标记将导致关闭父 <p>,因此 <div>永远不能嵌套在 <p>中。

但是相反的情况呢? 你可能会问

好吧..。

提示 # 2: <div>元素的结束标记是必需的

根据 O’Reilly HTML 和 XHTML 袖珍参考,第四版(第50页)

<div> . . . </div> 开始/结束标签 需要/需要

也就是说,<div>元素的结束只能由它的结束标记 </div>决定,因此内部的 <p>元素不会破坏它。