为什么HTML要求多个空格在浏览器中显示为单个空格?

时间:2009-01-11 19:38:01

标签: html formatting whitespace

我早就认识到HTML文件中的任何一组空格都只会显示为一个空格。例如,这个:

<p>Hello.        Hello. Hello. Hello.                       Hello.</p>

显示为:

您好。你好。你好。你好。你好。

这非常好,就像你需要预先格式化文本的多个空格一样,你可以使用&lt; pre&gt;标签。但是原因是什么?更准确地说,为什么这是HTML规范?

11 个答案:

答案 0 :(得分:17)

试图解决它可能的“原因”,因为HTML基于SGML,它已经指明了这一点。它反过来基于60年代早期的GML。白色空间处理的原因很可能是因为数据一次被输入一张“卡片”,这可能导致不希望的句子和段落分解。旧GML的一个不同之处在于它指定句子之间必须有两个空格(比如旧的打字机规则),它们可能已经建立了一个空格独立于标记的先行词。

答案 1 :(得分:15)

正如其他人所说,它在HTML规范中。

如果要在输出中保留空格,可以使用<pre> tag

<pre>This     text has              extra spaces

and

    newlines</pre>

但这通常也会以不同的字体显示文字。

答案 2 :(得分:12)

“为什么多个空格会转换为单个空格?”

首先,“为什么”的问题很难回答。这是在规范中。这几乎就是它的结束。

考虑到有几种白色空间。

  • 标签之间的空白区域。 <p>\n<b>hi</b>\n</p>

  • 标记内容中的空格。 <p>Hi <i>everyone</i>.</p>

  • <pre>或CDATA部分中的空白区域。

前两个很难区分。标签之间的空格,即使是XML,也是“可选的”。但是当你拥有所谓的“混合内容模型” - 与内容混合的标签时 - “标签之间”和“在内容中但在标签之间”和“在内容中但不在标签之间”的微妙之处是不可能的理清。

所以他们不解决这个问题。标签和内容中的空格之间的空格都是可选的。

答案 3 :(得分:11)

不仅在the specification中,而且还有一些意义。如果没有压缩空格,则必须将所有html放在一行上。所以像这样:

<div>
    <h1>Title</h1>
    <p>
       This is some text
       <a href="#">Read More</a>
    </p>
</div>

与整个地方的空间会有一些奇怪的对齐。要做到正确的唯一方法就是压缩那些难以维护的代码。

答案 4 :(得分:7)

如果浏览器没有这样做,可能很难格式化HTML代码以使其易于阅读。例如,您可能希望像这样格式化代码:

<html>
<body>
    <div>
        I like to indent all content that is inside div tags.
    </div>
</body>
</html>

如果浏览器没有忽略div标签内文本之前的八个空格,那么您的网页可能看起来不像您希望的那样。

答案 5 :(得分:4)

通常,这些设计决策没有记录在任何规范中,只能从工作组讨论档案中收集,这些档案恰好可以公开访问,或者由规范作者自己解释。但是,在这种特殊情况下,HTML 3.2会说明以下内容:

  

除了文字文本(例如PRE元素)之外,HTML将连续的空格字符序列视为等同于单个空格字符(ASCII十进制32)。这些规则允许作者在直接编辑标记文本时具有相当大的灵活性。请注意,将来对HTML的修订可能允许相对于关联样式表定义的选项卡规则解释水平制表符(ASCII十进制9)。

您今天看到的行为当然比HTML 3.2中指定的行为复杂得多,但我相信推理仍然适用。这种灵活性可能有用的一个例子是当你有一个你打算硬包装和缩进的长段时:

<H1>Lorem ipsum</H1>
<P>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fastidii oportere
   consulatu no quo. Vix saepe labores an, pri illud mentitum et, ex suas quas
   duo. Sit utinam volutpat ea, id vis cibo meis dolorum, eam docendi
   accommodare voluptatibus no. Id quaeque electram vim, ut sed singulis
   neglegentur, ne graece alterum has. Simul partiendo quaerendum et his.

如果空格没有折叠,您最终会得到一个段落,其中的间隙异常大,文本由于缩进而被硬包裹。

没有其他HTML规范表明此设计决策背后的任何推理。特别是HTML 4仅描述了折叠行为,HTML5和生活规范都遵循CSS doesn't explain anything either。早期版本的HTML也不包含任何解释,但以下摘录确实出现在HTML 2.0的示例代码段中:

<OL>
...
  <UL COMPACT>
  ...
  <LI> Whitespace may be used to assist in reading the
       HTML source.
  </UL>
...
</OL>

答案 6 :(得分:3)

它在HTML规范中。它是关于字间空间呈现为ASCII空间的部分。

http://www.w3.org/TR/html401/struct/text.html

答案 7 :(得分:3)

简单,它在规范中。

从HTML规范section 9.1

  

特别是,用户代理应该   崩溃输入空白序列   在产生输出词间时   空间。

答案 8 :(得分:3)

要回答为什么这是HTML规范?,你必须考虑HTML的来源。

Tim Berners-Lee设计了HTML用于共享科学文档。他基于SGML中已有的语法思想,它也有类似的空格处理。

可以想象,早期的CERN HTML编写者没有WYSIWYG工具的帮助就这样做了,因此以这种方式处理空白的能力有助于这种手写源文件的易读性。

答案 9 :(得分:2)

HTML的定义/规范明确规定忽略多余的空格。

如果您想要包含额外的空格,请使用<pre>标记或&nbsp;

答案 10 :(得分:2)

还有一个印刷答案:无论你在学校的打字老师告诉你什么,单词和句子之间应该只有一个空格。

Use One Space Between Sentences

Use A Single Word Space Between Sentences