Хобрук: Ваш путь к мастерству в программировании

Line-Height не соответствует размеру шрифта

Когда у меня есть две строки текста с разным размером шрифта, они перекрываются. Посмотрите на этот пример: http://jsfiddle.net/3WcMG/1/

Все «j» и «g» скрывают to второй строки. Это происходит со всеми основными шрифтами.

Почему это так действует? Что я могу сделать, чтобы избежать этого?

EDIT: я знаю, что означает «em», я знаю, как использовать поля, я знаю, как увеличить высоту строки, я знаю, каков эффект сброса css JSFiddle, и это не мой вопрос. Мой вопрос: почему нижняя часть «j» находится за пределами текста? Похоже, если я поставлю отрицательную маржу-верх во второй строке (за исключением того, что я этого не сделал, по умолчанию это выглядит так). Есть ли способ сделать так, чтобы шрифт помещался в поле.

EDIT2: Кажется, это проблема браузера! Я использую Chrome 21.0 на Mac и вижу следующее: screenshot

08.08.2012

  • если вы снимите флажок Normalized CSS в левом меню jsfiddle.net и обновите скрипт, вы увидите такой результат: jsfiddle.net/akhurshid/3WcMG/2 08.08.2012
  • Это связано с сбросом CSS. 08.08.2012
  • Дайте вашему <p> несколько верхних полей, чтобы избежать склеивания двух тегов <p> 08.08.2012
  • См. пример с top-margin 08.08.2012

Ответы:


1

1em равен 1-кратному количеству пикселей в размере шрифта. Итак, если ваш font-size равен 60px, 1em = 60px. Если это 14px, 1em = 14px и так далее. Установка line-height на 1em делает его равным 1-кратному количеству пикселей.

Может возникнуть некоторая путаница, потому что высота строки по умолчанию, установленная таблицей стилей пользовательского агента, обычно составляет около 1,5 em, поэтому 12px font-size приведет к 18px line-height.

единица em
Равен вычисляемому значению свойства font-size элемента, для которого оно используется.

Источник: http://www.w3.org/TR/css3-values/#font-relative-lengths
См. также: http://www.w3.org/TR/CSS21/syndata.html#length-units

Исходя из этого, ваш исходный пример - это именно то, что я ожидал увидеть. Для справки, вот что я вижу в Chrome:

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

Ваша первая строка имеет высоту 60 пикселей, но вычисленное значение (термин W3) второй составляет 14 пикселей (продиктовано примененным к ней классом). Оба имеют line-height из 1em. Таким образом, line-heights составляют 60px и 14px соответственно. Поскольку это то же самое, что и размеры шрифта, две линии соприкасаются (это может варьироваться от шрифта к шрифту).

Если вы видите перекрывающееся поведение, это другая проблема.

Чтобы изменить поведение, вы можете использовать другую высоту строки, отступы, поля и т. д. В качестве примечания: rem единицы могут быть более интуитивно понятными, хотя отсутствует поддержка в старых браузеры.

Обзор единиц CSS см. на странице http://css-tricks.com/css-font-size/

Шрифты не выровнены по краям поля

Обновленный вопрос/проблема

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

Что касается обновленного вопроса, см.: http://www.w3.org/TR/css3-fonts/#propdef-font-size, в котором говорится, что:

Обратите внимание, что некоторые глифы могут просвечиваться за пределами их поля EM.

Это происходило в разной степени с разными шрифтами, которые я пробовал (у некоторых растекаются оба X/Y, у некоторых в одном направлении, у некоторых вообще нет).

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

Я думаю, что line-box-contain: glyph может иметь значение, но я вижу, что он упоминается только в черновике редактора, и я уверен, что поддержка браузера отсутствует/несовместима.

http://dev.w3.org/csswg/css3-linebox/#line-box-contain

08.08.2012
  • Обычно я бы рекомендовал избегать ссылок на нестабильные ED, если только они не являются единственным доступным или наиболее подходящим ресурсом. Обратите внимание на менее часто изменяемые WD w3.org/TR/css3-values. /#font-relative-lengths или, что еще лучше, стабильная рекомендация w3.org/TR/CSS21/syndata.html#length-units Хотя единицы измерения em, вероятно, не будут меняться вечно, все же рекомендуется ссылаться на более стабильные ресурсы :) 08.08.2012
  • Обновлено, чтобы использовать ваши ссылки. Спасибо. 08.08.2012
  • Я понимаю, что означает эм. Дело в том, что шрифт кажется больше 60 пикселей, так как он перекрывает вторую строку. Я отредактировал свой пост. 08.08.2012
  • @tibo - тогда извините за учебник ... из вашего первого поста не было ясно, чего вы хотите. Рендеринг, кажется, зависит от шрифтов; некоторые рендерятся немного вертикально вне поля, некоторые горизонтально. Я не уверен, что есть лучшее объяснение, чем размеры шрифта, которые не совсем соответствуют положению, в котором они должны быть (проведение небольшого исследования). 08.08.2012
  • @TimMedora Спасибо за ваши обновления. Похоже, проблема в системе браузера, может быть, на Mac шрифт немного отличается и перекрывается ... Это отстой! :( 08.08.2012
  • @tibo - ваш CSS выберет Helvetica на Mac, который, вероятно, имеет другую коробку, чем Arial (который будет выбран на большинстве ПК, и почему я не видел проблемы). Trebuchet MS на самом деле был лучшим для меня на ПК (полностью упакованный в коробку). Это комбинация определения шрифта и рендеринга браузера. 08.08.2012
  • @TimMedora - Спасибо за ваши ответы. Кажется, нет такого волшебного трюка, как рендеринг шрифта: fit-em-box;... 09.08.2012

  • 2

    Увеличьте высоту строки в вашем CSS

    line-height: 2em; (от 1 до 2em)

    Который находится в элементе p.

    08.08.2012

    3

    Вы можете указать для своего «тестового» класса line-height или margin-top все, что вам удобно.

    .test{
        font-size: 14px;
        line-height:18px;
    }
    
    08.08.2012
  • Это не решает мою проблему. Мне нужно, чтобы шрифт был точно в em-box, если я исправлю хром на mac, высота строки будет слишком большой для другой платформы (например, chrome на windows или firefox на mac) 09.08.2012
  • может быть, вы можете попробовать дать margin-top классному тесту. jsfiddle.net/3WcMG/12 09.08.2012

  • 4

    Высота строки по умолчанию является относительным размером, например, 150% размера шрифта в p. Если вы измените высоту строки с помощью em или %, браузеры интерпретируют это как «em/% по сравнению с размером шрифта».

    http://jsfiddle.net/P7LaP/

    <div class="small">
        <p>Normal pq</p><br/>
        <p class="short">Short pq</p><br/>
        <p class="tall">Tall pq</p><br/>
    </div>
    <div class="normal">
        <p>Normal pq</p><br/>
        <p class="short">Short pq</p><br/>
        <p class="tall">Tall pq</p><br/>
    </div>
    <div class="large">
        <p>Normal pq</p><br/>
        <p class="short">Short pq</p><br/>
        <p class="tall">Tall pq</p><br/>
    </div>
    

    В примере есть три набора из трех тегов p с нормальной высотой, коротким и высоким. В то время как три набора - это размер шрифта.

    p {
        color: ffffff;
        background: #777777;
    }
    .short { line-height: 1em; }
    .tall { line-height: 2em; }
    .small { font-size: 8px; }
    .normal { font-size: 16px; }
    .large { font-size: 32px; }
    

    Надеюсь, это поможет. Я точно не знаю, что вы пытаетесь сделать, но, похоже, вам следует просто удалить строку высоты строки из таблицы стилей.

    11.05.2014
    Новые материалы

    Введение в контекст React
    В этом посте мы поговорим о Context API, который был представлен в React 16, и о том, как вы можете их использовать. Что такое контекст? Глядя на определение из react docs , оно..

    Шлюз с лицензией OSS, совместимый с Apollo Federation v2, появится в WunderGraph
    Сегодня мы рады сообщить, что мы сотрудничаем с поддерживаемой YC Tailor Technologies, Inc. для внедрения Apollo Federation v2. Реализация будет лицензирована MIT (Engine) и Apache 2.0..

    Это оно
    Ну, я официально уволился с работы! На этой неделе я буду лихорадочно выполнять последние требования Думающего , чтобы я мог сосредоточиться на поиске работы. Что именно это значит?..

    7 полезных библиотек JavaScript, которые вы должны использовать в своем следующем проекте
    Усильте свою разработку JavaScript Есть поговорка «Не нужно изобретать велосипед». Библиотеки — лучший тому пример. Это поможет вам написать сложные и трудоемкие функции простым способом...

    Базовое руководство по переносу концепций обучения в глубокое обучение
    Обзор По мере того, как машинное обучение становится все более мощным и продвинутым, модели, обеспечивающие эту расширенную возможность, становятся все больше и начинают требовать огромного..

    C в C.R.U.D с использованием React-Redux
    Если вы использовали React, возможно, вы знакомы с головной болью, связанной с обратным потоком данных. Передача состояния реквизитам от родительских компонентов к дочерним компонентам может..

    5 обязательных элементов современного инструмента конвейера данных
    В цифровом мире предприятия используют конвейеры данных для перемещения, преобразования и хранения огромных объемов данных. Эти конвейеры составляют основу бизнес-аналитики и играют..