Форма — единственное место, где посетитель что-то отправляет сайту, а не только читает. Отсюда особое отношение: тут человек может ошибиться, бросить дело на полпути или не понять, чего от него хотят.

Зачем это знать

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

Из чего состоит форма

Форма — тег <form>, внутри поля и кнопка отправки. У каждого поля обязательно есть имя (name): под этим именем значение уйдёт на сервер. Поле без имени не отправляется вообще — частая и незаметная ошибка.

Минимальная форма
<form action="/send.php" method="post">
  <label for="name">Как вас зовут</label>
  <input id="name" name="name" type="text" required>

  <button type="submit">Отправить</button>
</form>

Связь подписи и поля держится на паре for и id: они должны совпадать. Тогда щелчок по подписи ставит курсор в поле — мелочь, которая на телефоне экономит промахи, — а программа чтения экрана называет поле по имени, а не «поле ввода текста».

Атрибут type: пятнадцать полей вместо одного

Тег <input> один, а видов у него много, и задаёт вид атрибут type. Это не про красоту: от него зависит клавиатура на телефоне и проверка введённого.

Типы полей, которые нужны чаще всего
Значение Что даёт
text Обычная строка
email Клавиатура со знаком @ и проверка формата адреса
tel Цифровая клавиатура на телефоне
checkbox Согласие или выбор нескольких вариантов
radio Ровно один вариант из нескольких

Для длинного сообщения берётся отдельный тег <textarea>, для списка вариантов — <select>.

Браузер проверяет сам

Условия на ввод записываются прямо в разметке, и браузер их соблюдает без всякого JavaScript.

Условия прямо в разметке
Атрибут Что требует
required Поле должно быть заполнено
minlength Не короче указанного числа знаков
max, min Границы для чисел и дат
pattern Значение по заданному образцу

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

Проверка в браузере — не защита

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

Группы полей и что происходит после отправки

Переключатели «удобное время: утро, день, вечер» — это не три отдельных вопроса, а один. В разметке такая группа обводится тегом <fieldset>, а общий вопрос пишется в <legend>. Без этого программа чтения экрана назовёт каждый переключатель отдельно, и человек услышит «утро» без всякого вопроса. Переключатели одной группы связывает общее значение name: именно поэтому выбрать можно только один.

После нажатия кнопки браузер собирает пары «имя — значение» и отправляет их по адресу из атрибута action. Способ задаёт method, и выбор между двумя способами простой.

Два способа отправки
Способ Что происходит Когда брать
get Значения видны в адресе страницы Поиск и фильтры: такой адрес можно сохранить и переслать
post Значения уходят внутри запроса, в адресе их нет Всё остальное: письма, заявки, любые личные данные

Три мелочи, которые решают

  • autocomplete. С ним браузер подставляет имя, почту и телефон одним касанием. Без него человек набирает адрес пальцем — и часто бросает.
  • Подпись, а не плейсхолдер. Серый текст внутри поля исчезает при вводе, и человек забывает, что здесь спрашивали. Плейсхолдер — для примера формата, подпись — обязательна.
  • Кнопка говорит, что произойдёт. «Отправить сообщение» понятнее, чем «Отправить», и гораздо понятнее, чем «ОК».

Что просить у нейросети

Мой запрос

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

Условия: у каждого поля отдельная подпись label, связанная через for и id; правильные значения type и autocomplete; обязательные поля помечены required; варианты времени — переключатели в fieldset с legend.

Плейсхолдеры вместо подписей не использовать. Классы по БЭМ, семантическая разметка, проверь, что форму можно заполнить одной клавиатурой.

Как проверить, что получилось

  • Щёлкнуть по каждой подписи: курсор должен вставать в её поле.
  • Заполнить форму, не трогая мышь: только Tab, ввод и Enter.
  • Отправить пустую форму: браузер должен остановить отправку и показать, где ошибка.
  • Открыть на телефоне: в поле телефона должна появиться цифровая клавиатура.

Что стоит запомнить

  • У каждого поля есть name — без него значение не отправится
  • Подпись связана с полем через for и id
  • type задаёт клавиатуру на телефоне и проверку значения
  • Браузер проверяет введённое сам, если условия стоят в разметке
  • Настоящая проверка всегда повторяется на сервере