Выравнивание по ширине букв с помощью sprintf - PullRequest
0 голосов
/ 07 февраля 2012

Я пытаюсь выровнять текстовый список элементов для электронной почты. По сути, у меня проблема в том, что он работает только со шрифтами фиксированной ширины (моноширинные) - я хотел бы сценарий, который каким-то образом может выравнивать его на основе ширины каждой буквы стандартным шрифтом Arialish.

function sprintf_nbsp() {
   $args = func_get_args();
   return str_replace(' ', ' ', vsprintf(array_shift($args), array_values($args)));
}
$format = '%-6s%-\'.35.35s...%\'.10s<br>';
$str = sprintf_nbsp($format, '1', 'A list of items - this is the first', '$49.99');
$str .= sprintf_nbsp($format, '100', 'This is something else', '$4.99');
$str .= sprintf_nbsp($format, '5', 'A book', '$499.99');
$str .= sprintf_nbsp($format, '16', 'Testing the function', '$49.99');
echo '<div style="font-family:Courier">'.$str."</div>";
echo '<br><br>'.$str;

(sprintf_nbsp () может не понадобиться, я только что нашел его на форумах php, я открыт для других решений)

1 Ответ

3 голосов
/ 07 февраля 2012

шрифты фиксированной ширины (моноширинные) - мне нужен скрипт, который как-то может выровняйте его по ширине каждой буквы стандартного ариалиша шрифт.

Проще говоря, это невозможно.

При использовании фиксированного шрифта ширины каждый символ имеет одинаковую ширину, отсюда и название, фиксированная ширина.

С другими шрифтами это не так. Например, вы можете ясно видеть, что i намного уже, чем M.

Вы не можете знать, какой шрифт использует пользователь, даже если вы укажете что-то вроде font-family: Arial, это может не всегда работать, разные системы (OSX, X11 и т. Д.) Используют разные шрифты, а некоторые пользователи также переопределяют веб-сайт шрифтов. настройки и т. д.

И даже , если бы вы знали для 100% -ной уверенности в том, какой шрифт использует пользователь, было бы практически невозможно выровнять все, чтобы оно было идеально пиксельным.

Итак, у вас есть два варианта: либо использовать шрифт фиксированной ширины («Consolas» - это стандартный шрифт Windows, который выглядит неплохо), либо использовать другой макет.

Что вы, вероятно, хотите, что-то вроде этого:

<style>
  span { display: block; width: 20em;}
</style>

<span>Some text</span>
<span>Hello, world!</span>
<span>A swallow could not carry a coconut</span>

Здесь каждый <span> имеет одинаковую ширину (20em) независимо от объема содержащегося в нем текста.

Использование пробелов для выравнивания материала - это почти всегда плохая идея. Использование CSS не только намного чище, но и намного проще.

...