Глубокое погружение в CSS Font Metrics и CSS Boxes

CSS шрифт
Глубокое погружение в CSS Font Metrics и CSS Boxes

头图

На этой картинке показаны 8 разных шрифтов, из которых первый и второйfont-awesomeЗначки, значок пользовательского шрифта, за которым следует остальная часть шрифтаAvenir,Trebuchet MS,Arial,Helvetica,Hiragino Sans GB,STXihei.Исходный код здесь. Из этих персонажейfont-size:100pxНо не та же учетная высота. Некоторые из 100 пикселей, некоторые больше 100 пикселей. Далее видно, что вертикальное направление не отцентровано.

  • fontПринцип работы и метрики
  • CSS box modelsтип, определение

метрики шрифта

Чтобы понять ответ на поставленный выше вопрос, нужно начать со шрифтов:
мы вывозимAvenir,Helvetica,Hiragino Sans GBТри шрифта для анализа
字体占行高
Как видно из рисунка выше, когда мы устанавливаемfont-size:100px, высоты, занимаемые текстом, равны137px,115pxа также100px.
感觉有点懵啊。 какfont-size:100px
EM Square

传统的金属字模

правила определения шрифта

  • Высота букв называется "em», цифровыми шрифтамиem- это цифровой объем пространства.emразмер (следующее записывается как:EM size)как правило1000единиц, в шрифтах TrueType,EM sizeУсловное обозначение представляет собой степень числа 2, обычно 1024 или 2048.
  • В зависимости от единиц, в которых он фактически используется, размеры шрифтов могут основываться на некоторыхнастраиватьРешать.注意,有些值是em-square之外的值。
  • В браузерах относительные единицы используются для масштабирования в соответствии с желаемымfont-size

настройки шрифта

字体的设置
Это легенда, подробно объясняющая настройки шрифта, значение каждого атрибута на рисунке:

  • baseline (исходный уровень): отдельныйascentа такжеdescent, По умолчанию символ днаbaselineРасполагаются, как показано в P, x, Ё (для русских символов)
  • ascent (ростascentfont-familyПринимать решение
  • descent (отклонитьdescentfont-familyПринимать решение
  • xHeight (): символы нижнего регистраxВысотаfont-familyПринимать решение
  • capHeight (Верхняя высота): более крупные символыPвысота, поfont-familyПринимать решение
  • lineSpacing (Межстрочный интервал): в браузере нормальноlineSpacing = ascent + descent
  • lineHeight(высота строки): по умолчанию равноlineSpacingline-heightнастройка влияет, если установленаline-height,lineHeightравныйline-height.
  • half-leading (половинный межстрочный интервал): еслиlineHeight > lineSpacing,ноlineHeightа такжеlineSpacingБудет производить междуравные вверх и внизVoid (lineHeight - lineSpacing) / 2 указанополовинный межстрочный интервал(half-leadingилиhalf lead strips).

Расчет высоты, занимаемой персонажами

Итак, после понимания вышеизложенных концепций вы можете ответить, почемуfont-size:100pxКогда это другая проблема.
Сначала загрузите профессиональное программное обеспечение для шрифтов.FontForge, программа работает наxquartz, поэтому вам нужно установить оба.

Облачный канал Baidu

После установки начинаем сAvenirПример шрифта для анализа.
Avenir 字体详情截屏

  • EM sizeдля1000
  • ascentдля1000,descentдля366
  • capHeightдля708
  • xHeightдля468

это означаетAvenirЕдиницы шрифта в 1000EM sizeиспользуется в1000 + 366font-size:100px100px * (1000 + 366 ) ≈ 137px.
Эта расчетная высота определяетСодержимое элемента (область содержимого)высота эквивалентнаbackgroundАтрибуты.

Avenir 字体解析图

CSS box models

Далее мы выглядим глубоко,CSS box models.你可能不知道什么CSS box models, но вы можете не поверить в это. На самом деле я боюсь, что самый распространенныйCSS box models.

Блочная коробка/содержащая коробка

Например, если есть простой текст, может быть несколько столбцовbox. то этот абзац называетсяContaining BoxПричина, по которой он так назван, вероятно, потому, что он содержит многоboxБар. (Ха...) Конечно, вы также можете назвать этоBlock Box, потому что онКусок. Проще говоряContaining Boxа такжеBlock Box
Block Box演示

Inline Box (в поле)

Inline Box. ЭтиBoxНе какBlock Box
Inline Box演示
В приведенном выше примере<em/>курсивный элементявляется типичнымInline Box.

Анонимная встроенная коробка

Inline BoxСталAnonymous inline Box.
Anonymous Inline Box演示

всеInline BoxсуществуетContaining Boxрасположенные рядом друг с другом, они образуютLine Box. должны знать о том,Line BoxНевозможно увидеть прямо.
Line Box演示

Content area

Content area
Content areaвокруг текстаневидимая рамка. И мы также доказали в разделе о измерении шрифта, что его высота даетсяfont-sizeПринимать решение.

Более подробные определения и описания можно найти в спецификации CSS 2.1.визуальная модель форматирования(Visual formatting model) раздел для чтения.
Китайская станция|Официальный сайт W3C

Inline Boxа такжеLine Box

Как Inline Box влияет на Line Box

Line boxвысота наLine Boxсамый высокий вInline Box(илиReplaced Element)Конечно.
самый высокийInline Boxможет бытьAnonymous Inline Box.
line-box-with-anonymous-Inline-box

Это может быть и повышение.line-heightизInline Box. Из-за увеличенияline-heightboxвыше.
line-box-with-increased-Inline-box

font-sizeизInline BoxInline BoxInline Boxвыше.
line-box-with-increased-font-size

В зависимости от браузера на него также может повлиять верхний или нижний индекс. потому что некоторые браузерыLine boxСпособ представлятьливые элементы наверху.
line-box-with-superscript-inline-box

Мы можем установить<sup/>,<sub/>изline-height0, чтобы решить эту проблему.

sub, sup { line-height: 0; }

Inline Boxможет быть предметомReplaced Element(Такие как:<img/>,<input/>,<svg/>) Влияние.

line-box-with-replaced-element

Inline Box разрывает Line Box

Как мы можем видеть,Line Boxдобавит все встроенныеInline Boxвысота.
line-box-addtional-inline-box-height
Однако иногдаInline Boxчасть его лопнетLine Boxсверху или снизу. Например, у кого естьpadding,margin,borderизInline Box. из-заInline BoxВысота не может быть задана (если задана, то тоже зря). Таким образом, он будет отображаться выше и ниже элементаpadding,margin,borderНо не влияетLine Box.
Уведомление:дляReplaced Element,inline-blockpadding,margin,borderЭто увеличит высоту, поэтомуLine BoxТакже повлияет высота.
inline-box-poke-out-line-box
Браузер будет отображать документы в том порядке, в котором они представленыLine Box. Итак, в последующих строкахborderМожет переопределитьborderи текст.
pants-over-previous-line

Справочная статья
элементы макета в вертикальном направлении линии


Deep dive line-height