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

Why can't the <p> tag contain a <div> tag inside it?

提问人:Henry H Miao 提问时间:12/6/2011 最后编辑:Peter MortensenHenry H Miao 更新时间:6/11/2022 访问量:92219

问:

据我所知,这是对的:

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

但这是错误的:

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

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

那么其他标签的包含关系呢?

HTML xhtml

评论

11赞 Bojangles 12/6/2011
因为是一个块级元素,并且(应该)用于显示文本,所以它不允许其他块级元素在其中,而只允许像 和 这样的内联元素。<p><span><strong>
30赞 Joey 12/6/2011
JamWaffles:这是一个块级元素,与它无关。 也是一个,并允许其他块。pdiv
1赞 Ciro Santilli OurBigBook.com 6/17/2014
可能的重复项:stackoverflow.com/questions/4967976/...(未标记):任何体面的答案都将回答如何阅读 HTML 规范,从而也回答这个问题。
2赞 Triynko 12/15/2015
将 div 的样式声明为内联也不起作用。

答:

-7赞 Gaurav Agrawal 12/6/2011 #1

因为标签的优先级高于标签。标签表示段落标签,而标签表示文档标签。divppdiv

您可以在文档标签中编写多个段落,但不能在一个段落中编写文档。与 DOC 文件相同。

评论

2赞 Kyle 12/21/2012
实际上,这是分裂。否则会:D<doc>
6赞 SimplGy 5/18/2013
优先级不是一个适用于 html 元素的概念,div 代表一个除法,正如 @KyleSevenoaks 所说:)
0赞 Peter Mortensen 7/8/2019
什么是 DOC 文件?Microsoft Word 文件?
74赞 defau1t 12/6/2011 #2

简而言之,不可能在 DOM 中将元素放在 a 中,因为开始标签会自动关闭该元素。<div><p><div><p>

评论

2赞 AaronLS 2/19/2014
啊,这就解释了为什么 p 中的 div 前面有一个巨大的空格,因为 p 实际上在 div 之前结束。
2赞 Oriol 9/2/2016
您可以在 DOM 的 a 中放置一个元素,例如 .但是 HTML 解析器不会这样做。divpmyP.appendChild(myDiv)
1赞 11/4/2017
不要那样做。你不知道这将在未来的浏览器中如何响应。技术在不断变化。可能有一个动态的 html 解析器有一天会使它无效。Web 开发的目标是创建既可取又兼容的东西。如果您可以绕过浏览器允许的内容,可以肯定地说您不能确保它永远工作。只需使用跨度的家伙......如果您需要 div,请停止使用 p 标签。
224赞 Colin Campbell 1/2/2012 #3

查找允许的包含关系的权威位置是 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 本身)”。

评论

83赞 Stoutie 10/3/2012
我有一个习惯,就是避免使用规范,这是我们为这类事情准备的最权威的文档,因为它们读起来并不有趣。+1 实际阅读、理解它们并使用它们来回答问题。
3赞 Ajedi32 6/16/2015
这对 HTML 5 仍然有效吗?链接的规范专门引用了 HTML 4,而 HTML 5 没有文档类型定义
2赞 Mr Lister 1/18/2016
@Ajedi32 是的,这里。HTML5 重命名了许多术语,但“允许的内容:措辞内容”的含义与上面的位相同。另见 Oriol 的回答。%inline
1赞 Captain Hypertext 10/13/2016
@Stoutie 没错,这就是 Stack Overflow 存在的原因。
0赞 Ellis 6/28/2023
但根据这个解释,这与 div 内部的 div 不一致。
-1赞 geekdev786 9/13/2013 #4

在 X HTML 之后,约定已经改变,现在它是 XML 和 HTML 约定的混合体,所以这就是为什么第二种方法是错误的,W3C 验证器接受符合标准和约定的正确内容。

评论

0赞 Quentin 11/20/2019
XHTML没有太大变化。p 元素从未被允许包含 div 元素。
53赞 Oriol 1/9/2016 #5

根据 HTML5,div 元素的内容模型流内容

文档和应用程序正文中使用的大多数元素都归类为流内容。

这包括 p 元素,这些元素只能在需要流内容的情况下使用。

因此,元素可以包含元素。divp


但是,p 元素的内容模型措辞内容

措辞内容是文档的文本,以及 在段落内级别标记该文本。措辞的运行 内容形式段落

这不包括 div 元素,这些元素只能在需要流内容的地方使用。

因此,元素不能包含元素。pdiv

由于当元素紧跟一个元素(以及其他元素)时,可以省略 p 元素的结束标记,因此以下pdiv

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

解析为

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

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

评论

0赞 Sanjay 1/6/2018
但是,如果在 CSS 中,如果我将 div 设置为内联,为什么它不尊重它?
1赞 Sanjay 1/6/2018
由于 CSS 值是在 dom 解析之后应用的...即使我们让它没有用,作为新的解析结构是我的理解正确吗?div as inline in CSS<p>Text</p> <div>some words</div> <p></p>
0赞 Andrew Naumovich 5/29/2018
@Sanjay 是的,看起来你是对的。此外,在我的观察中,如果你把<span>放在<p>里,然后将span的显示设置为“block”,它将被渲染为一个典型的块元素,而没有这样的效果。
3赞 Mossab 6/11/2022 #6

请看 HTML 规范中的这个例子

<!-- Example of data from the client database: -->
<!-- Name: Stephane Boyera, Tel: (212) 555-1212, Email: [email protected] -->

<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>[email protected]</TR>
</TABLE>
</DIV>

你注意到什么了吗?:元素没有结束标记。规格错误?不可以<p>

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

你可能会问:但是,一个元素怎么知道在哪里停下来呢?<p>

来自 w3docs

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

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

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

井。。。

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

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

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

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