Исправить высоту строки пользовательского шрифта с помощью CSS

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

Этот нестандартный шрифт (FF DIN), кажется, имеет естественную вертикальную смещенную от центра высоту строки, что вынуждает меня использовать некоторые хаки с отступом, чтобы компенсировать верхнее пространство на элементе, таком как кнопка и ввод.

Пример: шрифт зеленого цвета (Helvetica Neue) правильно выровнен, а используемый пользовательский шрифт (FF DIN) смещен по вертикали от центра:

введите описание изображения здесь

Есть ли какой-нибудь известный способ исправить эту проблему центрирования в CSS естественным образом, чтобы каким-то образом принудительно настроить базовое поведение шрифта?

Спасибо.


person kirkas    schedule 23.01.2015    source источник
comment
Речь идет не о высоте строки, а о вертикальном размещении глифов.   -  person Jukka K. Korpela    schedule 23.01.2015
comment
Есть ли другое правдоподобное решение этой проблемы? помимо принятого решения? Я не хочу редактировать шрифт вручную   -  person Abhinav Singi    schedule 16.09.2016


Ответы (5)


Проблема здесь не в высоте строки, а в вертикальном размещении глифов, в частности в расположении базовой линии текста. Это то, что решил дизайнер шрифтов; дизайнер рисует глифы и помещает их в квадрат em, концептуальное устройство, высота которого равна (или определена как) высоте шрифта. В частности, дизайнер решает, сколько места должно быть ниже базовой линии с одной стороны и выше высоты прописных букв с другой. Обычно эти пространства равны или почти равны, но это не обязательно. Если они существенно отличаются, то предполагаемое использование шрифта, вероятно, является особенным и не включает использование, подобное показанному на изображении. Это говорит о том, что следует пересмотреть выбор шрифта, но предположим, что он исправлен.

Есть несколько способов справиться с проблемой. Если под буквами слишком много места, уменьшение line-height делает его меньше, но это также влияет на пространство над буквами. Верхний отступ в некотором смысле помогает, но он увеличивает общую высоту, занимаемую элементом. Вы также можете поиграть с vertical-align, но это влияет на высоту строчных полей.

Вероятно, самый простой подход - использовать относительное позиционирование, предполагая, что проблема связана с однострочным текстом. Относительное позиционирование просто перемещает контент определенным образом, в противном случае не влияя на макет. Для этого вам понадобится оболочка, то есть элемент, содержащий текст, чтобы вы могли смещать только текст, а не фон.

В следующей демонстрации используется шрифт Google Candal, который имеет аналогичную проблему, но в другом направлении: базовая линия слишком низкая. Модификации этого подхода для решения исходной проблемы должны быть очевидны, но точная величина смещения должна быть определена эмпирически (или на основе информации, извлеченной из файла шрифта с помощью инспектора шрифтов). Естественно, здесь следует использовать единицу em, даже если вы устанавливаете размер шрифта в пикселях или пунктах (чтобы не нужно было менять код, если размер шрифта когда-нибудь изменится).

<link href='http://fonts.googleapis.com/css?family=Candal' rel='stylesheet'>
<style>
div { font-family: Candal }
div { background: lightgreen; font-size: 200%}
</style>
<p>What we have got initially:
<div>BRAKE HOSE AND AIR CHAMBER</div>
<p>Reducing line height (even “setting solid”) does not really help:
<div style="line-height: 1">BRAKE HOSE AND AIR CHAMBER</div>
<p>But displacing the text upwards by 0.1em does:
<div><span style="position: relative; bottom: 0.1em">
BRAKE HOSE AND AIR CHAMBER</span></div>

person Jukka K. Korpela    schedule 23.01.2015
comment
Это работает, но я ищу масштабируемый способ изменить это во всем моем элементе (кнопка / ввод), я не могу поместить диапазон в каждую кнопку, и это не исправит выравнивание ввода. - person kirkas; 23.01.2015
comment
Для кнопок метод заполнения, вероятно, работает достаточно хорошо. Однако, как правило, если шрифт вызывает подобные проблемы, следует выбрать другой шрифт. - person Jukka K. Korpela; 23.01.2015

Это то, с чем я столкнулся недавно. Базовая линия шрифтов, которые я использовал по какой-то причине, не совпадала, поэтому я выровнял ее по низу и увеличил высоту строки вместо добавления отступов.

Вот как я решил свою проблему: если у вас есть ссылка на ручку с кодом, я могу проверить, сработает ли она для вас или будет лучше другое решение.

p {

    vertical-align: text-bottom;
    line-height: 1.5;

}
person Sara Mote    schedule 23.01.2015
comment
Я пробовал, но это ничего не изменило, я не могу добавить код, так как этот шрифт защищен - person kirkas; 23.01.2015

В конце концов, я сам вручную исправил шрифт, воспользовавшись помощью из этого ответа:

вертикальное выравнивание пользовательского шрифта UIButton

person kirkas    schedule 30.01.2015

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

Вы пробовали fontsquirrel? Есть несколько вариантов с разными результатами.

http://everythingfonts.com/font-face

http://www.font2web.com/

http://www.fontsquirrel.com/tools/webfont-generator

https://www.web-font-generator.com/

person Marc    schedule 23.01.2015
comment
Fontsquirrel имеет возможность изменять высоту по оси x, за исключением того, что шрифт из fontshop защищен. - person kirkas; 23.01.2015

В Chrome я обнаружил, что если вы используете объявление font-face. Вы можете решить проблему с высотой строки либо вызовом style = "" в HTML, либо просто объявив высоту строки ПОСЛЕ объявления шрифта в вашем CSS.

Я думаю, что Chrome просто не знает, как рассчитать высоту строки, пока не отобразит пользовательский шрифт.

person chrisallick    schedule 30.08.2016