1em - это высота буквы М, а не ширина. То же самое верно и для ex, который является высотой x. Вообще говоря, это высота прописных и строчных букв.
Другое дело - ширина ....
Измените приведенный выше пример на
<div>
<span>1</span> 3 5 7 9 1 3 5 7 9 1
</div>
и вы заметите, что ширина и высота пролета разные. Для размера шрифта 20 пикселей в Chrome диапазон составляет 12x22 пикселей, где 20 пикселей - это высота шрифта, а 2 пикселя - высота строки.
Теперь, поскольку em и ex здесь бесполезны, возможной стратегией для решения только для CSS было бы
- Создайте элемент, содержащий только & nbsp;
- Пусть он автоматически изменится
- Поместите свой div внутрь и
- Сделайте его в 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> </span></div>');
var w = $('#testwidth span').width();
$('#testwidth').remove();
$('div').css('width', (w * 10 + 1) + 'px');
</script>
</body>
</html>
+1 в (w * 10 + 1) предназначен для решения проблем округления.