Тег <label> в HTML нужен, чтобы связать подпись с полем ввода. Это не просто текст рядом с инпутом — это функциональный элемент: клик по подписи активирует поле. И важно сделать это так, чтобы всё работало одинаково в браузерах и на разных устройствах.
Два способа связать label с полем
Есть два рабочих варианта: по атрибуту for и через вложенность.
Способ 1: атрибут for (явная связь)
У поля должен быть уникальный id, а у label — атрибут for, равный этому id.
<label for="email">Email:</label> <input type="email" id="email" name="email">
Как это работает:
- Клик по тексту «Email:» ставит фокус в поле.
- Скринридер при фокусе на инпуте сразу озвучивает подпись.
- Связь не зависит от расположения элементов на странице: label может быть выше, ниже, в другом блоке — всё равно будет работать.
Важные правила:
idдолжен быть уникальным на странице.- Значение
forдолжно точно совпадать сid(регистр важен). - Нельзя давать один
idнескольким полям.
Способ 2: label оборачивает input (вложенность)
<label> Email: <input type="email" name="email"> </label>
Здесь связь задаётся структурой: input находится внутри label. Клик по любой части label (включая текст) активирует поле.
Плюсы:
- Не нужны
idиfor. - Проще писать для простых форм.
Минусы:
- Если нужно разместить label и input в разных местах верстки (например, label в одной колонке, input в другой), этот способ не подойдёт.
- При сложной вёрстке легко случайно «сломать» структуру (лишние обёртки, абсолютное позиционирование и т. п.), и тогда связь может перестать работать корректно в некоторых браузерах.
Что выбрать на практике
- Используйте
for+id, если:- Элементы разнесены по верстке.
- Нужна максимальная предсказуемость (особенно для форм с кастомными инпутами, радио‑кнопками, чекбоксами).
- Делаете формы, где важна доступность и стабильная работа со скринридерами.
- Используйте вложенность, если:
- Форма простая, элементы идут подряд.
- Не планируется сложная перестановка блоков.
На практике чаще используют первый способ — он универсальнее.
Частые ошибки и как их избежать
- Нет
idу поля. Без негоforне сработает. - Несовпадение
forиid. Даже одна лишняя буква или пробел — и связь теряется. - Дублирование
idна странице. Это ломает логику: клик может активировать не то поле, скринридер будет ошибаться. - Несколько label на одно поле. Технически возможно, но лучше избегать: это усложняет восприятие и может запутать пользователей скринридеров.
- Label без связи с полем. Если label просто лежит рядом, он не даёт никаких преимуществ: клик не активирует поле, скринридер не понимает связь.
Пример с ошибкой:
<!-- Неправильно: у input нет id --> <label for="phone">Телефон:</label> <input type="tel" name="phone">
Правильно:
<label for="phone">Телефон:</label> <input type="tel" id="phone" name="phone">
Label и разные типы полей
Текстовые поля, email, tel, password
Работает стандартно:
<label for="password">Пароль:</label> <input type="password" id="password" name="password">
Чекбоксы и радио‑кнопки
Здесь label особенно важен: он увеличивает область клика и делает форму удобнее.
<label for="agree"> <input type="checkbox" id="agree" name="agree" value="1"> Я согласен с условиями </label>
Можно и так:
<input type="checkbox" id="agree" name="agree" value="1"> <label for="agree">Я согласен с условиями</label>
Оба варианта корректны. Главное — совпадение id и for.
Select и textarea
То же самое:
<label for="message">Сообщение:</label> <textarea id="message" name="message" rows="4"></textarea>
<label for="city">Город:</label> <select id="city" name="city"> <option value="">Выберите город</option> <option value="msk">Москва</option> </select>
Пример полноценной формы с правильными label
<form action="/submit" method="post"> <div> <label for="name">Имя:</label> <input type="text" id="name" name="name" required> </div> <div> <label for="email">Email:</label> <input type="email" id="email" name="email" required> </div> <div> <label for="phone">Телефон:</label> <input type="tel" id="phone" name="phone"> </div> <div> <label for="agreement"> <input type="checkbox" id="agreement" name="agreement" value="1" required> Я принимаю условия обработки данных </label> </div> <button type="submit">Отправить</button> </form>
В этой форме все подписи связаны с полями, клики работают везде, а скринридеры корректно озвучивают поля.
