Формы и поля: меньше полей, понятные подписи, нужная клавиатура

Сколько полей спрашивать, подпись над полем, ширина по ответу, нужная клавиатура на телефоне, автозаполнение и ошибки после отправки — с живыми примерами.

Интерфейс-элементы Обновлено

Коротко

Хорошая форма спрашивает только то, что нужно для первого ответа, и заполняется не задумываясь. Поля идут в одну колонку, у каждого подпись над полем, которая не исчезает при вводе, и ширина, подсказывающая длину ответа. На телефоне каждое поле открывает нужную клавиатуру — с @ для почты, с цифрами для телефона и кода, — а имя, адрес и телефон браузер подставляет сам, если поле сообщает, что оно такое. Необязательные поля помечены словом, ошибки после отправки видны и у поля, и списком сверху, а введённое не пропадает. Кнопка называет результат: «Получить расчёт», а не «Отправить».

Спрашивайте только то, что нужно для первого ответа

Заявка на расчёт кухни. Переключите на четыре поля: всё остальное выясняется в первом разговоре.

Каждое поле — вопрос, на который нужно ответить, прежде чем что-то получить. Отчество, город и «как вы о нас узнали» не помогают ответить — они только удлиняют форму. Про каждое поле спросите: что мы сделаем с этим ответом до первого звонка? Если ничего — поле уходит.

Подпись остаётся над полем

Подпись внутри поля исчезает с первой буквой. В заполненной форме уже непонятно, о чём спрашивали.

Подпись внутри поля
Подпись над полем

Серый текст внутри поля годится для примера ответа, но не для самого вопроса. Подпись над полем видна во время ввода, её читает экранная читалка, и по ней можно проверить форму перед отправкой. Подсказка — под полем: зачем нужен номер, в каком виде его ждут.

Ширина подсказывает ответ

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

Всё во всю ширину
Ширина по ответу

Нужная клавиатура на телефоне

Тип поля сообщает телефону, какую клавиатуру открыть. Один атрибут — и не нужно переключать раскладки.

type="email"

@ и точка под рукой

type="tel"

цифры и плюс

inputmode="numeric"

только цифры

Типы полей и автозаполнение

Тип или inputmode выбирают клавиатуру, autocomplete позволяет браузеру заполнить поле сохранёнными данными.

Что спрашиваемКлавиатураАвтозаполнение
Имя type="text" autocomplete="name"
Почта type="email" autocomplete="email"
Телефон type="tel" autocomplete="tel"
Улица и дом type="text" autocomplete="address-line1"
Индекс inputmode="numeric" autocomplete="postal-code"
Код из SMS inputmode="numeric" autocomplete="one-time-code"
Сумма inputmode="decimal" не нужно

Ошибки после отправки

Список сверху говорит, сколько полей проверить, каждая строка ведёт к своему полю, а подсказка у поля — как исправить.

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

Формы в коде: 2 примера

Поля, которые открывают нужную клавиатуру и принимают автозаполнение, и стили формы в одну колонку.

Поля с подписями и подсказками

Подпись связана с полем через for и id, подсказка — через aria-describedby.

fields.html
<div class="field">
  <label class="field__label" for="phone">Телефон</label>
  <input class="field__input" id="phone" name="phone" type="tel"
         autocomplete="tel" required aria-describedby="phone-hint">
  <p class="field__hint" id="phone-hint">Перезвоним по этому номеру</p>
</div>

<div class="field field--postcode">
  <label class="field__label" for="postcode">Индекс</label>
  <input class="field__input" id="postcode" name="postcode"
         inputmode="numeric" autocomplete="postal-code" maxlength="6">
</div>

<div class="field">
  <label class="field__label" for="sms-code">Код из SMS</label>
  <input class="field__input" id="sms-code" name="sms-code"
         inputmode="numeric" autocomplete="one-time-code" maxlength="6">
</div>

<div class="field">
  <label class="field__label" for="comment">Комментарий <span>· необязательно</span></label>
  <textarea class="field__input" id="comment" name="comment" rows="3"></textarea>
</div>

Форма в одну колонку

Взгляд идёт вниз без зигзага, короткие поля короткие, а текст в полях достаточно крупный, чтобы телефон не увеличивал страницу.

form.css
/* Одна колонка: взгляд идёт вниз, а не зигзагом */
.form {
  display: grid;
  gap: var(--space-5);
  max-width: 32rem;
}

.field {
  display: grid;
  gap: var(--space-1);
}

/* От 16px: Safari на iPhone не увеличивает страницу при фокусе */
.field__input {
  min-height: 2.75rem;
  padding-inline: var(--space-3);
  font-size: max(1rem, 16px);
}

/* Ширина подсказывает длину ответа */
.field--postcode .field__input {
  inline-size: calc(6ch + 2 * var(--space-3));
}

.field__label span,
.field__hint {
  font-size: var(--step--1);
  color: var(--color-text-muted);
}

7 правил для форм

  1. 01

    Только то, что нужно сейчас

    Каждое лишнее поле — повод закрыть форму.

  2. 02

    Одна колонка

    Поля рядом — только когда они одно целое: дом и квартира.

  3. 03

    Подпись над полем

    Текст внутри поля — пример, а не вопрос.

  4. 04

    Ширина по ответу

    Индекс короткий, улица длинная.

  5. 05

    Нужная клавиатура и автозаполнение

    type, inputmode и autocomplete у каждого поля.

  6. 06

    Помечать исключения

    Если почти всё обязательно, словом помечают необязательные поля.

  7. 07

    Ошибки в двух местах

    У поля и списком сверху; введённое остаётся.

Частые ошибки в формах

  1. Подсказка вместо подписи

    После ввода непонятно, о чём было поле.

  2. Три поля для имени

    Чтобы обратиться к человеку, хватает одного поля «Имя».

  3. Маска телефона, которая мешает

    Номер, вставленный из контактов, не помещается, и его приходится набирать заново.

  4. Кнопка «Очистить» рядом с «Отправить»

    Один промах — и вся форма стёрта.

  5. Капча на всякий случай

    Скрытое поле и проверка на сервере отсекают большинство ботов, не мешая людям.

  6. Форма очищается после ошибки

    Вводить всё заново — самая частая причина бросить форму.

Вопросы о формах

Сколько полей должно быть в форме заявки?

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

Помечать обязательные поля или необязательные?

Те, которых меньше. В коротких формах почти всё обязательно, поэтому слово «необязательно» ставят у остальных. Звёздочку без пояснения понимают не все.

Нужна ли маска у поля телефона?

Часто хватает подсказки с примером. Если маска есть, она должна принимать номер, вставленный в любом виде.

Проверять поля во время ввода?

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

Шаги или одна длинная форма?

Шаги — для длинных форм с разными темами, например доставка и оплата, и с видимым прогрессом. Короткая форма помещается на один экран.

Что должно происходить после отправки?

Понятное подтверждение на том же экране: что получено, когда ждать ответа и что можно сделать пока.

Форма

Формы, которые
заполняют до конца

Проектирую и верстаю формы — от короткой заявки до оформления заказа, — которые заполняют без вопросов. Расскажите о проекте — отвечу в течение рабочего дня.

Или пишите на [email protected]