在*字符*中指定宽度

149

当使用固定宽度字体时,我希望能够以字符为单位指定 HTML 元素的宽度。

"em" 单位应该是 M 字符的宽度,因此我应该可以使用它来指定宽度。这是一个示例:

<html>
  <head>
    <style>
      div {
        font-family: Courier;
        width: 10em;
      }
    </style>
  </head>
  <body>
    <div>
      1 3 5 7 9 1 3 5 7 9 1
    </div>
  </body>
</html>

浏览器在第15列后换行,而不是第10列,这不是我想要的结果:

1 3 5 7 9 1 3 5
7 9 1

(在Ubuntu的Firefox和Chromium中都是这个结果。)

维基百科文章说“em”并不总是等于字母M的宽度,因此看起来“em”单位不能用于此。


1
我相信"en"也是一种合法的宽度;它是排版中数字的宽度。这对你可能更有效。 - Pete Wilson
8
“em”属性使用字体的大小或高度,而不是字母的宽度。@Pete:这并不是这样的,请参考CSS值和单位模块3级。” - animuson
除非你使用的是等宽字体,不同字符具有不同的宽度。因此,以显示的字符数来设置宽度在功能上是不可能的。 - Emily
"这个问题还需要其他用户的4个投票才能关闭" - 嘿,这是我的问题!让我来关闭它! - Martin Vilcans
即使按照您的期望工作,它也会在您的示例中换行,因为您忘记计算数字之间的空格。您有10个数字和9个空格,因此需要19个“字符”才能不换行。 - jkcunningham
2个回答

318

ch单位

你需要的单位是ch。根据MDN文档

ch: 表示元素的font中字符“0”(零,Unicode字符U+0030)的宽度或更精确地说是其推进度量。

当前主流浏览器均已支持该单位(caniuse)。

示例

pre {
    width: 80ch; /* classic terminal width for code sections */
}

3
还有一个数字间距,它恰好等于维基百科的空格标点符号文章中描述的“一个数字的宽度”。它的Unicode值是U+2007,可以在HTML中使用&#x2007;&#8199;输入。它在功能上等同于CSS的ch单位,但由于ch并不被广泛支持,因此它可以在HTML中用作解决方法(虽然这种方式不太美观,但应该可行)。 - waldyrious
2
实际上,根据这个Chromium问题,Chrome从v27开始支持它,所以现在所有主要浏览器的最新版本(IE、Chrome和Firefox)都支持ch单位 :) - waldyrious
2
应注意字符大小是元素字体中字形“0”的大小。如果您期望更大的字符,如“m”或“w”,您可能需要相应地扩展或根据需要进行扩展(例如https://dev59.com/Umw05IYBdhLWcg3wkig-)。 - user420667
1
没问题,等宽字体也没有任何问题。 - user5902649
2
IE11支持它的方式不正确。https://dev59.com/xXTYa4cB1Zd3GeqPzNKS - aleha_84
显示剩余6条评论

26

1em表示M的高度,而不是宽度。Ex也是同理,表示x的高度。更一般地说,它们是大写字母和小写字母的高度。

宽度是完全不同的问题......

将您上面的示例更改为

<div>
    <span>1</span> 3 5 7 9 1 3 5 7 9 1
</div>

你会注意到,这个span的宽度和高度是不同的。对于Chrome上字体大小为20px的情况,span的大小为12x22像素,其中20px是字体的高度,2px是行高。

现在由于em和ex在这里没有用处,CSS-only解决方案的一个可能策略是:

  1. 创建一个只包含 &nbsp; 的元素
  2. 让它自动调整大小
  3. 将你的div放在其中,并
  4. 使它比周围元素大10倍。

然而,我没能编写代码实现这一点。我也怀疑这真的可能吗。

然而,相同的逻辑可以在JavaScript中实现。我在这里使用了jQuery:

<html>
  <head>
    <style>
      body { font-size: 20px; font-family: Monospace; }
    </style>
    <script 
      type="text/javascript" 
      src ="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js">
    </script>
  </head>
  <body>
    <div>1 3 5 7 9 1 3 5 7 9 1</div>
    <script>
      $('body').append('<div id="testwidth"><span>&nbsp;</span></div>');
      var w = $('#testwidth span').width();
      $('#testwidth').remove();
      $('div').css('width', (w * 10 + 1) + 'px');       
    </script>
  </body>
</html> 

(w * 10 + 1) 中的 +1 是为了处理四舍五入问题。


2
我希望有一个纯CSS的解决方案,这只有在您知道字符高度和宽度之间的比率时才可能实现(请参见https://dev59.com/LHM_5IYBdhLWcg3wt1vD)。我接受这个答案,因为它似乎是一个强大的解决方案。 - Martin Vilcans
根据这里的答案http://graphicdesign.stackexchange.com/questions/4035/what-does-the-size-of-the-font-translate-to-exactly?newreg=c0e8d07377164ef992aef80043838507,1em不是M的高度。 "|"字符应该更接近1em。 - Sogartar
1
Sogartar,澄清一下:在排版中,1 em确实是等宽字符的宽度(以及em高度)。然而,这是“排版规范”,我们有许多不遵循排版规则的人创建字体文件——特别是在Web字体的情况下更是如此。我在这里发表评论的重点不仅仅是抱怨。我的观点是:测试,测试,再测试。(然后再测试一些。) - Parapluie
1
请使用“ch”单位。这个答案描述得很好:https://dev59.com/C2sy5IYBdhLWcg3w-zB4#16586438 - chetbox

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