什么时候HTML中的空格很重要?

时间:2012-10-12 16:44:25

标签: html whitespace

example 1

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

<div>
    <button>one</button>
    <button>two</button>
</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”之后或“粗体”之前)很重要。

问题

删除或折叠空格时的确切规则是什么?

3 个答案:

答案 0 :(得分:12)

现实有点复杂。分为两部分

  1. 解析的作用。
  2. 渲染的作用。
  3. 解析实际上在解析文本时(与标记相反)删除了非常少的空白区域。它将remove an initial line feed character at the start of <textarea> and <pre> elements以及无效的<listing>元素,但这就是它。

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

    可以使用Jukka的示例here在没有空格的换行符上演示。请注意树形显示中按钮元素周围的#text:个节点,如果删除了换行符,则不再出现'#text:`节点。

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

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

答案 1 :(得分:6)

对“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中删除了。因此,在大多数情况下,元素之间的换行符会创建一个文本节点,其中包含换行符,该字符被视为等效于空格。

答案 2 :(得分:5)

HTML将串行空格折叠为单个空格,但不会消除它。换行符是一个空格,因此是一个空格。

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

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