TGViewer
<divelopers> <divelopers> @alexnozer_dev · 1.18K subscribers
Post #309 790
Расширение <label>

Элемент <label> предназначен для добавления подписи к элементам управления. Есть два способа: вложить элемент управления внутрь <label> или связать <label> и элемент управления через атрибуты for и id.

Также есть 5 правил ARIA, первое из которых гласит: «используйте встроенные в HTML элементы и атрибуты для передачи нужной семантики вместо использования ARIA». <label> — как раз пример такого встроенного элемента.

<!-- вместо этого: -->
<span id="name-label">Имя</span>
<input
type="text"
name="name"
autocomplete="given-name"
autocapitalize="words"
aria-labelledby="name-label"
>

<!-- лучше сделать так: -->
<label for="name">Имя</label>
<input
type="text"
name="name"
autocomplete="given-name"
autocapitalize="words"
id="name"
>


Всё бы хорошо, но <label> работает только со стандартными элементами управления: <input>, <select>, <textarea>, <button>, <meter>, <progress>, <output> и пользовательскими элементами, которые ассоциированы с формой.

Это значит, что если по тем или иным причинам пришлось создать собственный элемент управления на основе ARIA, то использовать <label> для привязки подписи к нему не получится. Подпись придётся также добавлять с помощью ARIA.

<!-- это не сработает: 
<label for="listbox">Пол</label>
-->
<!-- поэтому делают так: -->
<span id="listbox-label">Пол</span>
<div
role="listbox"
tabindex="0"
id="listbox"
aria-labelledby="listbox-label"
>
<!-- опции -->
</div>


Также кажется логичным использование <label> для задания подписей не только к элементам управления, но и к контейнерам, у которых может быть указано имя. Сейчас для этого нужно использовать ARIA и следовать первому правилу не получается.

<!-- Примеры иллюстративные, 
не используйте их на реальных проектах! -->
<nav id="nav">
<!-- это не сработает -->
<label for="nav">Основная</label>
<!-- ссылки -->
</nav>

<section id="faq-section">
<h2>
<!-- это не сработает -->
<label for="faq-section">FAQ</label>
</h2>
<!-- список вопросов и ответов -->
</section>

<div role="group" id="socials">
<!-- это не сработает -->
<label for="socials">
Мы в социальных сетях
</label>
<!-- ссылки на социальные сети -->
</div>

<!-- это не сработает -->
<label for="formatting">
Форматирование текста
</label>
<div
role="toolbar"
id="formatting"
>
<!-- опции форматирования -->
</div>


Раз <label> уже существует в HTML и может задавать имя для элемента управления через атрибут for, кажется, было бы полезно расширить эту функциональность и на другие элементы, где это уместно на основе роли элемента.

Или нужен новый элемент, например <name> (<caption> и <title> уже заняты), а <label> пусть остаётся только для стандартных элементов управления? Аналогичные идеи в сообществе были по поводу элемента <description>.

Что вы думаете по этому поводу? Проголосуйте в опросе ниже.

#html #a11y
  • ❤ 1
  • 👾 1
More from @alexnozer_dev
  1. Sep 21, 2026Реализация пользовательских атрибутов Под конец прошлого года я рассказывал об API пользов…
  2. Sep 14, 2026Подклассы Event вместо CustomEvent Многие библиотеки предоставляют систему событий в качес…
  3. Sep 11, 2026Эволюция стилей в темах Shopify Адам Ватан на днях поделился новостью, что Shopify выкупил…
  4. Sep 9, 2026Persistent Widgets Многие сайты не должны быть SPA. Но иногда эта архитектура продиктована…
  5. Sep 7, 2026Processing Instructions и маркеры В DOM всё представлено в виде узлов (Node) разных типов.…
  6. Sep 1, 2026@scope и потоковая передача HTML Ноам Розенталь поделился интересной техникой, в которой с…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →