嵌套<p>标签无法正常工作,而嵌套<div>标签则可以吗?

55

通常我不会像这样嵌套 <p>

<p>The following:
    <p>one</p>
    <p>two</p>
</p>

我将使用 <div> 进行嵌套。但今天我使用了 <p>,但似乎 Emacs 和 Google Chrome 都会在看到新的 <p> 开始时立即关闭外部的 <p> 标签。(DOCTYPE 是 HTML 4.01 Strict)。

我认为 <p> 只是一个带有一些预定义的边距和填充的 <div>,但是它不能被嵌套吗?如果是这样的话,是哪个规则说它不能被嵌套呢?

2个回答

89

因为段落就是段落……这就是HTML的定义(而HTML不是XML)。

任何<p>(或其他块级元素)都将隐式关闭任何已打开的<p>

根据HTML 4.01规范的9.3.1段落:P元素

P元素代表一个段落。它不能包含块级元素(包括P本身)。


请注意,这是HTML解析器的工作方式,即使一个<div>也会隐式关闭段落!

但是,带有display:block;<span>不会作为块级元素关闭<p>,因为<span>不是块级元素。

也就是说,在HTML处理的这个阶段,CSS是无关紧要的,而且对于DOM/解析器来说,CSS在确定元素是否为块级元素时也是无关紧要的。考虑到CSS可能动态应用或通过尚未加载的样式表应用,这一点非常重要:应用的CSS不会更改DOM。


虽然HTML5(草案)规范中没有包含以上内容的HTML4规范,但它继续将段落定义为短语内容容器,并进一步有一个段落部分

接受的回答来自“可以嵌套在P元素内的HTML5元素列表”,说HTML5中<p>元素不能嵌套。文档中的关键短语是:“连续的短语内容(不包括<p>元素)形成段落”。此外,HTML5试图在许多方面保持向后兼容性,对属性值和内容模型的限制有理由:“内容模型和属性值的限制”

某些元素以颇具个性化的方式解析(通常出于历史原因),它们的内容模型限制旨在避免将作者置于这些问题之下。

该行为被引用自HTML5 WG关于流内容的Wiki条目

HTML5对于p元素的嵌套和它所含内容的限制是由于解析器的特殊性质造成的,这会导致p元素被自动关闭


14

所以 <p> 就像是一个 <div>,但它是一个特殊情况吗? - nonopolarity
7
“<p>”不是遗留的标记,它定义了语义意图 - 顾名思义,一个段落。如果将“<p>”定义为遗留标记,那么我们也应该摆脱“<hX>”元素..毕竟,它们可以用“<div>”代替。 - user166390
请查看规范。再次强调,它(P)不能包含块级元素(包括 P 本身)。 - user166390
1
唯一不能嵌套<p>标签的原因是它就是这样定义的。没有什么多余或少的。如果规范中没有这个小条款,那么它就可以被嵌套...但那将不是HTML 4.01规范了。 - user166390
3
@pst,实际上我确实感觉到了,为什么一个段落不能包含任何块元素呢?在常见的用法中,我们可能会有一个段落,这个段落可以引用一行短语然后继续下去,所以这个引用更逻辑地成为这个段落作为一个单元的一部分,而不是这个段落之外的一个单独实体。但当然,如果事情就是这样,那么人们必须根据这个规则进行设计。 - nonopolarity
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接