设计决策-为什么不生成</ p>的<p>?


14

tl; dr

假设浏览器将正确关闭段落,则一些生成html的广泛使用的程序将仅生成开始段落标签,而不会生成关闭段落标签。

从表面上看,在我看来,浏览器将正确关闭段落的假设是不正确的。我的解释正确吗?更笼统地说,这种决策涉及哪些权衡?


浏览moinmoin源代码时,以下代码行引起了我的注意:

# We only open those tags and let the browser auto-close them:
_auto_closing_tags = set(['p'])

来源

在阅读完其余的实现后,我已经使自己确信,是的,的确,当moinmoin为其中一个页面生成html代码时,它将在适当的情况下正确生成段落打开标签,同时有目的地避免任何段落关闭标签(尽管能够做到这一点)。

对于我特定的,相当不寻常的用例,这种行为是不正确的。我很想提交错误报告和/或更改行为。但是,看起来这个设计决定是经过深思熟虑的。我不太熟悉html标准或各种浏览器实现的复杂性,因此无法总体上判断这是否是正确的行为,而且我感觉我本能的纠正/更改此行为的本能可能是被误导了。

这段代码是否对浏览器的实现做出了正确的假设?生成的html有效吗?更一般而言,我可能会在这里失去哪些权衡?


2
尽管有当前的答案,但它看起来像一个普通的设计。“在接受的内容上保持自由,在发送的内容上保持保守”。这也是完全不必要的。我一定会向Moinmoin提交(措辞强烈的)错误报告。至少他们应该清楚地记录和评论这种不直观的行为。
康拉德·鲁道夫2013年

Answers:


33

p元素的结束标记在HTML中是可选的,仅在XHTML中是必需的。但是,HTML5草案为pend标签实际上是可选的引入了一组条件:

如果p元素后面紧跟一个地址,文章,aside,blockquote,dir,div,dl,fieldset,footer,form,h1,h2,h3,h4,h5,h6,标头,则可以省略p元素的结束标记,hgroup,hr,menu,nav,ol,p,pre,section,table或ul,元素,或者如果父元素中没有更多内容且父元素不是a元素。

资料来源:HTML5规范

就是说,我所听到的关于省略p元素的结束标签的唯一论据是文档大小。完全由您决定是否对您的文档有意义。就个人而言,我倾向于包括所有可选的结束标记,以防万一我不满足结束标记为可选的要求。


5
我想,好主意也是如此。:)
罗伯特·哈维

@RobertHarvey您以12秒的优势赢得了本轮比赛……
yannis 2013年

2
另一个赞成省略结束标记的论点:它们在文档结构中很明显,并且当被滥用时,也会引入虚假的空格。
乔恩·普迪

1
能够省略结束标签显然是SGML的设计功能,而HTML是HTML的基础。它也明确不是XHTML所基于的XML的功能。
艾伦·舒特科

4
我经常看到的一个论点是它看起来更干净。特别是在<li>标签的情况下,标签的行为更像是要点。
DisgruntledGoat 2013年

16

HTML5W3C规范明确指出:

如果p元素后面紧跟一个地址,文章,aside,blockquote,dir,div,dl,fieldset,footer,form,h1,h2,h3,h4,h5,h6,标头,则可以省略p元素的结束标记,hr,menu,nav,ol,p,pre,section,table或ul元素,或者如果父元素中没有更多内容并且父元素不是a元素。

因此,基本上,该规范提供了许多方法,可以避免关闭标签的复杂性(可能大或小)。任何符合要求的浏览器实现都必须适应这些异常。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.