Размер ввода против ширины

231
<input name="txtId" type="text" size="20" />

или

<input name="txtId" type="text" style="width: 150px;" />

Какой из них является оптимальным кросс-браузерным кодом?

Конечно, это зависит от требований, но мне любопытно узнать, как люди решают и на каком основании.

rajakvk
источник
17
Обычно плохая идея использовать «px» в сети. Вместо этого вы можете использовать относительные единицы измерения («em», «%» и т. Д.).
Кангакс
37
@kangax Это только одно мнение; нет единого мнения относительно использования px
Кос
7
@ Kos Это вроде было консенсусом. Больше нет (с IE и другими старыми браузерами).
Кангакс
9
@kangax Я никогда не получал эту записку ... Я использую px все время и всегда имею.
Андрей

Ответы:

180

Вы можете использовать оба. Стиль css переопределит sizeатрибут в браузерах, которые поддерживают CSS, и сделает поле правильной ширины, а для тех, которые этого не делают, он вернется к указанному количеству символов.

Редактировать: я должен был упомянуть, что sizeатрибут не является точным методом определения размера: согласно спецификации HTML , он должен ссылаться на количество символов текущего шрифта, которые ввод сможет отображать сразу.

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

Фрагмент ниже демонстрирует оба подхода.

@font-face {
    font-family: 'Diplomata';
    font-style: normal;
    font-weight: 400;
    src: local('Diplomata'), local('Diplomata-Regular'), url(https://fonts.gstatic.com/s/diplomata/v8/8UgOK_RUxkBbV-q561I6kFtXRa8TVwTICgirnJhmVJw.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
@font-face {
    font-family: 'Open Sans Condensed';
    font-style: normal;
    font-weight: 300;
    src: local('Open Sans Condensed Light'), local('OpenSansCondensed-Light'), url(https://fonts.gstatic.com/s/opensanscondensed/v11/gk5FxslNkTTHtojXrkp-xBEur64QvLD-0IbiAdTUNXE.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
p {
  margin: 0 0 10px 0;
}
input {
  font-size: 20px;
}
.narrow-font {
  font-family: 'Open Sans Condensed', sans-serif;
}
.wide-font {
  font-family: 'Diplomata', cursive;
}
.set-width {
  width: 220px;
}
<p>
  <input type="text" size="10" class="narrow-font" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="wide-font" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="narrow-font set-width" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="wide-font set-width" value="0123456789" />
</p>

Марк Белл
источник
2
@ Марк Б. Спасибо за ваш ответ. Я использовал встроенный стиль, чтобы задать вопрос здесь.
rajakvk
Не беспокойтесь - я думал, что вы, возможно, но я просто указал на это на всякий случай.
Марк Белл
Большинство шрифтов не имеют одинарной ширины. Что касается «количества символов, которое поле сможет отображать одновременно» .... Какой символ вы имеете в виду?
Пейсер
@Pacerier Количество символов в любом шрифте, который используется для ввода: jsbin.com/zimako/1
Марк Белл,
1
@jbyrd Да, это так, но ответ правильный в соответствии со спецификацией HTML. Я отредактировал ответ сейчас, чтобы немного прояснить ситуацию.
Марк Белл
50

Я предлагаю, вероятно, лучший способ установить ширину стиля в единицах em :) Так что для размера ввода 20 символов просто установите style='width:20em':)

мыслитель
источник
4
Интересный момент, однако, в моих тестах ширина: 20em делает ввод намного больше, чем 20 символов.
Кристоф
32
«em» - это мера высоты символа «M», поэтому поле становится слишком большим.
Хамбадс
9
В CSS em относится к размеру шрифта своего прямого или ближайшего родителя. Пример: если унаследованный размер шрифта элемента равен 16px, и вы установили размер шрифта равным 2em, результирующий размер будет равен 32px (16px * 2em). Единица «em» не является количеством символов. Больше: w3.org/TR/css3-values/#font-relative-lengths и kyleschaeffer.com/development/css-font-size-em-vs-px-vs-pt-vs и j.eremy.net/confused О Рем-и-Эм
Delroh
1
@ humbads, ты не имеешь в виду меру ширины символа «М»?
Джесс
5
@ Джесс, хороший вопрос. В типографии «em» означало ширину символа «M». Долгое время я верил в то же самое. Однако в CSS и цифровой типографии «em» равно высоте шрифта в пунктах. Это делается для размещения наборов символов, у которых нет символа «М» или где «М» не является полной высотой или шириной шрифта.
Хамбадс
21

size несовместим в разных браузерах и их возможных настройках шрифта.

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

Вам все еще нужно sizeдля того <select multiple>чтобы получить высоту выстраиваться с должным образом вариантов. Но я бы не стал использовать его на <input>.

bobince
источник
13

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

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

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

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

ibrewster
источник
Вы также можете использовать exмодуль для этого, хотя использование размера все еще упрощает большинство случаев, не имея десятки идентификаторов / классов в вашем CSS для ширины.
Сорок
@ Forty На самом деле, вы не можете. exэто высота символа (в частности, «X»), а не ширина - как em. Поскольку не существует фиксированной связи между высотой и шириной символа (x или иным образом), нет никаких оснований полагать, что использование высоты символа для установки ширины поля сделает поле правильной шириной, чтобы показать любой заданное количество символов. Это может быть шире или уже, в зависимости от шрифта. Теперь chустройство выглядит многообещающе, но не поддерживается в IE менее 9, что было бы проблемой, когда я писал это.
ibrewster
Да, но высота x обычно никогда не бывает меньше ширины, в большинстве случаев она немного выше или почти одинакова, поэтому она приближается. chмогло бы быть лучше, к сожалению, некоторые нули тонкие, и это может не измерить полное пространство символов ...
Сорок
@Forty True, таким образом, подтверждая мою первоначальную точку зрения, что нет хорошего CSS-атрибута для установки ширины поля ввода для определенного количества символов, в то время как sizeатрибут стремится сделать именно это. Возможно, вы правы, exэто разумная альтернатива, но факт остается фактом: это атрибут высоты, а не атрибут ширины. sizeявляется атрибутом ширины, но не CSS.
ibrewster
Он достаточно близок для использования, но в данном случае это не практично :)
Сорок
4

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

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

отметка
источник
1

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

Мэтт Хауэлл
источник
1

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

</head>
<body>
<div align="center">

    <form method="post">
          <div class="w3-row w3-section">
            <div class="w3-rest" align = "center">
                <input name="lastName" type="text" id="myInput" style="width: 50%">
            </div>
        </div>
    </form>
</div>
</body>
</html>

Используйте выравнивание, чтобы центрировать текстовое поле.

шах
источник
1

И sizeатрибут в HTML, и widthсвойство в CSS будут устанавливать ширину <input>. Если вы хотите установить ширину, равную ширине каждого символа, используйте **ch**единицу, как в:

input {
    width: 10ch;
}
chrisbowman22
источник
0

HTML контролирует семантическое значение элементов. CSS контролирует макет / стиль страницы. Используйте CSS, когда вы контролируете свой макет.

Короче говоря, никогда не используйте size = ""

Крис Соболевски
источник
Размер может быть присущ смысл элемента; например, средний инициал имеет один символ. Имя OTOH не имеет ограничения по размеру, если только у вас его нет в базе данных.
Дероберт
4
@derobert: Я могу ошибаться, но обычно вы выражаете это, используя атрибут maxlength для ввода [type = text | password], а не атрибут size.
Хорст Гутман
2
@ Хорст: Хорошо, я бы выразил среднюю букву с обоими (поскольку этот предел имеет смысл для пользователя), а предел базы данных - только с максимальной длиной.
Дероберт