Формы и поля: меньше полей, понятные подписи, нужная клавиатура
Сколько полей спрашивать, подпись над полем, ширина по ответу, нужная клавиатура на телефоне, автозаполнение и ошибки после отправки — с живыми примерами.
Коротко
Хорошая форма спрашивает только то, что нужно для первого ответа, и заполняется не задумываясь. Поля идут в одну колонку, у каждого подпись над полем, которая не исчезает при вводе, и ширина, подсказывающая длину ответа. На телефоне каждое поле открывает нужную клавиатуру — с @ для почты, с цифрами для телефона и кода, — а имя, адрес и телефон браузер подставляет сам, если поле сообщает, что оно такое. Необязательные поля помечены словом, ошибки после отправки видны и у поля, и списком сверху, а введённое не пропадает. Кнопка называет результат: «Получить расчёт», а не «Отправить».
Спрашивайте только то, что нужно для первого ответа
Заявка на расчёт кухни. Переключите на четыре поля: всё остальное выясняется в первом разговоре.
Каждое поле — вопрос, на который нужно ответить, прежде чем что-то получить. Отчество, город и «как вы о нас узнали» не помогают ответить — они только удлиняют форму. Про каждое поле спросите: что мы сделаем с этим ответом до первого звонка? Если ничего — поле уходит.
Подпись остаётся над полем
Подпись внутри поля исчезает с первой буквой. В заполненной форме уже непонятно, о чём спрашивали.
Серый текст внутри поля годится для примера ответа, но не для самого вопроса. Подпись над полем видна во время ввода, её читает экранная читалка, и по ней можно проверить форму перед отправкой. Подсказка — под полем: зачем нужен номер, в каком виде его ждут.
Ширина подсказывает ответ
Когда все поля одной длины, индекс выглядит как улица. Короткое поле говорит: здесь ждут короткий ответ.
Нужная клавиатура на телефоне
Тип поля сообщает телефону, какую клавиатуру открыть. Один атрибут — и не нужно переключать раскладки.
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.
<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 {
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 правил для форм
-
01
Только то, что нужно сейчас
Каждое лишнее поле — повод закрыть форму.
-
02
Одна колонка
Поля рядом — только когда они одно целое: дом и квартира.
-
03
Подпись над полем
Текст внутри поля — пример, а не вопрос.
-
04
Ширина по ответу
Индекс короткий, улица длинная.
-
05
Нужная клавиатура и автозаполнение
type, inputmode и autocomplete у каждого поля.
-
06
Помечать исключения
Если почти всё обязательно, словом помечают необязательные поля.
-
07
Ошибки в двух местах
У поля и списком сверху; введённое остаётся.
Частые ошибки в формах
-
Подсказка вместо подписи
После ввода непонятно, о чём было поле.
-
Три поля для имени
Чтобы обратиться к человеку, хватает одного поля «Имя».
-
Маска телефона, которая мешает
Номер, вставленный из контактов, не помещается, и его приходится набирать заново.
-
Кнопка «Очистить» рядом с «Отправить»
Один промах — и вся форма стёрта.
-
Капча на всякий случай
Скрытое поле и проверка на сервере отсекают большинство ботов, не мешая людям.
-
Форма очищается после ошибки
Вводить всё заново — самая частая причина бросить форму.
Вопросы о формах
Сколько полей должно быть в форме заявки?
Столько, сколько нужно для первого ответа: обычно имя, способ связи и что нужно.
Помечать обязательные поля или необязательные?
Те, которых меньше. В коротких формах почти всё обязательно, поэтому слово «необязательно» ставят у остальных. Звёздочку без пояснения понимают не все.
Нужна ли маска у поля телефона?
Часто хватает подсказки с примером. Если маска есть, она должна принимать номер, вставленный в любом виде.
Проверять поля во время ввода?
Формат — после того как человек ушёл из поля. Во время ввода — только такое, как надёжность пароля.
Шаги или одна длинная форма?
Шаги — для длинных форм с разными темами, например доставка и оплата, и с видимым прогрессом. Короткая форма помещается на один экран.
Что должно происходить после отправки?
Понятное подтверждение на том же экране: что получено, когда ждать ответа и что можно сделать пока.
Форма
Формы, которые
заполняют до конца
Проектирую и верстаю формы — от короткой заявки до оформления заказа, — которые заполняют без вопросов. Расскажите о проекте — отвечу в течение рабочего дня.