浏览器空白间隙渲染

14

最近我在编辑别人的代码时,注意到空格被使用如下:

<div>Some text &nbsp; &nbsp; &nbsp; Some other text</div>

我一开始以为浏览器会合并额外的空格,所以这实际上只是四个空格。但是测试后发现,在chrome中它实际上是七个空格!这是因为浏览器会渲染两个空格之间的空格nbsp;

所以我的问题是,浏览器什么时候会渲染空格,什么时候不会?换句话说,单个空格字符何时被渲染而何时被忽略?

JSFiddle演示:http://jsfiddle.net/L7x7t/3/


这回答您的问题吗?HTML中什么时候空格很重要? - Inigo
3个回答

15

浏览器只会合并连续的普通空格字符。文本渲染主要受CSS规范控制,而不是HTML规范(有例外情况);关于空格合并,CSS2.1的16.6.1节详细说明了这一点。具体来说:

任何一个空格(U+0020)跟在另一个空格(U+0020)后面——即使是行内元素前面的空格,如果该空格的'white-space'属性设置为'normal'、'nowrap'或'pre-line'也是如此——都将被删除。

由于每两个本应连续的空格字符之间都有一个不间断空格(非“常规”空格字符),因此浏览器没有机会合并它们中的任何一个,必须按顺序全部呈现。

各种浏览器的行为基本相同,除了Chrome中一个关于“行内元素前面的空格”的恶性错误


1
据我所知,规则很简单:连续超过一个空格的空白总是被渲染为一个空格。如果您想要渲染更多,则需要使用&nbsp;实体。因此,如果您有代码([whitespace]这里是标准空格)
[whitespace][whitespace]

浏览器只渲染一个空格
但是当你有以下内容时
[whitespace]&nbsp;[whitespace]

浏览器会呈现3个空格,因为正常的空格被额外的&nbsp;分隔开了。

这个规则不适用于实体版本,所以如果你有

&nbsp;&nbsp;

2个空格将被生成


0

来自W3C推荐:

4.7 属性值中的空格处理

当用户代理处理属性时,它们会根据[XML]第3.3.3节进行处理:

删除前导和尾随空白。 将一个或多个空格字符(包括换行符)序列映射到单个单词之间的空格。 对于标签之间的空格,请参见第3.2条款9:

3.2 用户代理一致性

[1-8已省略]

  1. 按照以下规则处理空格。[XML]定义了以下空格字符:

空格 ( ) 水平制表符 ( ) 回车 ( ) 换行 ( ) XML处理器将不同系统的行尾代码标准化为一个单独的换行符,并将其传递给应用程序。

用户代理必须使用CSS中对空格字符的处理定义[CIS2]。请注意,CSS2推荐并未明确解决非拉丁字符集中空格处理的问题。这将在CSS的未来版本中得到解决,届时将更新此参考。

另请参见第C.15节:

C.15. HTML与XML中的空格字符

在HTML文档中合法的一些字符,在XML文档中是非法的。例如,在HTML中,换页符字符(U+000C)被视为空格,在XHTML中,由于XML对字符的定义,这是非法的。


1
NO-BREAK SPACE在HTML意义上不是空格字符。 - Jukka K. Korpela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接