【问题标题】:When does whitespace matter in HTML?什么时候空格在 HTML 中很重要?
【发布时间】:2012-10-03 12:51:47
【问题描述】:

example 1

<div><button>one</button><button>two</button></div>

<div>
    <button>one</button>
    <button>two</button>
</div>
​

在第一个 div 中,两个按钮之间没有空格,在第二个 div 中,有。

现在让我们考虑另一个例子:

example 2

<div>a</div>
<div> b</div>​​​​​​​​​​​​

b之前没有空格。

示例 3

a<b> bold</b> man

现在bold之前的空格很重要

示例 4

a <b> bold</b> man

现在只有一个空格(“a”之后或“bold”之前)是重要的。

问题

剥离或折叠空白的确切规则是什么?

【问题讨论】:

  • 这个问题只涉及HTML在浏览器中的显示方式吗?还是与规范有关,或者与 HTML 解析 API 如何处理空白有关?
  • @MattFenwick:主要关注浏览器如何呈现它。我正在将 HTML 转换为另一种语言,我希望它看起来或多或少相同。
  • 我删除了我的答案,因为它过于简单化了。 Jukka K. Korpela 和 Alohci 解决了更复杂的部分。

标签: html whitespace


【解决方案1】:

现实有些复杂。有两个部分

  1. 解析的作用。
  2. 渲染的作用。

解析实际上在解析文本时删除了非常少的空白(与标记相反)。它将remove an initial line feed character at the start of &lt;textarea&gt; and &lt;pre&gt; elements 和无效的&lt;listing&gt; 元素上,但仅此而已。

Jukka 引用 HTML 4.01 部分 B.3.1 Line breaks 说“必须忽略紧跟在开始标记之后的换行符,就像紧接在结束标记之前的换行符一样”,但这是在非规范性附录和浏览器中除了上面提到的三个要素外,不要遵循它。

这可以使用 Jukka 的示例 here 进行演示,该示例使用无空格的换行符。注意树形显示中按钮elmeents 周围的#text: 节点,如果删除换行符,'#text:` 节点将不再出现。

通过使用规范here 中的第一个示例,我们还可以看到没有应用该规则。通过添加display:pre,很明显换行符并没有被完全忽略,而是将两个示例呈现相同只是默认空白处理的属性white-space:normal

这将我们带到相关规范,即 CSS 规范中的 16.6.1 The 'white-space' processing model。这涵盖了应用于每个空白设置值的文本字符的系统规则。

【讨论】:

  • HTML 4.01 规范的附录 B 确实提供了丰富的信息,但正如它所说:“本节中的所有要求都出现在规范的其他地方”。基本一致性条款说 HTML 文档是 SGML 文档,在某些情况下忽略换行符的原则是 SGML 标准的一部分,因此是规范的。但 HTML 从未真正实现为 SGML 应用程序。而这部分也几乎完全被浏览器供应商忽略了。
【解决方案2】:

对“空白在 HTML 中什么时候重要?”这个问题的完整答案会相当长和详细,需要讨论属性规范和元素之间的空格等特殊规则,如textarea。但地址似乎是主要关注点:

标签之间的空格通常会创建匿名文本节点。叶元素(不包含其他元素的元素)内的空格构成元素文本内容的一部分。

几乎没有固定的渲染规则,但浏览器通常会忽略元素文本内容中的前导和尾随空格。

如果内联渲染的元素之间存在空格(例如默认为button 元素),它通常充当相当于一个空格的分隔符。

但是,由一个换行符组成的空格会被忽略,by specifications 通常在浏览器实践中,当它紧跟在开始标记之后或在结束标记之前。所以

<div>
<button>one</button>
<button>two</button>
</div>

将被视为不存在换行符。但是当使用空格时,如

<div>
  <button>one</button>
  <button>two</button>
</div>

那么在第一个 button 元素之前和两个 button 元素之间会有匿名文本节点。通常只有后者很重要,它就像一个正常的单词空间。

更新:正如下面的评论和 Alohci 的回答所指出的,这个旧的 (HTML 4.01) 原则大部分没有在浏览器中实现,并且大部分在 HTML5 中被删除。所以在大多数情况下,元素之间的换行会创建一个文本节点,其中包含一个换行符,它被视为等同于一个空格。

【讨论】:

  • 您的声明和关于忽略一个换行符的两个示例对于 Chrome、Firefox 或 Opera 的最新版本,或者在 IE8 或 IE10 中是不正确的:jsbin.com/eKAzUfI/1 (source)。有趣的是,对于 IE6 (!) 和 IE9,它是正确的。我没有测试IE7。我也用一个独立的文件进行了测试,以防它是 JSBin 的默认 CSS 中的东西,但结果是一样的。
  • 我已得到更正,并将对我的答案进行一些更正(但不会删除它,因为某些点是有效的,并且在另一个答案中引用了不正确的点)。
【解决方案3】:

HTML 将连续空格折叠成单个空格,但不会消除它。换行符是空格,因此是空格。

这不仅仅是前导/尾随 - 元素中的连续空白也被呈现为单个空白。这些将呈现相同:

<div>   a   b   </div>
<div> a b </div>
<div>a b</div>

【讨论】:

  • 折叠很简单,我关心的是修剪:)
  • 其实折叠比这复杂一点。跨内联元素的连续/连续空格也被折叠。
  • 虽然您的示例是正确的,但它处理的是最简单的情况,因此没有解决问题。请参阅问题中的示例 3 和 4。
猜你喜欢
  • 2018-07-31
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
相关资源
最近更新 更多