Подтвердить что ты не робот

Ввод текста в Chrome: высота линии, по-видимому, минимальна

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

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

Пример HTML:

<div>
  <input type="text" value="Text">
  <input type="text" placeholder="Text">
  <span>Text</span>
</div>

CSS

div {
  line-height: 50px;
  font-family: Arial;
}

input,
span {
  font-size: 50px;
  line-height: 50px;
  height: 50px;
  width: 100px;
  padding: 0;
  min-height: 0;
  display: inline-block;
  font-family: inherit;
  border: 2px solid red;
  overflow: hidden;
  vertical-align: top;
}

И результаты можно увидеть на

http://plnkr.co/edit/oHbhKDSPTha8ShWVOC7N?p=preview и в следующем скриншоте из Chrome 44.0.2403.155 (64-разрядная версия) в Linux:

Текстовый ввод со значением, ввод текста с помощью заполнителя и диапазона

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

Как я могу стилизовать все 3 элемента, чтобы текст находился в том же положении, где я использую пользовательскую высоту строки?

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

4b9b3361

Ответ 1

Думаю, я это сделал!!!

В моем тестировании кажется, что длина строки должна быть не менее ~ 115% от размера шрифта, поэтому, если вы хотите 50px высокий элемент, у вас должно быть ~ 43px для вещей для всех:

Рис 1. Размер шрифта 86% от высоты строки 50px.

Рис 1. Размер шрифта 86% от высоты линии 50 пикселей. Вещи выстраиваются в линию, но не соблюдают размер шрифта 50 пикселей, запрошенный OP.

input, span {
    border: 2px solid red;
    display: inline-block;
    font: 43px Arial;
    line-height: 50px;
    padding: 0;
    vertical-align: middle;
	width: 100px;
    outline-style:none;
    box-shadow:none;
    overflow:hidden;
    /* optional - to include the borders in the element size: 
    box-sizing:border-box;
    */
}
<input type="text" value="Text">
<input type="text" placeholder="Text">
<span>Text</span>

Ответ 2

Почему это происходит?

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

Почему виза не виновата?

У каретки height больше, чем текст, который вызывает искажение выравнивания.

Есть несколько вещей, которые поддерживают это:

1. Вы можете видеть размер каретки

  • Нажмите input и удерживайте левую кнопку мыши. Перетащите вверх и вниз, и вы увидите, что текст будет перемещаться.
  • Удалите height: 50px; из input, span. Размер input теперь будет увеличен до height каретки

div {
  line-height: 50px;
  font-family: Arial;
}
input, span {
  font-size: 45px;
  line-height: 50px;
  width: 100px;
  padding: 0;
  min-height: 0;
  display: inline-block;
  font-family: inherit;
  border: 2px solid red;
  overflow: hidden;
  vertical-align: top;
}
<div>
  <input type="text" value="Text">
  <input type="text" placeholder="Text">
  <span>Text</span>
</div>

Ответ 3

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

Похоже, что если размер шрифта в поле ввода равен или превышает высоту строки, то поле меняет размер, а его содержимое (но не) также меняется. Это очевидно, если вы удалите высоту из своего примера.

  input, span {
    padding: 0;
    margin: 0;
    width: 100px;
    padding: 0;
    min-height: 0;
    display: inline-block;
    font-family: inherit;
    border: 2px solid red;
    vertical-align: middle;
  }

  input, input::-webkit-input-placeholder, span {
    line-height: 50px;
    font-size: 50px;
  }
  

<input type="text" value="Text">
<input type="text" placeholder="Text">
<span>Text</span>

Ответ 4

Попробуйте это

По ссылке: Проблема с высотой строки в Firefox с полями ввода

строка-высота на входе не изменится, если вы не измените размер шрифта

поэтому уменьшите размер шрифта: от 50 пикселей до 45 пикселей, он будет выглядеть нормально.

Код ниже

   div { 
line-height: 50px; 
font-family: Arial; 
} 

span,input[type="text"],input[placeholder]{ 
height: 50px; 
width: 100px; 
padding: 0; 
min-height: 0; 
display: inline-block; 
font-family: inherit; 
border: 2px solid red; 
overflow: hidden; 
vertical-align: top; 
font-size:45px; 

} 

::-webkit-input-placeholder { 
color:#000000; 

}

Ответ 5

Значение строки до 1,2 (что составляет 120% от размера шрифта) отлично работает в хроме

http://plnkr.co/edit/rJmXLRrGFpi46Vv5THm5?p=preview

  div, input, span {
      line-height: 1.2;
  }

Единственное изменение, которое я делаю, меняет две высоты линии от 50 до 1,2. Он не разбивает макет, и три элемента выравниваются в порядке.

Итак, ваш исходный код отлично работает в firefox.

Ответ 6

SO Question - 33185205

OP

DEMO

FORK

Объяснение: <input> является замененным элементом, поэтому он не содержит получить визуализированный пользовательским агентом.

Подробнее см. HTML5: замененный вместо замененного элемента

Решение:

См. FORK или фрагмент

html {
  height: 100vh;
  width: 100vw;
  font: 400 10px'Arial';
}
body {
  height: 100%;
  width: 100%;
  background-color: grey;
  color: #111;
}
#form {
  display: inline-table;
}
.box {
  display: table-row;
}
span,
input {
  font: inherit;
  font-size: 40px;
  /* */
  height: 50px;
  /* */
  line-height: 50px;
  /* */
  width: 100px;
  display: table-cell;
  outline: 2px solid red;
  border: 5px solid transparent;
  /* */
  padding: 0;
}
<!DOCTYPE html>
<html>

<head>
  <link rel="stylesheet" href="style.css">

</head>

<body>
  <form id="form">
    <div class="box">
      <input id="in1" type="text" placeholder="Text" value="Text">
      <input id="in2" type="text" placeholder="Text" value="">
      <span>Text</span>
    </div>
  </form>
</body>

</html>

Ответ 7

Обновлена ​​база комментариев ниже

Чтобы использовать тот же line-height для каждого из элементов, я обновил CSS до этого:

*,
*:before,
*:after {
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
}

div {
  line-height: 50px;
  font-family: Arial;
}

input, span {
    border: 2px solid red;
    display: inline-block;
    font: 50px Arial;
    height: 60px;
    line-height: 60px;
    padding: 0;
    vertical-align: middle;
    width: 100px;
}
input {
    padding-top: 3px;
}

В принципе, если вы используете одни и те же символы height и line-height, текст будет отображаться правильно рядом друг с другом, даже если вы измените размер шрифта. Размер шрифта должен быть не менее 10 пикселей или больше, чем высота и высота строки, иначе он снова будет искажен.

Вы можете увидеть мой обновленный JS.Fiddle здесь. Надеюсь, что это поможет.

Ответ 8

Поскольку диакритические знаки не являются частью традиционного определения размера шрифта, вы никогда не сможете иметь высоту строки = размер шрифта. Даже ASCII содержит некоторые диакритики (например, U0060). Диакритики также могут применяться к заглавным буквам, вам даже не нужны скрытые расширения Unicode, latin1 достаточно (например, U00C0).

Когда шрифт правильно спроектирован и включает в себя box drawing, это можно легко проверить - линии рисования линий должны быть объединены, поэтому U2502 например, даст вам фактическую максимальную высоту, используемую шрифтом. Его высота будет больше, чем A или одна из других латинских шапок, обычно используемых для определения размера шрифта. (к сожалению, поскольку горизонтальные линии также должны быть объединены, блок рисования коробки может быть найден только в моноширинных шрифтах).

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

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

Например, если текстовый стек не выполняет обработку базовой таблицы opentype opentype spec, фактическое добавленное расстояние может увеличиваться до огромных значений (больше, чем 15/20%, характерные для западного латина и даваемые в других ответах), как только вы используете шрифт с поддержкой Vietnamese или другие скрипты что, как и стек нескольких диакритиков друг на друга (даже если вашему браузеру удается отобразить эту страницу с общим шрифтом, она, вероятно, будет сжимать диакритические элементы по вертикали по сравнению с тем, когда установлен шрифт vietnamese)

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

Разбитые структуры веб-сайтов, где вертикальная высота входа была распределена, очень распространены, потому что авторы веб-сайта/js lib/browser живут в латинском мире без диакритики 96dpi и считают, что минимизация вертикальной высоты прекрасна. Это ломается, как только сайт просматривается на другом языке, с чуть более сложными символами юникода, несколькими разными шрифтами или слегка отличающимися уровнями масштабирования текста (из-за hidpi или просто для приближения к пользователю). Обычный текст обычно хорош, так как дизайнер не пытался заставить его в небольшом ящике с фиксированным пикселем.

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