【问题标题】:HTML whitespace: spaces before and after <br>HTML 空格:<br> 前后的空格
【发布时间】:2015-12-06 05:49:22
【问题描述】:

我试图更好地理解 HTML 空白处理模型。现在我正在比较两个 HTML sn-ps:

<div>a <br>z</div>

<div>a<br> z</div>

第一个 sn-p 在重新处理后会产生两行:"a ""z"(因此第一行有一个尾随空格。)

第二个 sn-p 产生两行:"a""z"。第二行没有前导空格。

我的问题是:为什么?我目前正在使用这个http://www.w3.org/TR/CSS2/text.html#white-space-model 作为参考。它指出

  1. 如果行首的空格 (U+0020) 将“white-space”设置为“normal”、“nowrap”或“pre-line”,则会将其删除。
  2. 所有制表符 (U+0009) 都呈现为水平移位,将下一个字形的开始边缘与下一个制表位对齐。制表位出现在从块的起始内容边缘以块的字体呈现的空间宽度 (U+0020) 的 8 倍的点处。
  3. 如果行尾的空格 (U+0020) 将“white-space”设置为“normal”、“nowrap”或“pre-line”,也会将其删除。
  4. 如果行尾的空格 (U+0020) 或制表符 (U+0009) 将“white-space”设置为“pre-wrap”,UA 可能会在视觉上折叠它们。

对此的幼稚阅读表明,由于要删除行的开头 结尾的空格(当“空白”为“正常”时),第一个我的 sn-ps 应该没有尾随空格。但事实并非如此。

那么发生了什么?

我目前的理论是&lt;br&gt; 被秘密计为一个“字符”,在第一个 sn-p 中,它防止尾随空格位于其行的“末尾”。但我真的不知道。

编辑:要清楚,我知道如何使用&amp;nbsp; 随意创建空间。我的问题是什么规则(关于某些规范)会导致上述行为。

【问题讨论】:

  • drafts.csswg.org/css-text/#white-space-phase-1,当前的规范,可能会提供一些见解
  • @Vucko:这就是它在 DOM 检查器中的显示方式,而不是它的呈现方式。
  • @sideshowbarker:真遗憾。 css-text 中的大量行话使 CSS2.1 文本读起来像一本儿童读物。
  • @BoltClock 是的,我的错 - 我误读了 OP。
  • @BoltClock 当前(现代)CSS 规范是针对(优化)UA/浏览器实现者的技术规范。它们的编写比 CSS2 时代的规范更加严格和精确,并且旨在完全明确——这样任何两个遵循规范要求的实现者都会以完全相同的结果结束,这样我们才能获得真正的 CSS 互操作性因此,在所有 UA/浏览器中。结果之一是,规范需要定义很多术语,并引用其中的很多。这可能看起来像一个过度的行话,但在上下文中通常是必要的。

标签: html css whitespace language-lawyer


【解决方案1】:

好问题!我已经确认了 Chrome 和 Firefox 中的行为,并确认它与&lt;br&gt; 无关,因为它也是由white-space: pre-line 条件中的普通换行符触发的:

<div style="white-space:pre-line">a 
z</div>

我已经sent an email to the list 要求澄清这个问题,并询问我们是否应该更改规范以匹配实现,或者在浏览器上提交错误以匹配规范。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多