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

Rud*_*ski 48 html formatting whitespace

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

<p>Hello.        Hello. Hello. Hello.                       Hello.</p>
Run Code Online (Sandbox Code Playgroud)

显示为:

你好.你好.你好.你好.你好.

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

tri*_*tan 38

空格在HTML中压缩,因为HTML的格式化方式和渲染方式之间存在区别.考虑这样的页面:

<html>
    <body>
        <a href="mylink">A link</a>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

例如,如果HTML使用空格缩进,则链接前面会有几个空格.

  • @roe只有在它之前有东西的时候.浏览器不会呈现前导空格. (2认同)

Tur*_*key 17

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


Zac*_*sch 15

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

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

<pre>This     text has              extra spaces

and

    newlines</pre>
Run Code Online (Sandbox Code Playgroud)

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

  • 你也可以使用"white-space:pre;" css指令只是为现有元素获取<pre>文本格式:http://www.w3.org/TR/CSS21/text.html#white-space-prop (12认同)
  • 可以用css修复. (2认同)

S.L*_*ott 12

"为什么多个空间转换为单个空格?"

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

考虑到有几种白色空间.

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

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

  • a <pre>或CDATA部分中的空格.

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

所以他们不解决它.标签和内容中的空格之间的空格都是可选的.


eno*_*rev 11

它不仅是在 规范,但是有一些感觉吧.如果没有压缩空格,则必须将所有html放在一行上.所以这样的事情:

<div>
    <h1>Title</h1>
    <p>
       This is some text
       <a href="#">Read More</a>
    </p>
</div>
Run Code Online (Sandbox Code Playgroud)

会有一些奇怪的对齐空间到处都是.要做到正确的唯一方法是压缩代码,这很难维护.


Mic*_*ael 7

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

<html>
<body>
    <div>
        I like to indent all content that is inside div tags.
    </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

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


cas*_*One 6

很简单,规范里有。

来自 HTML 规范第 9.1 节

特别是,用户代理在生成输出字间空间时应折叠输入空白序列。


Bol*_*ock 5

通常,这些设计决策没有记录在任何规范中,只能从碰巧可公开访问的工作组讨论档案中收集,或由规范作者自己解释。但是,在这种特殊情况下,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.
Run Code Online (Sandbox Code Playgroud)

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

没有其他 HTML 规范暗示了这种设计决策背后的任何推理。特别是HTML 4只描述了折叠行为,而 HTML5 和 live 规范都遵循 CSS,它也没有解释任何东西。早期版本的 HTML 也不包含任何解释,尽管以下摘录确实出现在HTML 2.0的示例片段中:

<OL>
...
  <UL COMPACT>
  ...
  <LI> Whitespace may be used to assist in reading the
       HTML source.
  </UL>
...
</OL>
Run Code Online (Sandbox Code Playgroud)