Скидки до 60% и 3 курса в подарок 0 дней 00 :00 :00 Выбрать курс
Код Справочник по фронтенду
#статьи

HTML <​form​>: тег для создания форм, его атрибуты, методы отправки данных

Разбираем, что такое форма в HTML, как правильно её сделать, какие элементы и атрибуты в ней используются, смотрим типовые примеры реализации.

Иллюстрация: Polina Vari для Skillbox Media

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

В этой статье разберём, зачем нужен <form>, какие атрибуты он поддерживает, как работают поля и кнопки, что происходит при отправке данных и как правильно проверять ввод.

Содержание


Что делает тег <form> и зачем он нужен

За работу форм отвечает тег <form>. Он создаёт контейнер, в котором находятся все поля ввода, кнопки и другие элементы. Без него браузер не поймёт, что делать с введённой информацией.

Простейшая форма может быть такой:

<form action="/submit" method="post">
  <label for="name">Ваше имя:</label>
  <input type="text" id="name" name="name" required>
  <label for="email">Email:</label>
  <input type="email" id="email" name="email" required>
  <button type="submit">Отправить</button>
</form>

На странице будет видно только поля и кнопку, сам контейнер <form> не отобразится.

Вот так выглядит форма, код которой мы посмотрели выше. На странице видно только поля и кнопку, сам контейнер <form> не отображается.

Скриншот: Google Chrome / Skillbox Media

Основные атрибуты тега <form>: action, method, enctype

Чтобы форма знала, куда и как отправлять данные, с тегом <form> используют специальные атрибуты. Самые важные из них — action, method и enctype.

action — куда отправлять данные

Здесь указывается адрес страницы или скрипта, который примет данные формы.

<form action="/send.php" method="post">
  ...
</form>

Если не указать action, форма отправится на ту же страницу, где находится.

method — каким способом отправлять

Есть два основных метода:

  • get — данные добавляются прямо в адресную строку. Подходит для поиска и фильтров.
  • post — данные уходят «внутри» запроса, и в адресе их не видно. Используется для форм регистрации, входа и других форм с личной информацией.
<!-- GET-запрос -->
<form action="/search" method="get">
  <input type="text" name="query" placeholder="Поиск...">
  <button type="submit">Найти</button>
</form>

<!-- POST-запрос -->
<form action="/login" method="post">
  <input type="text" name="username" placeholder="Логин">
  <input type="password" name="password" placeholder="Пароль">
  <button type="submit">Войти</button>
</form>

Когда использовать get:

  • если данные не секретные,
  • если нужно поделиться ссылкой (например, результатами поиска),
  • если объём данных маленький.

Когда использовать post:

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

enctype — как кодировать данные

Этот атрибут нужен, если в форме есть загрузка файлов.

<form action="/upload" method="post" enctype="multipart/form-data">
  <input type="file" name="document">
  <button type="submit">Загрузить</button>
</form>

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

Другие полезные атрибуты

  • target — указывает, где открыть результат после отправки формы. Чаще всего это то же окно (_self), но можно и новое (_blank).
  • novalidate — отключает встроенную проверку формы. Используйте, если хотите проверять данные с помощью своего скрипта.
  • autocomplete — включает или выключает автозаполнение полей. Значения: on (включено) или off (выключено).

Пример формы со всеми атрибутами:

<form 
  action="/submit" 
  method="post" 
  enctype="multipart/form-data" 
  target="_blank" 
  novalidate 
  autocomplete="off">
</form>

Элементы внутри формы: input, textarea, button, select

Внутри тега <form> размещаются различные элементы управления для ввода данных.

Поля ввода (<input>)

Это основной элемент формы. С его помощью пользователь вводит имя, пароль, email и другие данные.

<form action="/register" method="post">
  <!-- Текстовое поле -->
  <input type="text" name="username" placeholder="Имя пользователя">
  
  <!-- Поле для email -->
  <input type="email" name="email" placeholder="Email">
  
  <!-- Поле для пароля -->
  <input type="password" name="password" placeholder="Пароль">
  
  <!-- Чекбокс -->
  <input type="checkbox" name="agree" id="agree">
  <label for="agree">Согласен с условиями</label>
  
  <!-- Радиокнопки -->
  <input type="radio" name="gender" value="male" id="male">
  <label for="male">Мужской</label>
  
  <input type="radio" name="gender" value="female" id="female">
  <label for="female">Женский</label>
</form>

Многострочное поле <textarea>

Для текста большого объёма: комментариев, отзывов и тому подобного.

<textarea name="message" rows="5" cols="40" placeholder="Ваше сообщение"></textarea>

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

Позволяет выбрать один из заранее заданных вариантов.

<select name="country">
  <option value="">Выберите страну</option>
  <option value="ru">Россия</option>
  <option value="ua">Украина</option>
  <option value="by">Беларусь</option>
</select>

Кнопки <button> для управления формой

Управляют отправкой или очисткой формы.

<!-- Кнопка отправки -->
<button type="submit">Отправить форму</button>

<!-- Кнопка сброса -->
<button type="reset">Очистить</button>

<!-- Обычная кнопка для JavaScript -->
<button type="button" onclick="doSomething()">Выполнить действие</button>

Главное правило: у каждого поля должен быть атрибут name. Без него данные не попадут на сервер.

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

Когда пользователь нажимает кнопку «Отправить», браузер выполняет несколько действий:

  • Собирает данные. Берутся все значения из полей, у которых есть атрибут name.
  • Кодирует данные. Информация преобразуется в нужный формат, заданный атрибутом enctype.
  • Формирует запрос. Используется метод, указанный в method, — GET или POST.
  • Отправляет запрос. Данные уходят по адресу из action.
  • Показывает ответ. Сервер возвращает результат — например, сообщение «Спасибо» или страницу с ошибкой.

Валидация данных в HTML-формах

Валидация — это проверка данных перед отправкой формы. Браузер может сам проверить, всё ли заполнено правильно, и сказать пользователю, если что-то не так.

Встроенная валидация в HTML5

HTML5 умеет проверять данные без единой строчки кода на JavaScript. Для этого у элементов формы есть специальные атрибуты.

1. Обязательные поля — required

Если поставить этот атрибут, пользователь не сможет отправить форму, пока поле пустое.

<form action="/contact" method="post">
  <input type="text" name="name" required placeholder="Имя*">
  <input type="email" name="email" required placeholder="Email*">
  <textarea name="message" required placeholder="Сообщение*"></textarea>
  <button type="submit">Отправить</button>
</form>

Если оставить поле пустым и нажать «Отправить», браузер покажет сообщение об ошибке.

2. Проверка по типу — type

Атрибут type задаёт допустимые типы данных.

<!-- Проверка email -->
<input type="email" name="email" required>

<!-- Проверка URL -->
<input type="url" name="website" placeholder="https://example.com" required>

<!-- Проверка числа -->
<input type="number" name="age" min="18" max="100" required>

Если ввести, например, текст вместо числа, браузер не даст отправить форму и покажет подсказку.

Скриншот: Google Chrome / Skillbox Media

3. Проверка по шаблону — pattern

Этот атрибут позволяет задать правило в виде регулярного выражения.

<!-- Телефон в формате +71234567890 -->
<input type="tel" name="phone" pattern="\+7\d{10}" 
       placeholder="+71234567890" title="Формат: +71234567890">

<!-- Пароль: минимум 8 символов, буквы и цифры -->
<input type="password" name="password" 
       pattern="(?=.*\d)(?=.*[a-z]).{8,}" 
       title="Минимум 8 символов, должны быть буквы и цифры">

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

Кастомная валидация

Стандартной проверки иногда недостаточно. Например, если нужно выводить свои сообщения об ошибках или проверять данные по более сложным правилам. В этих случаях используют JavaScript.

Пример:

<form id="myForm">
  <input type="email" id="email" name="email" required>
  <button type="submit">Отправить</button>
</form>

<script>
const emailField = document.getElementById('email');

emailField.addEventListener('invalid', function() {
  this.setCustomValidity('Пожалуйста, введите корректный email');
});

emailField.addEventListener('input', function() {
  this.setCustomValidity(''); // Очищаем сообщение, если пользователь исправил ошибку
});
</script>

Теперь при неверном вводе браузер покажет сообщение «Пожалуйста, введите корректный email» вместо стандартного.

Доступность форм для всех пользователей

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

Вот несколько вещей, на которые нужно обратить внимание, чтобы сделать форму доступной.

1. Подписи к полям (<label>)

Каждое поле должно иметь понятную подпись. Лучше связывать подпись с полем с помощью атрибутов for и id. Так проще попасть в поле: можно просто кликнуть по лейблу, и курсор сам перейдёт в нужное поле.

<label for="username">Имя пользователя:</label>
<input type="text" id="username" name="username" required>
Скриншот: Google Chrome / Skillbox Media

2. Группировка связанных полей (<fieldset> и <legend>)

Если поля относятся к одной теме (например, личные данные), их лучше обернуть в <fieldset>. Внутри можно добавить заголовок <legend>.

<fieldset>
  <legend>Личная информация</legend>
  <label for="firstName">Имя:</label>
  <input type="text" id="firstName" name="firstName">
  
  <label for="lastName">Фамилия:</label>
  <input type="text" id="lastName" name="lastName">
</fieldset>

3. Понятные подсказки и сообщения об ошибках

Если нужно пояснить, что именно вводить, используйте дополнительный текст. Его можно связать с полем через aria-describedby.

<label for="cardNumber">Номер карты:</label>
<input type="text" id="cardNumber" name="cardNumber" 
       aria-describedby="cardHelp" maxlength="19">
<div id="cardHelp">Введите 16 цифр без пробелов</div>

4. Навигация с помощью клавиатуры

Переход по клавише Tab должен идти по полям в правильном порядке. Избегайте лишнего tabindex, если в нём нет особой необходимости.

Как стилизовать форму с помощью CSS

CSS позволяет делать формы красивыми и приводить их к общему стилю сайта. Давайте стилизуем вот эту форму:

<form action="/contact" method="post">
  <input type="text" name="name" required placeholder="Имя*">
  <input type="email" name="email" required placeholder="Email*">
  <textarea name="message" required placeholder="Сообщение*"></textarea>
  <button type="submit">Отправить</button>
</form>

Добавим к ней вот такие стили:

form {
  max-width: 420px; /* Ограничение формы по ширине */
  margin: 0 auto; /* Выравнивание формы по центру */
  padding: 20px; /* Внутренние отступы */
  border: 1px solid #ccc; /* Обводка */
  border-radius: 5px; /* Скругление */
}

input, textarea, button {
  width: 100%; /* Ширина полей */
  padding: 10px; /* Внутренние отступы */
  margin: 0 0 10px; /* Отступы между полями */
  border: 1px solid #ccc; /* Обводка */
  border-radius: 5px; /* Скругление */
}

textarea {
  height: 150px; /* Высота поля */
  resize: none; /* Запрет на изменение ширины и высоты пользователем */
}

button {
  background-color: #4cf50; /* Фоновый цвет */
  color: #ffffff; /* Цвет текста */
  cursor: pointer; /* Курсор в виде пальца */
}

button:hover {
  opacity: 0.8; /* Прозрачность при наведении */
}

В итоге форма будет выглядеть вот так:

Скриншот: Google Chrome / Skillbox Media

Примеры типичных форм

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

Форма обратной связи

Позволяет оставить сообщение администратору или службе поддержки.

<form action="/contact" method="post">
  <label for="contactName">Ваше имя:</label>
  <input type="text" id="contactName" name="name" required>
  
  <label for="contactEmail">Email:</label>
  <input type="email" id="contactEmail" name="email" required>
  
  <label for="contactSubject">Тема сообщения:</label>
  <select id="contactSubject" name="subject" required>
    <option value="">Выберите тему</option>
    <option value="support">Техническая поддержка</option>
    <option value="sales">Продажи</option>
    <option value="other">Другое</option>
  </select>
  
  <label for="contactMessage">Сообщение:</label>
  <textarea id="contactMessage" name="message" rows="5" required></textarea>
  
  <button type="submit">Отправить сообщение</button>
</form>

Вот так будет выглядеть форма в итоге:

Скриншот: Google Chrome / Skillbox Media

Форма поиска

Нужна, чтобы быстро находить информацию на сайте.

<form action="/search" method="get" role="search">
  <label for="searchQuery" class="visually-hidden">Поиск по сайту:</label>
  <input type="search" id="searchQuery" name="q" 
         placeholder="Что вы ищете?" required>
  <button type="submit">Найти</button>
</form>
Скриншот: Google Chrome / Skillbox Media

Форма авторизации

Используется для входа в личный кабинет.

<form action="/login" method="post">
  <label for="username">Логин:</label>
  <input type="text" id="username" name="username" required>
  
  <label for="password">Пароль:</label>
  <input type="password" id="password" name="password" required>
  
  <button type="submit">Войти</button>
</form>
Скриншот: Google Chrome / Skillbox Media

Форма загрузки файлов

Чаще всего встречается при отправке документов или резюме. С ней часто бывают сложности из-за нетипичных атрибутов enctype у формы и accept у поля.

<form action="/upload" method="post" enctype="multipart/form-data">
  <label for="fileUpload">Выберите файл:</label>
  <input type="file" id="fileUpload" name="document" 
         accept=".pdf,.doc,.docx" required>
  
  <label for="fileDescription">Описание файла:</label>
  <textarea id="fileDescription" name="description" rows="3"></textarea>
  
  <button type="submit">Загрузить файл</button>
</form>
Скриншот: Google Chrome / Skillbox Media

Типичные ошибки при работе с формами

1. Нет атрибута name у поля

Без name данные не попадут на сервер.

<!-- Ошибка -->
<input type="text" placeholder="Имя">

<!-- Правильно -->
<input type="text" name="name" placeholder="Имя">

2. Неправильный метод отправки

Использовать GET для паролей или личных данных небезопасно: они попадут в адресную строку. Для таких случаев нужен POST.

3. Нет подписей у полей

Если <label> не связан с полем, скринридеры не смогут озвучить его корректно. Это сильно мешает пользователям с ограниченными возможностями здоровья.

4. Ошибки при загрузке файлов

Если форма загружает файлы, но нет атрибута enctype="multipart/form-data", файлы не отправятся.

Полезные советы и лайфхаки

Есть несколько приёмов, которые помогут сделать формы удобнее и надёжнее.

1. Используйте правильные типы input.

HTML5 поддерживает много типов: email, tel, url, date, color, range и другие. Они помогают браузеру проверять данные и дают пользователю удобный интерфейс. Например, на телефоне при type="tel" сразу появляется клавиатура с цифрами.

2. Осторожнее с тегом <legend>.

Он нужен для описания группы полей в <fieldset>, но плохо стилизуется. Если нужно оформить заголовок красиво, можно оставить <legend> для доступности (и скрыть его с помощью класса visually-hidden), а видимый текст сделать обычным заголовком или абзацем.

3. Следите за порядком навигации.

Если используете tabindex, убедитесь, что переход по клавише Tab остаётся логичным. Слишком сложный порядок запутает пользователей.



Попробуйте бесплатно 4 топовых направления в IT

Переходите в Telegram и откройте доступ к бесплатным IT-курсам. Попробуйте себя в Python, Java, тестировании ПО, SQL и Excel. Определите, какое направление вам подходит, и получите подарки.

Пройти курс
Научитесь: Профессия Фронтенд-разработчик + ИИ Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована