Почему в этом примере нет единичной высоты линии в зависимости от процента или em? - программирование
Подтвердить что ты не робот

Почему в этом примере нет единичной высоты линии в зависимости от процента или em?

Я озадачен поведением следующего CSS, также проиллюстрированного в этой скрипте.

<style type="text/css">
p {
    font-size: 14px;
}

.percentage {
    line-height: 150%;
}

.em-and-a-half {
    line-height: 1.5em;
}

.decimal {
    line-height: 1.5;
}

.smaller {
    font-size:50%;
}

.caption {
    font-weight: bolder;
    font-size: 80%;
}

</style>

<p class="caption">default line spacing</p>

<p>This tutorial provides a brief introduction to the
programming <span class="">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>

<p>This tutorial provides a brief introduction to the
programming <span class="smaller">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>


<p class="caption">line-height: 150%</p>

<p class="percentage">This tutorial provides a brief introduction to the
programming <span class="">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>

<p class="percentage">This tutorial provides a brief introduction to the
programming <span class="smaller">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>


<p class="caption">line-height: 1.5em</p>

<p class="em-and-a-half">This tutorial provides a brief introduction to the
programming <span class="">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>

<p class="em-and-a-half">This tutorial provides a brief introduction to the
programming <span class="smaller">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>


<p class="caption">line-height: 1.5</p>

<p class="decimal">This tutorial provides a brief introduction to the
programming <span class="">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>

<p class="decimal">This tutorial provides a brief introduction to the
programming <span class="smaller">language</span> by using one of its picture-drawing
libraries. This tutorial provides a brief introduction to the programming language. This tutorial provides a brief introduction to the programming language.</p>

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

Следующие два абзаца имеют line-height: 150%. Опять же, второй абзац имеет одно слово, которое меньше. Но на этот раз, по непонятным причинам, меньший шрифт создает дополнительное пространство между первыми двумя строками (по крайней мере, в Safari, Chrome, Firefox и Explorer). Это оригинальная проблема в моем CSS, которую я пытался исправить. (Я предполагаю, что это как-то связано с тем, что браузер сжимает слово, а затем сдвигает его вниз по вертикали, чтобы перестроить базовые линии.)

Следующие два абзаца имеют line-height: 1.5em. Я понимаю, что 1.5em совпадает с 150%. И действительно, поведение одно и то же: дополнительное пространство между двумя первыми параграфами второго абзаца.

Но здесь, где он становится странным: следующие два абзаца имеют line-height: 1.5 - ни одна единица не указана. На этот раз проблема с дополнительным пространством исчезает.

6bJu2.png

В целом, CSS, похоже, дает согласованные результаты межстрочного интервала, когда высоты строк родительского и дочернего элементов различаются (через наследование безраздельного значения), но несогласованные результаты, когда высоты строк родителя и дочернего объекта одинаковы,

Таким образом, мои вопросы:

  • Я знаю там намеренную семантическую разницу в спецификации CSS между 1.5 и 150% или ее синонимом 1.5em. (А именно: единичное значение передается дочернему элементу, а его высота строки вычисляется с использованием размера дочернего шрифта, тогда как процентное значение или значение em приведет к вычислению высоты строки для родителя, а затем это расчетное значение передается ребенок.) Но как это объясняет разницу в поведении, наблюдаемую здесь? Откуда появляется дополнительное пространство? Если это следствие некоторого правила позиционирования CSS, то что это за правило?

  • Или, если эти примеры должны отображаться одинаково, то какой из них выполняется неправильно? (Примечание по Q2: тот факт, что quirk визуализации происходит одинаково в разных браузерах, настоятельно указывает на то, что ни один из них не реализован неправильно, что вернет вас к вопросу (1).)

  • В практическом плане есть недостаток в переключении на безразмерные измерения, такие как 1.5 для line-height? (Ответ: нет)

4b9b3361

Ответ 1

Основываясь на подсказках в предлагаемых ответах, я думаю, что поведение рендеринга, рассматриваемое в этих примерах, противоречиво, но верно и обусловлено взаимодействием нескольких правил в спецификации и общей CSS box model.

  • CSS вычисляет ведущий L, необходимый для ящика по формуле line-height= L + AD, где AD " расстояние от вершины до Дно " шрифта. Затем "половина лидера добавляется над A, а другая наполовину ниже D. "Так что текст, который имеет font-size:16px и line-height:24px будет иметь 4px ведущих выше и ниже. Текст что font-size:8px и line-height:24px будут иметь 8px ведущих выше и ниже.

  • По умолчанию, однако, " пользовательский агент должен выровнять глифы... своими Соответствующий исходные условия. ". Это начинает объяснять, что происходит здесь. Когда line-height заданное в процентах или em, вычисленное значение наследуется (здесь, smaller span). Смысл, диапазон smaller тот же line-height как родительский блок. Но из-за L + AD, текст этого интервала имеет большее лидерство на вершине и снизу, и, таким образом, базовая линия находится выше в своем поле. Браузер толкает вниз по шкале smaller вертикально, чтобы соответствовать базовым линиям.

  • Но тогда у браузера возникла новая проблема - как справиться с линией интервал в закрывающем блоке, который был нарушен этим процесс корректировки базовой линии. Спецификация также разрешает это: line-height элемента блока уровня " указывает минимальный высота строк в пределах элемент ". Смысл, CSS не дает никаких обещаний, что вы получите line-height, просто вы получите хотя бы ту сумму. Итак браузер отталкивает строки в закрывающем блоке так, чтобы Реализованный дочерний ящик будет соответствовать.

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

Это все еще оставляет нам объяснение поведения в примере с безразмерной высотой строки:

  • Во-первых, обратите внимание, что когда не указано line-height, браузер по умолчанию будет применяться безразмерная высота строки. Это требуемое спецификации: начальное значение line-height равно normal, которое определяется как имеют "то же значение, что и" номер > ", и спецификация рекомендует значение "между 1.0 и 1.2". И это согласуется с тем, что мы видим в приведенных выше примерах, где абзацы с line-height: 1.5 имеют такое же поведение, как и абзацы без установки высоты линии (т.е. они подразумевают получение line-height: normal)

  • Как указывали другие, когда в абзаце line-height: 1.5, расчетная высота строки абзаца равна не унаследованный диапазоном smaller. Скорее, диапазон smaller вычисляет собственную высоту линии на основе собственного размера шрифта. Когда параграф имеет line-height: 1.5; font-size: 14px, то его расчетная высота линии составляет 14px * 1.5 = 21px. И если smaller span имеет свойство font-size: 50%, тогда его размер шрифта равен 14px * 50% = 7px, а его высота линии 7px * 1,5 = 10,5px (что обычно округляется до целого пикселя). Но в целом, smaller - половина размера окружающего текста.

  • Как и раньше, браузер будет вертикально выравнивать диапазон smaller до смежная базовая линия. Но на этот раз, потому что коробка вокруг smaller короче, чем окружающий текст, эта перестройка не имеет побочных эффектов в закрывающем блоке. Это уже подходит, поэтому нет необходимости распространять строки родительского абзаца, так как было раньше.

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

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

К сожалению, похоже, что нет никакого способа прямого установления точного интервала между строками в CSS, как это можно сделать в текстовом редакторе или программе компоновки страниц. Опять же, это связано с моделью CSS-блока: он не использует модель линейного интервала базовой линии к базовой линии, а line-height определяется как минимальное измерение, а не максимум.

Но мы можем, по крайней мере, сказать, что единичные значения высоты линии дают наилучшее приближение точного межстрочного интервала в CSS. Суетливые типографы, такие как я, должны чувствовать себя комфортно, используя их, потому что безразмерные ценности одобрены спецификацией, и они дают согласованные результаты в браузерах. Они не являются взломом и не устарели.

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

Ответ 2

ИЗМЕНИТЬ

Я создал codepen для продемонстрировать ведущее, созданное с использованием разных значений. Надеюсь, это дает лучшее объяснение.


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

Ваши вопросы

Есть ли намеренная семантическая разница в CSS между 1,5 и 150%, что объясняет разницу в поведении?

Есть, на самом деле!

Числовой коэффициент (1,5 в этом случае) наследуется и используется для вычисления высоты строки каждого потомка относительно его размера шрифта.

Процентный коэффициент (150%) используется для вычисления высоты строки на основе размера шрифта родительского элемента. Полученное, предварительно вычисленное значение затем наследуется его потомками.

Или, если они должны быть одинаковыми, то какой из них выполняется неправильно?

Они намеренно разные. (См. спецификация W3C)

С практической точки зрения, есть ли недостаток в переключении на необработанные десятичные числа, такие как 1,5 для высоты линии?

Как правило, это преимущество использования десятичных значений, потому что унаследованная линия-высота будет лучше адаптироваться. Но есть случаи, когда это не подходит вашим потребностям.


Проблема с дополнительным интервалом

Я заметил, что если я установил vertical-align на ваш небольшой текст на middle или bottom, проблема не будет. Но это не очень хорошее решение.

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

Итак, скажем, базовый размер шрифта - 16 пикселей, а высота линии - 24 пикселя. Ведущий будет 4px с обеих сторон ((24-16)/2). Когда размер шрифта составляет 50%, это 8 пикселей, но высота строки остается 24px. Таким образом, ведущий становится 8px с обеих сторон ((24-8)/2).

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

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

Я не знаю, помогает ли это вообще, но я определенно лучше понимаю, как line-height работает вообще сейчас!

Литература: http://www.w3.org/wiki/CSS/Properties/line-height http://meyerweb.com/eric/thoughts/2006/02/08/unitless-line-heights/ http://www.maxdesign.com.au/articles/css-line-height/

Ответ 3

Кажется, что простой ответ на ваш вопрос: наследование. line-height: 150% и line-height: 1.5em в вашем примере наследует значение компьютера его родителя, тогда как числовое значение не равно.

В вашем примере родительский <p> имеет высоту строки 21px, если вы используете процент или ems для указания высоты строки вашего вложенного элемента <span class="small">, он будет вычисляться на основе унаследованного вычисленного значения 21px; 21 * 1,5 = 31,5, но если вы используете числовое значение для высоты строки, оно будет рассчитываться на основе фактического размера шрифта; (14 * 0,5) * 1,5 = 10,5.

У вас есть отличный ответ на ваш вопрос здесь.

Ответ 4

Мэтью, попробуйте добавить "line-height: 1.5em;" в класс ".smaller". Решает ли она проблему для всех объявлений?

Я думаю, что это произойдет, и если так, то это должно быть вопросом наследства. Разница между 1.5em/150% и 1.5 (без какой-либо единицы) заключается в том, что первые два вычисляют значение и устанавливают его по абсолютной величине на свой элемент, поэтому дочерний элемент этого элемента без собственного объявления строки-высоты наследует вычисленное значение, а не процент.

Объявление высоты строки без единицы, однако, имеет другой результат для этого дочернего элемента, потому что то, что наследуется на самом деле, - это число (1,5 - в вашем случае), которое будет снова вычислено на дочернем элементе в результате значение, связанное с его собственным размером шрифта, а не его родителями.

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

<number>

Используемое значение свойства - это число, умноженное на размер шрифта элемента. Отрицательные значения являются незаконными. Вычисленное значение совпадает с указанным значением.

<percentage>

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

В этом разница: что фактически вычисляется. Когда вы объявляете строку в процентах (или используя ems), вычисленное значение является приведенным значением numerica, тогда как в случае безразмерного объявления вычисленное значение совпадает с объявленным значением, которое позволяет дочерний элемент для повторного компрометации.

Тем временем, я сделал тест, и я думаю, что был прав.

Когда вы объявляете высоту строки в процентах (или используя ems), вычисленное значение наследуется элементом span. Таким образом, высота строки элемента span будет 24px вместо 13.5px. Но, поскольку размер шрифта элемента span на самом деле меньше, приведенный ниже результат будет больше, чем его родительский. (24px-9px)/2=7.5px. Таким образом, вы получите 7.5px ниже, а не (24-16)/2 (4px). В итоге вы получите дополнительный 7,5px-4px (3.5px).