HTML & CSS

Форми в HTML

Повний розбір HTML-форм за специфікацією HTML Living Standard: <form>, всі типи <input>, <label>, <select>, <textarea>, <button>, <fieldset>, валідація, доступність та найкращі практики.

Форми в HTML

Як форми з'єднують людей із сервером

2004 рік. Марк Цукерберг запускає Facebook. Перше, що бачить новий користувач — форма реєстрації: ім'я, прізвище, пошта, пароль. Чотири поля і кнопка «Sign Up». Саме ця форма, написана на HTML, стала точкою входу для мільярдів людей.

Форми — єдиний нативний механізм HTML для двостороннього обміну даними між користувачем і сервером. Без форм веб залишився б лише читанкою: ви б не могли ні замовити піцу, ні написати коментар, ні авторизуватися.

За специфікацією HTML Living Standard (WHATWG), форми — це складна екосистема взаємопов'язаних елементів. Розберемо кожен із них.


Елемент <form> — контейнер форми

<form> (form — форма) представляє гіпертекстову форму з полями, які користувач може заповнити і відправити.

За специфікацією WHATWG:

  • Content model: flow content, але без вкладеного <form>
  • Permitted parents: будь-який елемент, що приймає flow content

Атрибути <form>

action
string
URL, на який надсилаються дані форми. За замовчуванням — поточна URL сторінки. Може бути відносним або абсолютним.
method
string
HTTP-метод: get або post. За замовчуванням get.
enctype
string
Тип кодування для method="post". Значення: application/x-www-form-urlencoded (за замовч.), multipart/form-data (для файлів), text/plain (для debug).
novalidate
boolean
Відключає браузерну валідацію при відправці форми.
autocomplete
string
on або off — дозволяти браузеру автодоповнення полів. За замовч. on.
target
string
Де показати відповідь: _self, _blank, _parent, _top або назва фрейму.
name
string
Ім'я форми для звернення через document.forms. Не впливає на відправку.

GET vs POST — ключова різниця

🔒localhost:3000

Коли GET:

  • Пошукові запити
  • Фільтрація та сортування
  • Будь-що, що можна закладати в браузер або ділитися лінком
  • Ідемпотентні операції (повторний запит = той самий результат)

::

🔒localhost:3000

Коли POST:

  • Авторизація, реєстрація
  • Створення або зміна даних
  • Відправка файлів
  • Будь-що, що не має бути видимим в URL або кешованим
🔒localhost:3000

::


Елемент <label> — підпис поля

<label> (label — підпис) пов'язує текстовий опис з елементом керування форми. Це критично для доступності: скринрідер оголошує підпис при фокусуванні на полі.

Два способи зв'язку

🔒localhost:3000
Перший спосіб (через for/id) — кращий: він дозволяє більшу гнучкість у верстці, бо <label> і <input> не зобов'язані бути поруч у DOM.

Клік на <label> фокусує поле

Це важлива UX-перевага: клікаючи на текст підпису, користувач переходить у поле. Особливо критично для чекбоксів та радіокнопок — їхні мітки є дуже маленькими за замовчуванням:

🔒localhost:3000

Елемент <input> — поле вводу

<input> (input — ввід) — void element, найбільш багатофункціональний елемент форми. Атрибут type визначає, яким є поле.

Типи <input>

Текстові поля

🔒localhost:3000

Базовий однорядковий текстовий ввід. Найуніверсальніший тип.

::

🔒localhost:3000

На мобільних пристроях відображає клавіатуру з символами @ та .. Браузер автоматично перевіряє базовий формат.

🔒localhost:3000

Символи замінюються на . autocomplete="new-password" — підказка браузеру запропонувати генератор паролів.

🔒localhost:3000

::

Числові та діапазон

🔒localhost:3000

Дата та час

🔒localhost:3000

Checkbox та Radio

🔒localhost:3000
Однакове name у <input type="radio"> — це те, що робить їх групою. Браузер автоматично знімає вибір попередньої кнопки при виборі нової.

Колір та файл

🔒localhost:3000

Приховані та кнопкові

🔒localhost:3000

Спільні атрибути <input>

АтрибутТипОпис
namestringІм'я поля — ключ у парі ключ=значення при відправці
idstringУнікальний ідентифікатор для <label for>
valuestringПочаткове значення (або відправлюване для checkbox/radio/hidden)
placeholderstringПідказка всередині поля (зникає при введенні)
requiredbooleanПоле обов'язкове для заповнення
disabledbooleanПоле заблоковане, не відправляється з формою
readonlybooleanПоле лише для читання, але відправляється з формою
autofocusbooleanАвтоматичний фокус при завантаженні сторінки
autocompletestringПідказка браузеру для автодоповнення (значень дуже багато)
min / maxvariesМінімальне/максимальне значення для number, date, range
minlength / maxlengthnumberМінімальна/максимальна довжина тексту
stepnumber/stringКрок для number, range, date, time
patternstringРегулярний вираз для валідації значення
multiplebooleanДозволяє кілька значень (email, file)
acceptstringДозволені типи файлів для type="file"

Елемент <textarea> — багаторядковий текст

<textarea> (text area — текстова область) — поле для багаторядкового тексту. На відміну від <input>, має закриваючий тег і може містити текст за замовчуванням:

🔒localhost:3000
rows
number
Кількість видимих рядків (висота). За замовч. 2. Рекомендовано вказувати явно.
cols
number
Кількість видимих символів у рядку (ширина). За замовч. 20. На практиці краще контролювати через CSS.
wrap
string
soft (за замовч.) — перенос лише для відображення; hard — перенос вставляється в значення при відправці.
resize
string
Не є HTML-атрибутом — контролюється через CSS-властивість resize: both, horizontal, vertical, none.

Елемент <select> — випадаючий список

🔒localhost:3000
multiple
boolean
Дозволяє вибір кількох <option> (Ctrl+Click або Shift+Click).
size
number
Кількість видимих рядків. При multiple рекомендовано вказувати.

Елемент <button> — кнопка

<button> — більш потужна альтернатива <input type="submit">. На відміну від <input>, <button> може містити будь-який phrasing content — текст, зображення, іконки:

🔒localhost:3000
<button> без атрибута type всередині <form> має тип submit за замовчуванням — це може призвести до ненавмисного відправлення форми при кліку. Завжди вказуйте type="button" для кнопок без функції відправки.

<fieldset> та <legend> — групування полів

<fieldset> (field set — набір полів) групує пов'язані елементи форми. <legend> (legend — легенда) — підпис групи, перший дочірній елемент <fieldset>:

🔒localhost:3000
<fieldset disabled> — елегантний спосіб заблокувати одразу всю групу полів. Браузер ігнорує всі елементи всередині при відправці форми.

<datalist> — список підказок

<datalist> надає попередньо визначені варіанти для <input>, не обмежуючи введення користувача (на відміну від <select>):

🔒localhost:3000

<output> — результат обчислення

<output> (output — результат) представляє результат обчислення. Семантично пов'язується з полями через атрибут for:

🔒localhost:3000

<progress> та <meter> — прогрес і вимірювання

🔒localhost:3000

Вбудована валідація HTML5

Браузери виконують базову валідацію до відправки форми. Атрибути, що беруть участь у валідації:

Атрибути валідації

🔒localhost:3000

novalidate — відключення валідації

🔒localhost:3000

CSS-псевдокласи валідації

🔒localhost:3000
Браузерна валідація HTML5 — лише перша лінія захисту для UX. Вона не замінює серверну валідацію. Будь-який користувач може відключити required через DevTools або надіслати запит напряму, оминаючи форму.

Autocomplete — підказки браузеру

Атрибут autocomplete стандартизований: правильні значення дозволяють браузеру та менеджерам паролів точно знати, яке поле для чого:

🔒localhost:3000

Практичні завдання


Комплексний приклад від А до Я

Тема: Форма заявки на вакансію — Full Stack Developer у стартапі TechUA.

🔒localhost:3000

Що демонструє цей приклад:

🏗️ Структура форми

<form> з method="post", enctype="multipart/form-data", novalidate. Прихований CSRF-токен. Чотири <fieldset> з <legend> для логічного групування.

📝 Поля вводу

Всі типи <input>: text, email, tel з pattern, url, number, range + <output>, date, radio (група), checkbox (кілька груп), file (одиночний та multiple), color, hidden.

🎛️ Складні елементи

<select> з <optgroup>, <datalist> для міст, <textarea> з maxlength, <output> для лічильника, <progress> + <meter> для прогресу.

🌐 Доступність

Всі поля мають <label for>. Групи <radio> і <checkbox> загорнуті у вкладені <fieldset>. autocomplete атрибути. <abbr title> для позначення обов'язкових полів. aria-live для динамічного прогресу.

Корисні посилання

Copyright © 2026