Кратко
СкопированоARIA-роль ориентира, которая определяет область формы. Обычно формы состоят из нескольких полей и кнопки для отправки данных, которые ввёл пользователь.
Роль form
есть у тега <form>
по умолчанию.
Пример
Скопировано<div role="form" aria-label="Подписка на рассылку"> <label for="email">Электронная почта</label> <input type="text" id="email" name="email" autocomplete="email" spellcheck="false" > <button>Подписаться</button></div>
<div role="form" aria-label="Подписка на рассылку" > <label for="email">Электронная почта</label> <input type="text" id="email" name="email" autocomplete="email" spellcheck="false" > <button>Подписаться</button> </div>
Как пишется
СкопированоВ первую очередь используйте HTML-элемент <form>
вместо явной роли form
. У тега <form>
хорошая поддержка браузерами и скринридерами. Также <form>
по умолчанию поддерживает необходимые атрибуты и слушает событие on
: вам не нужно писать лишний JavaScript.
<form aria-label="Подписка на рассылку"> <label for="email">Электронная почта</label> <input type="text" id="email" name="email" autocomplete="email" spellcheck="false" > <button type="submit">Подписаться</button></form>
<form aria-label="Подписка на рассылку"> <label for="email">Электронная почта</label> <input type="text" id="email" name="email" autocomplete="email" spellcheck="false" > <button type="submit">Подписаться</button> </form>
Явная роль понадобится в редких случаях: при вёрстке сложных кастомных компонентов или для поддержки очень старыми браузерами.
Когда задаёте role
явно, лучше добавлять роль к семантически нейтральным <div>
и <span>
. Одно из правил использования ARIA — не перезаписывать роли без необходимости.
Не забудьте по-настоящему отправить данные из формы. Роль, в отличие от HTML-элемента, не умеет слушать браузерные события. Для этого, например, можете использовать метод fetch
:
const form = document.getElementById('custom-form')const input = document.getElementById('email')const button = document.getElementById('subscribe-btn')function submitForm(event) { event.preventDefault() const email = input.value.trim() if (email) { fetch('/subscribe', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email }) }) }}button.addEventListener('click', submitForm)
const form = document.getElementById('custom-form') const input = document.getElementById('email') const button = document.getElementById('subscribe-btn') function submitForm(event) { event.preventDefault() const email = input.value.trim() if (email) { fetch('/subscribe', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email }) }) } } button.addEventListener('click', submitForm)
Пользователи скринридеров смогут быстро переместиться к форме только в случае, если форма имеет доступное имя. Есть два способа задать имя форме: через атрибуты aria
и aria
.
Имя из aria
скрыто визуально, но доступно для пользователей вспомогательных технологий и поисковых роботов.
<form aria-label="Подписка на рассылку"> <!-- Содержимое формы --></div>
<form aria-label="Подписка на рассылку" > <!-- Содержимое формы --> </div>
С помощью aria
с формой связывают видимое имя, например, из заголовка.
<div role="form" aria-labelledby="subscription"> <h3 id="subscription"> Подписка на рассылку </h3> <!-- Остальное содержимое --></div>
<div role="form" aria-labelledby="subscription" > <h3 id="subscription"> Подписка на рассылку </h3> <!-- Остальное содержимое --> </div>
Хотя на странице может быть несколько форм, они не обязательно должны быть ориентирами. Старайтесь называть только формы для ввода важных данных, к которым пользователям скринридеров было бы полезно и необходимо быстро перемещаться.
Для элемента с ролью form
можно использовать и другие глобальные ARIA-атрибуты.
Как понять
СкопированоРоль form
создаёт ориентир на странице. Это значит, что пользователи скринридеров могут быстро переместиться к этой части страницы с помощью горячих клавиш или через меню со всеми ориентирами.
Подсказки
Скопировано💡 Для области с полем для поиска по сайту используйте <search>
или role
.
💡 Без aria
или aria
форма не станет ориентиром для пользователей скринридеров.