Большинство ролей, которые вы видите, были определены как часть ARIA 1.0, а затем включены в HTML5. Некоторые из новых элементов HTML5 (dialog, main и т. Д.) Даже основаны на исходных ролях ARIA.
http://www.w3.org/TR/wai-aria/
Есть две основные причины использовать роли в дополнение к вашему семантическому элементу.
Причина № 1. Переопределение роли, в которой нет подходящего элемента основного языка или, по разным причинам, использовался менее семантически подходящий элемент.
В этом примере была использована ссылка, даже несмотря на то, что результирующая функциональность больше похожа на кнопку, чем навигационная ссылка.
<a href="#" role="button" aria-label="Delete item 1">Delete</a>
Программы чтения с экрана будут воспринимать это как кнопку (в отличие от ссылки), и вы можете использовать селектор атрибутов CSS, чтобы избежать class-itis и div-itis.
*[role="button"] {
/* style these a buttons w/o relying on a .button class */
}
Причина № 2. Резервное копирование роли нативного элемента для поддержки браузеров, которые реализовали роль ARIA, но еще не реализовали роль нативного элемента.
Например, «главная» роль поддерживается браузерами уже много лет, но это относительно недавнее дополнение к HTML5, поэтому многие браузеры пока не поддерживают семантику для <main>
.
<main role="main">…</main>
Это технически избыточно, но помогает некоторым пользователям и никому не вредит. Через несколько лет эта техника, вероятно, станет ненужной.
Вы также написали:
Я вижу, что некоторые люди создают свои собственные. Это разрешено или правильное использование атрибута роли?
Это допустимое использование атрибута, если реальная роль не включена. Браузеры будут применять первую распознанную роль в списке токенов.
<span role="foo link note bar">...</a>
Из списка, только link
и note
являются действительными ролями, и поэтому роль связи будет применяться , поскольку речь идет о первом. Если вы используете пользовательские роли, убедитесь, что они не конфликтуют с какой-либо определенной ролью в ARIA или используемом языке хоста (HTML, SVG, MathML и т. Д.).