
Элемент
<input>
в HTML самый интересный.Большинство его собратьев вне зависимости от своих атрибутов ведут себя одинаково. При этом атрибут
type
элемента <input>
может принимать 22 разных значения, которые не только меняют его поведение, но и влияют на внешний вид (зачастую в ущерб стилистике).Элемент
<input>
отвечает за всё, начиная с текстового ввода и чекбоксов, заканчивая переключателями и кнопкой для сброса всех полей в форме. В этой статье я опишу не только различные типы <input>
, но и сопутствующие атрибуты, о которых вы могли не знать, и которые делают этот элемент более удобным и применимым в различных ситуациях. Приступим!▍ Управление клавиатурой
На мобильном устройстве при выборе ввода текста всплывает виртуальная клавиатура. Но что, если вы планируете вводить числа или, например, электронную почту? В этом случае атрибут
inputmode
позволит оптимизировать клавиатуру под предполагаемый тип ввода. Если вы собираетесь вводить адрес email, установите
inputmode
на email
, и на основной клавиатуре отобразится символ @
. Если же вас интересуют числа, установите inputmode
на numeric
или decimal
, что приведёт к отображению панели с цифрами. Такой подход годится в случаях, когда нужно ввести число, но тип number
не подходит. Например, при вводе одноразового пароля или номера кредитной карты. <input type="text" inputmode="numeric" />
Полный список значений
inputmode
приведён ниже вместе с соответствующими им символами на клавиатуре iOS. На Android символы будут другие. -
none
: отключает показ виртуальной клавиатуры. Используется, когда вы хотите реализовать собственную (вряд ли вам это понадобится); -
text
: вариант по умолчанию; -
numeric
: только числа; -
decimal
: числа и десятичная запятая; -
tel
: числа и другие символы для набора номера; -
url
: стандартная клавиатура с точкой, прямым слэшем и.com
вместо пробела; -
email
: стандартная клавиатура с небольшим пробелом, символом@
и точкой; -
search
: стандартная клавиатура со слегка уменьшенным пробелом, точкой и выделенной кнопкойgo
, заменяющейreturn
.

Атрибут
inputmode
также поддерживается в <textarea> и всех элементах режима contenteditable
.Настройте удобную клавиатуру, и ваши пользователи будут вам за это благодарны.
▍ Неактивные элементы input
Если вам нужно отобразить элемент
<input>
, но вы не хотите, чтобы пользователь мог изменять его содержимое, или собираетесь менять его иным программным способом, то вам поможет атрибут disabled
. Однако нужно учитывать, что отключённые элементы ввода удаляются из дерева доступности, становясь недоступными для пользователей специальных возможностей. Кроме того, содержимое отключённых элементов ввода с формой не отправляется.Альтернативой атрибуту
disabled
является атрибут readonly
. Он делает поле неактивным, но при этом его содержимое остаётся доступным и будет отправляться с остальным вводом формы.<label for="input">The label</label>
<input type="text" value="You can't change this" readonly id="input" />
Примечание от Manuel: не все скринридеры объявляют такое поле как «только для чтения». Лучше будет сначала это проверить, чтобы понять, нужно ли сопроводить его дополнительным описанием.
Выбор readonly-элементов в CSS реализуется с помощью псевдокласса
:read-only
, а элементов, которые можно считывать и записывать – с помощью псевдокласса :read-write
.readonly
применим только для <input>
, выступающих в качестве текстовых элементов управления, и элементов <textarea>
.Уместность применения
readonly
вместо disabled
зависит от того, должен ли элемент использоваться на странице. Не забудьте это учесть.▍ Свет, камера, мотор!
Вы можете подумать, что единственный способ предоставить пользователю доступ к камере мобильного устройства и вести фото-видео съёмку подразумевает использование JS и API
getUserMedia
. Но доступ к камере также можно реализовать декларативно. В поле <input>
загрузки файла можно указать атрибут capture
, который будет заставлять элемент активировать камеру устройства.К сожалению, эта возможность доступна лишь в мобильных версиях браузеров. На десктопных устройствах такое поле будет работать как стандартное поле загрузки файла.
На устройствах, оборудованных фронтальной и тыльной камерой, можно даже давать указания для использования той или иной из них. Например, если вы просите пользователя сделать селфи, установите
capture="user"
, чтобы выбиралась фронтальная камера. Если же целью является съёмка окружающего пространства, тогда установите capture="environment"
, чтобы активировалась тыльная камера. Устройство может переопределять это поведение, если, например, фронтальная камера недоступна.Есть ещё атрибут
accept
, с помощью которого можно указывать тип контента, который вы хотите получить с камеры. Если в итоге вы выберете фотографии, камера активирует режим фотосъёмки, а если вы решите снять видео, то активируется режим видеозаписи.К примеру, ниже показан HTML-код и соответствующий ему результат.
<label for="input">Cheeeeese</label>
<input type="file" capture="user" accept="image/jpeg,image/png" id="input" />

Это прекрасный способ сделать снимок пользователя для аватара без использования JS.
▍ Проверка правописания
spellcheck
– это универсальный атрибут, который можно использовать для любого элемента. С его помощью активируется проверка правописания в браузере для элементов, в которых также установлен параметр contenteditable="true"
. Он, в том числе, подходит для элементов <input>
и определённо стоит вашего внимания.Разные браузеры обрабатывают
<input>
по-разному. Firefox и Safari на настольных системах не будут выполнять проверку правописания в этих элементах без установки атрибута spellcheck
. А вот Chrome и Safari на iOS будут. Чтобы добиться согласованного поведения в разных браузерах, вам следует устанавливать атрибут spellcheck
на true
либо false
в зависимости от содержимого <input>
.В случае обычного текста лучше будет обеспечить для пользователей помощь при вводе, установив
spellcheck="true"
. Если же поле будет использоваться для идентификаторов вроде имён пользователей, адресов email, URL или иной информации, которая вряд ли есть в словаре, лучше установить spellcheck="false"
.При этом стоит иметь в виду, что фактическая реализация проверки правописания остаётся за самим браузером. Например, Chrome и Edge отправляют содержимое элементов <input> на проверку в специальные сервисы, тем самым его раскрывая. Если ваш элемент
<input>
содержит чувствительную информацию вроде личных данных, таких как имена, даты рождения или пароли, то лучше установить spellcheck="false"
, чтобы этого избежать.<label for="input">Name</label>
<input type="text" spellcheck="false" id="input" />
Имейте в виду, что
<input>
, имеющий тип password
, будет держать своё значение при себе. Если же вы задействуете функциональность показа пароля, которая устанавливает тип элемента на text
, то это поле окажется открытым для проверки правописания.Продуманное использование функции
spellcheck
с учётом всех описанных рисков поможет вашим пользователям при вводе данных в формы, не подвергнув их личную информацию риску разглашения.▍ Автоматический Shift
На мобильных устройствах при вводе текста в элементе
<input>
первое слово будет по умолчанию начинаться с заглавной буквы, продолжаясь строчными. И это удобно при написании предложения, но, к примеру в именах и адресах с заглавной буквы должно начинаться каждое слово. При этом иные типы ввода вроде идентификаторов авиабилетов и почтовых кодов Великобритании предполагают использование только заглавных букв.В этом случае вам поможет атрибут
autocapitalize
, который избавит пользователей от необходимости использовать Shift для ввода текста в нужном формате.Для написания каждого слова с заглавной буквы установите
autocapitalize="words"
, а для использования исключительно заглавных букв – autocapitalize="characters"
.<label for="input">Name</label>
<input type="text" name="full-name" autocapitalize="words" id="input" />
Имейте в виду, что атрибут
autocapitalize
не работает там, где это бессмысленно, например для элементов <input>
с типом email
, url
и, что самое главное, password
.Правильное использование этой функциональности значительно облегчит для ваших пользователей ввод данных на мобильных устройствах.
▍ Чем меньше вводить, тем лучше
Закончить сей ликбез я решил своим любимым атрибутом для полей ввода –
autocomplete
.Он подсказывает браузеру варианты завершения ввода на основе уже известных выражений. Атрибут
autocomplete
может получать огромное число значений, связывающих <input>
со многими вещами, о которых браузер знает или может узнать.Для таких действий, как регистрация или авторизация можно установить
autocomplete
на значения вроде username
или email
. В случае паролей можете использовать значение new-password
, чтобы браузер не пытался подставить существующий пароль, а просил ввести новый. Также можно использовать значение current-password
, чтобы браузер или менеджер паролей автоматически подставляли в поле известный пароль пользователя.Для подстановки адреса используйте значения вроде
street-address
, country-name
и postal-code
. В коммерческих формах можно дополнять эти значения уточняющими идентификаторами, чтобы разделять адреса для billing
(выставления счёта) и shipping
(доставки).<label for="input">Address</label>
<input type="text" autocomplete="street-address shipping" name="street-address" id="input" />
Для одноразовых паролей, отправляемых по SMS, можете использовать значение
one-time-password
, указывающее браузеру о необходимости просмотра последних сообщений и извлечения одноразового пароля для подстановки в поле.А в случае реализации ключей доступа можете использовать для
autocomplete
значение webauthn
, чтобы задействовать в этом процессе автозаполнение.Если грамотно использовать
autocomplete
, то этого будет достаточно даже для выполнения правила WCAG уровня AA «Определение цели ввода». Давая браузеру детальные указания в отношении типа предполагаемого содержимого полей ввода, мы не только экономим время пользователей, но и избавляем их от лишнего набора. Но бывает и такое, что вам нужно полностью отключить автозаполнение. Установка
autocomplete="off"
отключит запоминание браузером вводимого текста. Такое решение актуально для полей, в которых каждый раз ожидается разный ввод, например CAPTCHA.Использование правильных атрибутов автозаполнения значительно упростит для пользователей процесс ввода текста.
▍ Выбор правильных атрибутов
Трудно проектировать и разрабатывать формы, которые подходили бы для всех пользователей. Но здесь у нас есть элемент
<input>
, который имеет множество опций, позволяющих сделать текстовые формы более удобными и доступными.Для управления виртуальными клавиатурами ввода используйте
inputmode
. Если вы хотите отключить возможность изменения <input>
, сохранив возможность его прочтения и отправки, выбирайте readonly
вместо disabled
. Активировать камеру на мобильных устройствах можно с помощью capture
. Атрибут spellcheck
позволяет задействовать проверку правописания. Главное не забывать отключать её для чувствительного ввода. Помимо этого, вы можете экономить время пользователей с помощью autocapitalize
, регулируя правила использования заглавных букв при вводе. И, наконец, autocomplete
позволяет браузеру автоматически подставлять содержимое в поля, избавляя пользователей от лишних нажатий клавиш.Все эти атрибуты в случае грамотного применения позволят вашим пользователям заполнять формы в кратчайшее время и с минимумом усилий.
Помоги спутнику бороться с космическим мусором в нашей новой игре! ????

Комментарии (17)
dopusteam
14.01.2024 12:26+10Устройство может переопределять это поведение, если, например не обнаружит перед фронтальной камерой пользователя.
В оригинале
The device can override these hints if, for example, it doesn't have a user facing camera available
Кажется речь о том, что поведение может быть переопределено не 'например, если пользователя не обнаружит', а 'например, если фронтальная камера недоступна'
darklord1984
14.01.2024 12:26+2Сатанисты одобряют)))Ладно, шучу, просто на примерах пентаграмма перевёрнутая. Статья хорошая, возьму на заметку.
pantsarny
14.01.2024 12:26+2Заголовок не соответствует действительности. бОольшая часть сайтов используют данные возможности и все реже встречаются сайты с ненастроенными инпутами
Metotron0
14.01.2024 12:26+2Я за 15 лет не узнал про inputmode, а теперь узнал.
Как-то мне для своих нужд была нужна клавиатура с цифрами для ввода цен, я сделал type=tel, а теперь буду знать, как правильно.andreishe
14.01.2024 12:26+2А можно было просто MDN почитать.
Metotron0
14.01.2024 12:26+14Чтобы пойти читать MDN, нужно иметь представление, что эта задача в принципе уже решена через атрибуты. Чтобы задать правильный вопрос, нужно уже знать часть ответа.
andreishe
14.01.2024 12:26+1Если вы знали про type=tel, то логично было бы пойти ознакомиться с иными вариантами, а там и на inputmode набрести.
Metotron0
14.01.2024 12:26+1Я знал иные варианты из книги "HTML5. недостающее руководство", в ней про эти атрибуты ничего не было сказано, а на mdn я обычно целиком всю страницу не перечитываю, чтобы вдруг чего-то нового найти. Обычно я смотрю за описанием нововведений в браузерах, но так вышло, что inputmode я нигде не видел.
g5p4m7
14.01.2024 12:26Вот только для ввода шестнадцатиричных чисел (в hex) и особенно шестидесятеричных (часы, градусы) толком и не предусмотрено. Например, набор шестнадцатеричных чисел показывать либо слитно, либо через пробел, указать банальным свойством какие конкретные числа группировать парой (в особых редких случаях – ещё и порядок этих байт в группе менять местами) или тройкой байт. А то для каждой вводимой "шестнадцатеричной цифры" пиши шаблон, да ещё и учитывание пробела — тьфу… Ибо "разделять" такие числа на разные input-поля – очень плохая идея, уже достаточно наплевались ими с вводом MAC-адресов в маршрутизаторах…
Ну и для шестидесятеричных чисел тоже не помешало бы: показывать запятые или же просто пробелы (с надчёркиваниями или без), с или без надстрочных "прим, секунд, терций, кварт, квинт…", чтоб пользователи сами выбирали, как эти числа им удобнее читать…
shumaher86
14.01.2024 12:26+2там же еще цвет есть, дата, время и еще что-то. и все это тоже меняет внешний вид.
если уж делаете такие статьи, могли бы и все значения описать.
RomanistHere
14.01.2024 12:26Если вы собираетесь вводить адрес email, установите
inputmode
наemail
, и на основной клавиатуре отобразится символ@
зачем разбирать такой кейз, если правильно семантически и во всех остальных планах будет использовать
type=email
без всяких инпутмодов?Metotron0
14.01.2024 12:26+1Бывают сторонние библиотеки, которые почему-то работают только с type=text.
vanxant
Ну надо же, в кои-то веки полезная переводная статья на Хабре!