<input> имеет загадочную нижнюю прокладку - PullRequest
8 голосов
/ 23 января 2012

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

Если я пытаюсь удалить padding, margin, borderи outline из <input>display: block), так что размер поля определяется исключительно текстом, поле ввода заканчивается дополнительным заполнением на несколько пикселей, чем любой другой элемент уровня блока, стилизованный точно так жепуть.Вот пример: http://jsfiddle.net/nottrobin/b9zfa/

<input class="normalised testSubject" value="hello" />
<div class="normalised testSubject">hello</div>

Рендеринг:

Rendering

В этом примере <div> получает вычисленную высоту 16px, в то время как<input> получает вычисленную высоту 19px.

Я получаю такое же поведение в Chrome 16, Firefox 9 и Opera 11, поэтому он явно делает движок независимым.

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

Может кто-нибудь помочь мне понять, что здесь происходит, и как яМожно ли надежно убедиться, что высота <input> будет такой же, как у любого элемента уровня блока, следующего за ним?

Ответы [ 4 ]

13 голосов
/ 23 января 2012

<input> имеет минимальный line-height в зависимости от размера шрифта.Установка обоих элементов на большее значение line-height работает, как и удаление line-height в целом.Но это все еще не позволяет вам иметь меньшую высоту, чем минимальная.Исправление для этого заключается в использовании псевдоэлемента first-line и установке его на display: inline-block;.

Демо: http://jsfiddle.net/ThinkingStiff/B7cmQ/

enter image description here

CSS:

.normalised:first-line {
    display: inline-block;    
}

Но это не объясняет, почему <input> действует иначе, чем <div>.Даже -webkit-appearance: none; не исправил это.Казалось бы, на входах есть невидимое вуду, которое рассматривает его содержимое как inline.inline элементы имеют минимальное значение line-height в зависимости от размера шрифта, который мы наблюдаем здесь.Вот почему first-line исправляет это.Кажется, это стиль дочернего элемента <input>.

. Вот демонстрация, которая показывает минимум line-height для inline элементов.<div> элемент награждает line-height: 7px;.<span>, хотя его вычисленное значение показывает 7px;, визуально его не учитывает.

Демонстрация: http://jsfiddle.net/ThinkingStiff/zhReb/

Вывод:

enter image description here

HTML:

<div id="container"> 
    <div id="div-large">div <br />large</div> 
</div> 
<div id="container"> 
    <div id="div-medium">div <br />med</div> 
</div> 
<div id="container"> 
    <div id="div-small">div <br />small</div> 
</div> 
<div id="container"> 
    <span id="span-large">span <br />large</span> 
</div> 
<div id="container"> 
    <span id="span-medium">span <br />med</span> 
</div> 
<div id="container"> 
    <span id="span-small">span <br />small</span> 
</div> 

CSS:

#container { 
    background-color: lightblue;   
    display: inline-block; 
    height: 200px; 
    vertical-align: top; 
}

#div-large { 
    line-height: 50px; 
} 

#div-medium { 
    line-height: 20px; 
} 

#div-small { 
    line-height: 7px; 
}

#span-large { 
    line-height: 50px; 
    vertical-align: top; 
} 

#span-medium {
    line-height: 20px; 
    vertical-align: top; 
} 

#span-small {
    line-height: 7px;
    vertical-align: top;
}
1 голос
/ 23 января 2012

Удаление line-height, кажется, решает проблему.

См. Скрипку . Проверено только в FF tho.

0 голосов
/ 15 июня 2012

Я знаю, что опоздал на этот вопрос на месяцы, но я наткнулся на него в поиске в Google и хотел добавить одну вещь, которая может помочь прояснить некоторые другие ответы в отношении элементов <input> в Firefox.

Стиль стилей форм по умолчанию в Firefox включает несколько неудобных CSS:

input {
   ...
   line-height: normal !important;
   ...
}

Это делает практически невозможным переопределение свойства line-height любого ввода формы в Firefox.Эта проблема существовала годами, и, хотя разработчикам FF кажется, что убрать !important из правила совсем не сложно, я понимаю, что при этом есть некоторые проблемы с реализацией.Кроме того, по-видимому, существуют некоторые веб-сайты (включая YouTube), которые полагаются на поведение этого правила.

Подробности и подробные обсуждения см. Ошибка Mozilla # 349259 .Есть также хорошая запись в блоге по этому вопросу на 456bereastreet.com , и еще одна (более старая) Эрик Мейер на meyerweb.com .

0 голосов
/ 23 января 2012

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

Попробуйте добавить box-sizing: border-box к input.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...