Глиф Учебники

Урок 5. Формы

Курс «HTML и CSS» · урок 5 из 10 · 4 минуты чтения

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

Простая форма

HTML
<form action="/send" method="post">
  <p>
    <label for="name">Имя</label>
    <input type="text" id="name" name="name" required>
  </p>
  <p>
    <label for="email">Электронная почта</label>
    <input type="email" id="email" name="email" placeholder="name@example.com" required>
  </p>
  <p>
    <label for="message">Сообщение</label>
    <textarea id="message" name="message" rows="5"></textarea>
  </p>
  <button type="submit">Отправить</button>
</form>

Что здесь:

<label for="email">Электронная почта</label> <input type="email" id="email" name="email" …> for = id — подпись связана с полем на странице Электронная почта anna@example.com уйдёт на сервер email =anna@example.com name = введённое
Атрибут for у label совпадает с id поля, поэтому подпись связана с полем, а name="email" даёт имя, под которым введённый адрес уйдёт на сервер парой email=значение.

Типы полей

typeЧто это
textобычный текст
emailадрес почты: браузер проверит, есть ли в нём @
passwordпароль: вместо букв — точки
numberчисло, со стрелками; границы — min и max
telтелефон: на смартфоне откроется цифровая клавиатура
urlадрес сайта
dateдата с календарём
searchполе поиска
fileвыбор файла
checkboxфлажок
radioпереключатель — один вариант из нескольких

На телефоне правильный type открывает подходящую клавиатуру: для email — с @, для tel — цифры. Это заметно удобнее, чем всегда писать type="text".

Флажки и переключатели

HTML
<p>
  <input type="checkbox" id="news" name="news" value="yes" checked>
  <label for="news">Получать новости</label>
</p>

<fieldset>
  <legend>Удобное время</legend>
  <input type="radio" id="morning" name="time" value="morning">
  <label for="morning">Утро</label>
  <input type="radio" id="evening" name="time" value="evening">
  <label for="evening">Вечер</label>
</fieldset>
Одинаковый name — группа Утро name="time" Вечер name="time" выбрать можно только один на сервер: time=morning Разные name — ошибка Утро name="morning" Вечер name="evening" отмечаются оба сразу
Переключатели с общим name="time" образуют группу, где выбран один вариант и на сервер уходит time=morning, а с разными name отмечаются оба варианта сразу.

Выпадающий список

HTML
<label for="city">Город</label>
<select id="city" name="city">
  <option value="">— выберите —</option>
  <option value="minsk">Минск</option>
  <option value="brest">Брест</option>
  <option value="gomel" selected>Гомель</option>
</select>

Каждый вариант — <option>, selected — выбран заранее. На сервер уходит value выбранного варианта, а видит посетитель текст между тегами.

Проверка заполнения

Браузер сам проверяет поля перед отправкой, если указаны правила:

HTML
<input type="text" name="login" required minlength="3" maxlength="20">
<input type="number" name="age" min="6" max="99">
<input type="text" name="code" pattern="[0-9]{6}" title="Шесть цифр">

Проверка в браузере — только удобство для посетителя. Её легко обойти, поэтому программа на сервере должна проверять все данные заново. Никогда не полагайтесь только на required и pattern.

Что происходит при отправке

При нажатии кнопки браузер собирает пары name=значение всех полей и отправляет их по адресу из action:

Поиск пирог Найти name=значение q=пирог method="get" search.html ?q=пирог данные видны в адресной строке method="post" search.html тело запроса: q=пирог
Браузер собирает из поля пару q=пирог: при method="get" она дописывается к адресу после знака ?, а при method="post" идёт в теле запроса, и адрес остаётся без неё.

Если method не указан, используется get, а без action форма отправляется на адрес текущей страницы.

Посмотреть отправку можно и без сервера. Сохраните форму с method="get" на странице, откройте её с диска и отправьте:

HTML
<form>
  <label for="q">Поиск</label>
  <input type="search" id="q" name="q">
  <button>Найти</button>
</form>

После нажатия в адресной строке появится ?q= и введённое слово: страница открылась заново с данными формы. Кнопка <button> внутри формы по умолчанию отправляет её. Если кнопка нужна для другого (например, для JavaScript), пишите type="button".

HTML сам по себе данные не сохраняет и писем не отправляет. Чтобы заявки приходили на почту или записывались в базу, нужна программа на сервере — на PHP или другом языке, — или готовый сервис форм.

Коротко

Проверьте себя

1. Поле есть на странице, но его значение не приходит на сервер. Чего, скорее всего, не хватает?
2. Как сделать группу переключателей, где можно выбрать только один вариант?
3. Каким методом лучше отправлять форму входа с паролем?
4. Достаточно ли атрибута required, чтобы на сервер не пришли пустые данные?