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

Hen*_*iao 161 html xhtml

据我所知,这是对的:

<div>
  <p>some words</p>
</div>
Run Code Online (Sandbox Code Playgroud)

但这是错误的:

<p>
  <div>some words</div>
</p>
Run Code Online (Sandbox Code Playgroud)

第一个可以通过w3c验证器(xhtml 1.0),但第二个不能.我知道没有人会像第二个那样编写代码.我只是想知道为什么.那么其他标签的遏制关系呢?

小智 192

查找允许的包含关系的权威位置是HTML规范.例如,参见http://www.w3.org/TR/html4/sgml/dtd.html.它指定哪些元素是块元素,哪些元素是内联元素.对于这些列表,请搜索标记为"HTML内容模型"的部分.

对于P元素,它指定以下内容,表示P元素仅允许包含内联元素.

<!ELEMENT P - O (%inline;)*            -- paragraph -->
Run Code Online (Sandbox Code Playgroud)

这与http://www.w3.org/TR/html401/struct/text.html#h-9.3.1一致,它说P元素"不能包含块级元素(包括P本身)."

  • 我习惯于避免使用规范,这是我们对这类事情最权威的文件,因为它们阅读起来并不好玩.+1实际阅读,理解它们,并用它们来回答问题. (72认同)
  • 这对HTML 5仍然有效吗?链接的规范专门引用HTML 4,[HTML 5没有文档类型定义](http://stackoverflow.com/q/4053917/1157054). (3认同)
  • @ Ajedi32是的,[这里](http://www.w3.org/TR/html-markup/p.html#p).HTML5重命名了很多术语,但"允许的内容:措辞内容"与上面的"%inline"位相同.另见Oriol的回答. (2认同)

def*_*u1t 66

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

  • 啊,这解释了为什么在ap内部的div之前有一个巨大的空间,因为p实际上在div之前结束. (2认同)
  • 你*可以在DOM*中的`p`*中放置一个`div`元素,例如`myP.appendChild(myDiv)`.但HTML解析器不会这样做. (2认同)

Ori*_*iol 34

根据HTML5,所述内容模型div元素是流内容

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

这包括p元素,只能在预期流内容的地方使用.

因此,div元素可以包含p元素.


然而,内容模型p元素是段落式内容

短语内容是文档的文本,以及在段落内标记该文本的元素.短语内容的运行形成段落.

这不包括div元素,只能在预期流内容的地方使用.

因此,p元素不能包含div元素.

由于结束标记p可以当被省略的元件p元件之后紧接着一个div元件(除了别的以外),以下

<p>
  <div>some words</div>
</p>
Run Code Online (Sandbox Code Playgroud)

被解析为

<p></p>
<div>some words</div>
</p>
Run Code Online (Sandbox Code Playgroud)

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