Элемент <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)


  1. vanxant
    14.01.2024 12:26
    +17

    Ну надо же, в кои-то веки полезная переводная статья на Хабре!


  1. 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

    Кажется речь о том, что поведение может быть переопределено не 'например, если пользователя не обнаружит', а 'например, если фронтальная камера недоступна'


    1. Bright_Translate Автор
      14.01.2024 12:26
      +2

      Согласен. Недочет.


  1. darklord1984
    14.01.2024 12:26
    +2

    Сатанисты одобряют)))

    Ладно, шучу, просто на примерах пентаграмма перевёрнутая. Статья хорошая, возьму на заметку.


  1. pantsarny
    14.01.2024 12:26
    +2

    Заголовок не соответствует действительности. бОольшая часть сайтов используют данные возможности и все реже встречаются сайты с ненастроенными инпутами


    1. Metotron0
      14.01.2024 12:26
      +2

      Я за 15 лет не узнал про inputmode, а теперь узнал.
      Как-то мне для своих нужд была нужна клавиатура с цифрами для ввода цен, я сделал type=tel, а теперь буду знать, как правильно.


      1. andreishe
        14.01.2024 12:26
        +2

        А можно было просто MDN почитать.


        1. Metotron0
          14.01.2024 12:26
          +14

          Чтобы пойти читать MDN, нужно иметь представление, что эта задача в принципе уже решена через атрибуты. Чтобы задать правильный вопрос, нужно уже знать часть ответа.


          1. muxa_ru
            14.01.2024 12:26
            +1

            Золотые слова.


          1. andreishe
            14.01.2024 12:26
            +1

            Если вы знали про type=tel, то логично было бы пойти ознакомиться с иными вариантами, а там и на inputmode набрести.


            1. Metotron0
              14.01.2024 12:26
              +1

              Я знал иные варианты из книги "HTML5. недостающее руководство", в ней про эти атрибуты ничего не было сказано, а на mdn я обычно целиком всю страницу не перечитываю, чтобы вдруг чего-то нового найти. Обычно я смотрю за описанием нововведений в браузерах, но так вышло, что inputmode я нигде не видел.


  1. g5p4m7
    14.01.2024 12:26

    Вот только для ввода шестнадцатиричных чисел (в hex) и особенно шестидесятеричных (часы, градусы) толком и не предусмотрено. Например, набор шестнадцатеричных чисел показывать либо слитно, либо через пробел, указать банальным свойством какие конкретные числа группировать парой (в особых редких случаях – ещё и порядок этих байт в группе менять местами) или тройкой байт. А то для каждой вводимой "шестнадцатеричной цифры" пиши шаблон, да ещё и учитывание пробела — тьфу… Ибо "разделять" такие числа на разные input-поля – очень плохая идея, уже достаточно наплевались ими с вводом MAC-адресов в маршрутизаторах…
    Ну и для шестидесятеричных чисел тоже не помешало бы: показывать запятые или же просто пробелы (с надчёркиваниями или без), с или без надстрочных "прим, секунд, терций, кварт, квинт…", чтоб пользователи сами выбирали, как эти числа им удобнее читать…


  1. ArchDemon
    14.01.2024 12:26
    +1

    для input с type=checkbox атрибут readonly не заработал


    1. rvs2016
      14.01.2024 12:26
      +2

      Там в статье про это пишут так:

      > readonly применим только для <input>,

      > выступающих в качестве текстовых элементов управления,

      > и элементов <textarea>.


  1. shumaher86
    14.01.2024 12:26
    +2

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


  1. RomanistHere
    14.01.2024 12:26

    Если вы собираетесь вводить адрес email, установите inputmode на email, и на основной клавиатуре отобразится символ @

    зачем разбирать такой кейз, если правильно семантически и во всех остальных планах будет использовать type=email без всяких инпутмодов?


    1. Metotron0
      14.01.2024 12:26
      +1

      Бывают сторонние библиотеки, которые почему-то работают только с type=text.