aria-label

aria-label – атрибут WAI-ARIA, задающий элементу доступное имя (accessible name) для скринридеров. Обязателен для кнопок-иконок без текста; перекрывает видимый текст и не работает на div и span без роли.

4 минуты чтения

Атрибут aria-label входит в спецификацию WAI-ARIA – набор атрибутов ARIA, которыми HTML-разметке добавляют семантику для вспомогательных технологий. Его единственная задача – задать элементу доступное имя (accessible name): строку, которую скринридер произнесёт вместо отсутствующего или невнятного текста. Зрячий пользователь видит иконку-крестик и понимает, что кнопка закрывает окно; программа чтения экрана без aria-label объявит только «кнопка», без имени. Это базовый инструмент доступности (a11y) и одновременно самый злоупотребляемый ARIA-атрибут: на аудитах проблемы чаще создаёт не его отсутствие, а избыточное или неправильное применение.

Как это работает

Браузер вычисляет доступное имя каждого элемента по алгоритму accessible name computation и передаёт его вспомогательным технологиям через дерево доступности. Источники имени имеют строгий приоритет: сначала aria-labelledby, затем aria-label, затем нативные механизмы – видимый текст элемента, label у поля формы, alt у изображения, title. Отсюда два следствия. Первое: aria-label перекрывает видимый текст кнопки, alt картинки и подпись инпута – скринридер услышит только его. Второе: если на элементе заданы оба ARIA-атрибута, победит aria-labelledby. Базовый пример – кнопка-иконка без текста:

<button type="button" aria-label="Закрыть">
  <svg aria-hidden="true" focusable="false">…</svg>
</button>

Второй нюанс – aria-label работает не везде. Спецификация запрещает именование для ролей generic (обычные div и span без role), paragraph, code, emphasis, strong, time и других статических ролей. По тестам скринридеров JAWS и NVDA игнорируют aria-label на статике без роли, VoiceOver и TalkBack озвучивают лишь частично – поведение непредсказуемо, полагаться на него нельзя. Практическое правило: атрибут надёжен только на интерактивных элементах, виджетах, лендмарках, изображениях и iframe.

Когда подходящий текст уже есть в разметке, вместо невидимой строки на него ссылаются через aria-labelledby:

<h2 id="billing">Платёжные данные</h2>
<form aria-labelledby="billing">…</form>

Такое имя обновится вместе с заголовком и корректно переведётся автопереводчиком – закрыты сразу два слабых места aria-label, о которых ниже.

aria-label, aria-labelledby, alt и title – в чём разница

Четыре способа задать доступное имя
АтрибутКак задаёт имяКогда использовать
aria-labelНевидимая строка прямо в атрибуте; перекрывает видимый текст, alt и titleВидимого текста нет: кнопки-иконки, поле поиска, лендмарки
aria-labelledbyСсылка по id на видимый текст; имя обновляется вместе с ним; приоритет выше aria-labelПодходящий текст уже есть в разметке: заголовок секции, подпись
altНативное доступное имя изображенияВсегда для содержательных img – ARIA не нужен
titleТултип; низший приоритет, недоступен с клавиатуры и на тачскринахКак источник имени не полагаться

Зачем это нужно

Легитимных сценариев немного: кнопки и ссылки, где вместо текста иконка (бургер, крестик, лупа, корзина); различение одинаковых лендмарков, когда на странице два nav – основное меню и хлебные крошки; iframe со сторонним виджетом. Во всех остальных случаях сначала пробуют нативную разметку: в иерархии способов именования aria-label стоит последним. Три антипаттерна, которые встречаются чаще всего:

  • aria-label на div и span – роль generic запрещает именование, скринридеры атрибут игнорируют или ведут себя по-разному. Типичный случай из вёрстки магазинов: <span aria-label="Скидка">-20%</span> – не работает.
  • Перекрытие видимого текста – нарушение критерия WCAG 2.5.3 Label in Name. Если у кнопки с текстом «Отправить» стоит aria-label="submit-form", пользователь голосового управления скомандует «нажать Отправить» – и команда не сработает, потому что доступное имя другое. Правило: доступное имя обязано содержать видимый текст, лучше в начале строки.
  • Ставка на автоперевод – сервис Google Translate не переводит aria-label вовсе, а встроенные переводчики Chrome, Edge и Firefox переводят нестабильно: пропускают скрытые (display:none) и динамически подставленные значения. Тесты Адриана Розелли, обновлённые в июле 2025, подтверждают: полагаться на автоперевод aria-label нельзя. Для мультиязычных сайтов – видимый текст или aria-labelledby.

Для инструкций и подсказок aria-label тоже не подходит: пояснение вроде «пароль не короче 12 символов» должно быть видимым текстом, связанным через aria-describedby, – инструкции нужны всем пользователям, а не только скринридерам. Есть и смежный эффект: корректные доступные имена делают разметку понятнее не только вспомогательным технологиям, но и парсерам поисковиков и LLM, которые восстанавливают структуру страницы для ответов, – это часть базовой гигиены GEO.

Пример

Типовая задача на Битрикс-проектах – шапка интернет-магазина: три кнопки-иконки (поиск, избранное, корзина) и бургер мобильного меню. Без ARIA скринридер объявит четыре безымянные кнопки подряд. Исправленная разметка:

<button type="button" aria-label="Поиск по сайту">
  <svg aria-hidden="true">…</svg>
</button>
<button type="button" aria-label="Избранное">
  <svg aria-hidden="true">…</svg>
</button>
<a href="/cart/" aria-label="Корзина, 3 товара">
  <svg aria-hidden="true">…</svg>
</a>
<button type="button" aria-label="Открыть меню" aria-expanded="false">
  <svg aria-hidden="true">…</svg>
</button>

Иконки закрыты aria-hidden="true", чтобы SVG не озвучивался отдельно, а состояние бургера дополнительно сообщает атрибут aria-expanded. Активный пункт меню, к которому ведёт бургер, помечают атрибутом aria-current. А вот кнопке «Оформить заказ» с нормальным текстом aria-label не нужен вовсе: текст уже является доступным именем, и лишний атрибут только создаст риск расхождения между тем, что видит зрячий пользователь, и тем, что слышит пользователь скринридера.

Частые вопросы

Что делает aria-label и когда он нужен?

Атрибут задаёт элементу доступное имя – строку, которую скринридер озвучит вместо видимого текста. Нужен, когда текста нет: кнопки-иконки (крестик, бургер, лупа), поле поиска без label, различение одинаковых лендмарков вроде двух nav на странице. Если у элемента есть понятный видимый текст, aria-label не нужен.

Чем aria-label отличается от aria-labelledby и что победит, если указать оба?

aria-label содержит строку-имя прямо в атрибуте, а aria-labelledby ссылается по id на видимый текст в разметке и может собирать имя из нескольких элементов. При одновременном указании побеждает aria-labelledby – он стоит выше в алгоритме вычисления доступного имени. Когда подходящий видимый текст уже есть, предпочтителен aria-labelledby: имя обновляется вместе с текстом и нормально переводится.

Почему aria-label не работает на div и span?

У div и span без атрибута role роль generic, а для неё спецификация ARIA запрещает именование. JAWS и NVDA такой aria-label игнорируют, VoiceOver и TalkBack озвучивают частично – поведение непредсказуемо. Надёжно атрибут работает только на интерактивных элементах, виджетах, лендмарках, изображениях и iframe.

Перекрывает ли aria-label видимый текст кнопки?

Да, полностью: скринридер озвучит только значение aria-label, а не текст. Это риск нарушения WCAG 2.5.3 Label in Name – пользователь голосового управления командует по видимому тексту («нажать Отправить»), и если доступное имя другое, команда не сработает. Поэтому доступное имя обязано включать видимый текст, желательно в начале строки.

Переводится ли aria-label автопереводчиками?

Ненадёжно. Сервис Google Translate не переводит aria-label вовсе; встроенные переводчики Chrome, Edge и Firefox переводят видимые значения, но пропускают скрытые и динамически подставленные – это подтверждают тесты Адриана Розелли, обновлённые в июле 2025. Для мультиязычных сайтов надёжнее видимый текст или aria-labelledby.

Чем aria-label отличается от alt и title?

alt – нативное доступное имя изображения, для img используют его, а не ARIA. title создаёт тултип и считается ненадёжным источником имени: у него низший приоритет, он недоступен с клавиатуры и на тачскринах. aria-label при этом перекрывает и alt, и title, если задан на том же элементе.

Нужен ли aria-label ссылке или кнопке с нормальным текстом?

Нет – видимый текст уже является доступным именем. Лишний aria-label в лучшем случае бесполезен, в худшем перекроет текст другим значением и нарушит WCAG 2.5.3. Если нужно добавить контекст, доступное имя всё равно должно начинаться с видимого текста.

Материалы по теме

Валентина Меланина

Нужна консультация?

Разберу ваш сайт и покажу точки роста

Если хотите понять, как этот термин применить к вашему проекту — начнём с аудита.