【问题标题】:CSS Kerning for Large Numbers大数字的 CSS 字距调整
【发布时间】:2015-06-07 14:36:18
【问题描述】:

我意识到在美国,大数的格式是在数千之间使用,,所以你应该写$1,000,000.00。在南非,, 是非标准的,可以用作小数点而不是 .

我们会写$1000000.00,这很难读。典型的解决方案是使用一些空格:$1 000 000.00

该解决方案的问题在于它看起来仍然很糟糕。

如果我假设值是特定 DOM 元素中的货币格式(即数字后缀为.00,即使它是双零),理想的解决方案是使用 CSS 以某种方式操纵每个倒数第二个的字距-信件。我强烈倾向于不使用 javascript,但也许这是不可能的......

这样的事情可能吗?最好的解决方案是什么?

【问题讨论】:

  • CSS 无法定位字符(::first-letter 伪元素除外),因此要做到这一点,您需要使用 JavaScript 将数字组与元素包装起来然后使用margin/padding 提供间距。
  • 查看this codepenLettering.js 以控制单个字符的字距调整。
  • 谢谢@quantumwannabe - 看起来都不错,你应该把它们作为答案......

标签: css number-formatting kerning letter-spacing


【解决方案1】:

我认为使用普通空格然后用 CSS 减小它们的宽度就可以了。

例如

.currency {
    word-spacing: -2px
}

https://jsfiddle.net/5f9c4cdu/

【讨论】:

  • 这很聪明!但是,您需要自己添加这些空间,或者有一些自动化的东西。
  • @ferr 很高兴你这么说,谢谢。我认为 OP 说他可以用空格或逗号格式化文本,但我可能错了。
  • 如果一切都是静态的,或者他可以以某种方式获得空间,那么它应该对他有用。
  • 我认为这是一个很棒的主意。我没有考虑过实际操纵空间的大小。显然这不是调整数字的优雅,但它肯定是一个有用的想法。
【解决方案2】:

我认为这是不可能的——通过 css 操作字体的字距。最好的办法是找到一种内置理想字距调整的字体并使用它。

但是,由于您需要可变字距调整,我不得不推荐使用 JS。这将是一个简单的脚本。

html:

<div class='currency comma-delimited'>1,000,000.00</div>

jQuery 代码:

var input = $('.currency.comma-delimited').text();
while(input.indexOf(',') != -1) {
    //replace each comma with a space
    input = input.replace(',',' ');
}
$('.currency.comma-delimited').text(input);

以下基于 CSS 的解决方案很荒谬,你不应该使用它:

html:

<div class='currency'>
1<span class='space-delimited'></span>000</span class='space-delimited'></span>000.00
</div>

css:

.currency .space-delimited:after {
    content:' ';
    display:inline-block;
    height:1em;
    width:0.5em; /* control the size of the space, essentially the kerning */
}

实际上,您可以将 JS 解决方案与此 CSS 解决方案相结合,以注入 .space 分隔的 span 代替逗号,从而通过 .space 分隔的 css 为您提供 span 的动态放置和字距控制.

请查看 sn-p 以获取组合示例。

var input = $('.currency.comma-delimited').text();

while (input.indexOf(',') !== -1) {
  input = input.replace(',', '<span class="space-delimited"></span>');
}

$('.currency.comma-delimited').html(input);
.currency .space-delimited:after {
  content: ' ';
  display: inline-block;
  height: 1em;
  width: 0.2em; /* this is your kerning variable! */
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class='currency comma-delimited'>
  1,000,000.00
</div>

【讨论】:

  • 那是行不通的,因为他希望在不同的上下文中对同一个字符进行不同的字距调整。新字体不会有任何影响。
  • 啊,我明白了,所以是“00”和“00 00”。我会在我的帖子中添加一些提示。谢谢
  • 将跨度放在每千个左右而不是让它们在文本中间随意放置不是更有意义吗?不过,我已经奖励了您在答案中所做的工作;)
  • 跨度正在替换逗号并创建一个宽度由 css 定义的空间。如果跨度在数千左右,它仍然可以工作,但是需要使用 :before 而不是 :after 来设置 css 来定义空间。
猜你喜欢
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多