Что делает элемент label
<label> дает полю формы имя. Свяжите его через for, равный id поля, и произойдут две вещи: программы чтения с экрана объявляют подпись, когда поле получает фокус, а клик по тексту подписи ставит фокус в поле. Кликните по обоим текстам ниже:
Клик по «City» ставит курсор в поле. Клик по «Country» ничего не делает, а программа чтения с экрана на втором поле слышит только «поле редактирования», без имени. Выглядят они одинаково; подписано только одно.
Два способа связать подпись
Используйте for и id или поместите поле внутрь label:
for и id | Обертывание | |
|---|---|---|
Нужен id | Да, уникальный на странице | Нет |
| Подпись и поле могут стоять отдельно | Да (ячейка таблицы, сетка) | Нет, поле внутри |
| Как легко сломать | Опечаткой или повторным id | Двумя полями в одной подписи |
for должен совпадать с id поля, а не с его name. Часто это одно и то же слово, и ошибка скрыта, пока кто-нибудь не изменит одно из них. Использовать оба способа сразу (обертывание и for) нормально и распространено.
Подпись можно связать с <input> (кроме type="hidden"), <select>, <textarea>, <button>, <meter>, <output> и <progress>. Одна подпись называет одно поле. У поля может быть несколько подписей, но одна понятная подпись удобнее всем.
Большая область клика для чекбоксов и радиокнопок
Для маленьких элементов управления подпись важнее всего: клик в любом месте подписи переключает флажок, поэтому целью становится вся строка текста, а не квадрат размером 13 пикселей. Оформление подписи может сделать область еще больше:
Кликните по внутреннему отступу каждой строки, в стороне от флажка. Первая строка переключается; вторая ничего не делает, если не попасть точно во флажок. Подробнее о чекбоксах на странице чекбокс в HTML.
Подсказки и сообщения об ошибках
Подпись должна быть короткой: название поля. Дополнительные инструкции и сообщения об ошибках пишут в отдельных элементах и связывают через aria-describedby, чтобы программы чтения с экрана сначала читали подпись, а потом описание:
Нажмите Create с пустым полем, затем с AB, затем с ada99. С aria-describedby программа чтения с экрана объявит что-то вроде «Username, обязательное, поле редактирования, 3 to 16 lowercase letters or digits, Enter a username.» Звездочка помечена aria-hidden, потому что атрибут required уже сообщает «обязательное»; слово «звездочка» ничего не добавляет.
Скрытые подписи
У некоторых полей есть видимая подсказка помимо текстовой подписи, например поле поиска рядом с кнопкой Search. Подпись все равно нужна; скройте ее визуально, но оставьте на странице для программ чтения с экрана:
Не скрывайте ее через display: none или visibility: hidden: так она скрывается и от программ чтения с экрана, и не каждый браузер и не каждая программа чтения с экрана все еще используют скрытую подпись как имя. Другой вариант это aria-label="Search courses" у поля, который дает ему имя без элемента label. Видимая подпись все равно лучший выбор, когда есть место: всем полезно видеть, для чего поле.
Частые ошибки
forуказывает наnameвместоid. Связи нет.- Повторяющиеся id.
forсвязывается с первым элементом с этим id, а это может быть поле другой формы на странице. - Placeholder вместо подписи. Он исчезает при вводе и не является надежным именем.
- Два поля внутри одной подписи. Подпись называет одно поле; второе остается без подписи.
- Ссылка внутри подписи чекбокса, например «Я принимаю условия», где «условия» это ссылка. Часть строки переключает флажок, а часть открывает страницу, и промахнуться легко. Вынесите ссылку за пределы подписи.
- Подпись скрыта через
display: none. Используйте класс для визуального скрытия. - Текст рядом с полем, который не является
<label>. Выглядит так же и ничего не делает. О форме вокруг полей читайте на странице формы в HTML.
Часто задаваемые вопросы
Что делает тег label в HTML?
Он дает имя полю формы. Программы чтения с экрана зачитывают подпись, когда поле получает фокус, а клик по подписи ставит фокус в поле или переключает его, если это чекбокс или радиокнопка.
Что такое атрибут for у label?
for содержит id поля, к которому относится подпись: <label for="email">Email</label> <input id="email">. Он должен точно совпадать с id, а не с name.
Класть input внутрь label или использовать for?
Оба способа работают в современных браузерах и программах чтения с экрана. Обертывание не требует id; for и id позволяют подписи и полю стоять в разных местах разметки, например в разных ячейках таблицы. Многие команды оборачивают поле и дополнительно указывают for.
Может ли placeholder заменить label?
Нет. Placeholder исчезает, как только читатель начинает печатать, часто малоконтрастен и не всегда объявляется как имя поля. Используйте видимый <label>, а placeholder оставьте для примера значения, если он вообще нужен.
Как скрыть label, но оставить его для программ чтения с экрана?
Оставьте <label> и скройте его визуально классом, который сжимает его до 1 пикселя и обрезает, а не через display: none, который скрывает его и от программ чтения с экрана. Для поля, где совсем нет места под подпись, альтернативой служит aria-label у самого поля.