Может ли конкретный текстовый символ изменять высоту строки - PullRequest
3 голосов
/ 04 мая 2019

У меня есть этот код:

<p style="line-height: 1;overflow: hidden;">blah_blah</p>
<p>blah_blah</p>

<p style="line-height: 1;overflow: hidden;">qypj;,</p>
<p>qypj;,</p>

, что приводит к (обратите внимание, нет подчеркивания и вырезать символы): <Ч /> enter image description here

<Ч />

То есть, в Firefox он ведет себя так (66.0.3 в Windows 10). Другие браузеры, кажется, отображают подчеркивание. Приведенный выше фрагмент кода также работает (даже в Firefox), если вы не запускаете его в «Полная страница».

Этот Q аналогичен Высота текста изменяется после добавления символа юникода , за исключением случаев, когда здесь нет трюков. «_» - это простой символ ASCII.

Мой вопрос в том, какое поведение является правильным. Разрешено ли конкретному символу изменять высоту строки (я думал, что она должна зависеть только от шрифта)? Разве line-height: 1 не подразумевает, что он может вписаться точно в любой текст?

Полагаю, некоторые символы являются особыми, например, "p", "g", "j" (и, возможно, "_"), которые рисуются ниже его линии. Тем не менее, какое поведение является правильным. Это считается переполнением или нет?

PS: Кроме того, я нахожу это забавным либо overflow-x: hidden;overflow-y: visible; и overflow-x: visible;overflow-y: hidden; все еще вызывает это. Что для меня больше похоже на настоящую ошибку.

Ответы [ 3 ]

1 голос
/ 04 мая 2019

Мой вопрос в том, какое поведение является правильным.

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

Можно ли использовать определенный символизменить высоту строки (я думал, что она должна зависеть только от шрифта)?

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

Разве высота строки: 1 означает, что она может вписаться точно в любой текст?

Не обязательно, line-height:1 означает, что поле строки будет равно 1xfont-size 1 но предназначен ли шрифт для включения всех символов внутри этого пространства?Вероятно, большинство из них подойдет, но мы не знаем.


В принципе, у вас есть две вещи для рассмотрения. область содержимого , которая определяется свойствами шрифта, и строка line , которая определяется высотой строки.У нас нет контроля над первым и мы можем контролировать только второе.

Вот базовый пример для иллюстрации:

span {
 background:red;
 color:#fff;
 font-size:20px;
 font-family:monospace;
}

body {
 margin:10px 0;
 border-top:1px solid;
 border-bottom:1px solid;
 animation:change 2s linear infinite alternate;
}

@keyframes change {
  from {
    line-height:0.2
  }
  
  to {
    line-height:2
  }
}
<span >
blah_blah
</span>

Красная область - это наша область содержимого, ее высота определяется свойствами шрифта, и если вы осмотрите элемент, то увидите, что он имеет высоту, равную 23px (не 20px как font-size) и границы определяют наш линейный блок, который мы контролируем, используя высоту строки.

Так что, если line-height равен 1, у нас будет линейный блокравно 20px, что недостаточно для содержания 23px области содержимого, поэтому оно будет усечено, и мы, возможно, можем скрыть некоторые символы (или их часть), что логично:

span {
  background: red;
  color: #fff;
  font-size: 20px;
  font-family: monospace;
}

body {
  margin: 5px;
  line-height: 1;
  overflow:hidden;
}

html {
 overflow:auto;
}
<span>
blah_blah ÂÄ j p
</span>

другой font-size удалит подчеркивание в Firefox:

span {
  background: red;
  color: #fff;
  font-size: 26px;
  font-family: monospace;
}

body {
  margin: 5px;
  line-height: 1;
  overflow:hidden;
}

html {
 overflow:auto;
}
<span>
blah_blah ÂÄ j p
</span>

enter image description here

Еще один пример со шрифтом Google, где результатом должен быть тот же кросс-браузер.Подчеркивание является видимым, но не ^ / ¨

span {
  background: red;
  color: #fff;
  font-size: 26px;
  font-family: 'Gugi', cursive;

}

body {
  margin: 5px;
  line-height: 1;
  overflow:hidden;
}

html {
 overflow:auto;
}
<link href="https://fonts.googleapis.com/css?family=Gugi" rel="stylesheet">
<span>
blah_blah ÂÄ j p
</span>

enter image description here

Другой пример, где подчеркивание не видно:

span {
  background: red;
  color: #fff;
  font-size: 27px;
  font-family: 'PT Sans', sans-serif;

}

body {
  margin: 5px;
  line-height: 1;
  overflow:hidden;
}

html {
 overflow:auto;
}
<link href="https://fonts.googleapis.com/css?family=PT+Sans" rel="stylesheet">
<span>
blah_blah ÂÄ j p
</span>

enter image description here

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


Смежные вопросы:

Понимание спецификации CSS2.1 относительно высоты на встроенных блоках

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

Проблема высоты строки с элементами inline-block


Вот хорошая статья, чтобы получить более точные данные и расчеты: https://iamvdo.me/en/blog/css-font-metrics-line-height-and-vertical-align

Цитата из этой статьи:

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

enter image description here


1: я рассмотрел упрощенное объяснение, но в действительности вычисление линейного блока относится не только к свойству line-height. Проверьте ниже ссылки для более точного и полного объяснения

1 голос
/ 04 мая 2019

Если я использую инструменты браузера в Firefox для проверки моего фрагмента ниже, то между линиями с подчеркиванием и без подчеркивания разницы в высоте нет.Единственная разница вызвана настройкой line-height: 16px с line-height: 1, 19.2 px с высотой строки браузера по умолчанию.Таким образом, подчеркивание здесь не имеет значения (Firefox 66.0.3 на Mac), и это видно в обоих случаях.

Обратите внимание, что я установил поля на 0, чтобы увидеть «чистую» высоту линии без расстояний между линиями.Кроме того, я не указал параметр font-familiy, поэтому используется стандартный шрифт браузера для тегов p.

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

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

html,
body {
  margin: 0;
  padding: 0;
}

p {
  background: #fb6;
  margin: 0px;
}
<p style="line-height: 1;overflow: hidden;">blah_plah</p>
<p style="line-height: 1;overflow: hidden;">blah plah</p>
<p>blah_plah</p>
<p>blah plah</p>
0 голосов
/ 04 мая 2019

высота строки по умолчанию (в зависимости от семейства шрифтов), если не указано иное, составляет около 1,2 в большинстве браузеров. Это включает в себя Firefox.

Это объясняет, почему подчеркивание не отображалось в FireFox, когда высота строки была установлена ​​на 1 - нижняя часть линии была обрезана. Так что я не думаю, что это полностью связано со шрифтом (хотя это действительно способствует), но также и по умолчанию в браузере.

Некоторые размеры шрифтов больше, чем другие, даже при, казалось бы, «одинаковом» размере шрифта (как, я уверен, вы видели при наборе документов, например, в Georgia vs Times new Roman / Baskerville; этот текст всегда будет отображаться на указанной высоте строки 1 (или 1,2). Однако существуют способы измерения шрифта в пикселях

Надеюсь, это поможет

...