aria role = "application" и захват табуляции - PullRequest
0 голосов
/ 09 мая 2020

Треппинг - довольно хорошо зарекомендовавший себя шаблон ( пример ). Обычно ради доступности он позволяет пользователям клавиатуры перемещаться внутри раскрывающихся меню и модальных окон. Однако, что беспокоит, так это последствия для пользователей теперь, когда собственные функции события табуляции были перезаписаны новым поведением (зацикливанием). Это не проблема для зрячих пользователей, но это проблема c для пользователей вспомогательных технологий, таких как NVDA и J AWS, которые критически полагаются на эту встроенную функциональность вкладок.

WAI-ARIA имеет решение для информирования Assistive Technologies о том, когда функциональность встроенной клавиатуры была перезаписана в форме aria-role = "application" :

Взаимодействие с клавиатурой полностью находится под контролем веб-автора и может быть что угодно, связанное с конкретным реализуемым виджетом. Например, в приложении для создания слайдов можно создать виджет, который использует клавиши со стрелками для позиционирования элементов на слайде и использует звуковую обратную связь через живую область ARIA для передачи информации о положении и состоянии перекрытия с другими объектами. Управление фокусом осуществляется через aria-activedescendant.

Клавиши табуляции, пробела и ввода, а также Escape должны обрабатываться приложением. Единственное исключение - если фокус установлен на стандартный виджет внутри приложения, которое поддерживает навигацию с клавиатуры из браузера, например элемент ввода.

Это будет означать, что любой компонент, использующий вкладку -trapping должен обязательно иметь role="application", всегда .

Однако я не верю в эту обычную практику. Такие сайты, как Target.com , например (которые используют захват табуляции в раскрывающемся меню), классифицируют его как список, как показано здесь в дереве доступности веб-сайта: enter image description here

Я был бы признателен за любой опытный взгляд на это. Правильно ли я здесь интерпретирую ARIA? Следует ли компоненты, использующие захват табуляции всегда , украшать role="application"?

1 Ответ

2 голосов
/ 09 мая 2020

Короткий ответ

Вам не нужно добавлять role="application", если вы настроили меню как модальные диалоги. С другими шаблонами это может быть применимо (очень маловероятно, role="application" - очень специализированная роль), но в этот момент вы, вероятно, изначально реализовали неправильный шаблон.

Более длинный ответ

Шаблон l oop хорош, если он реализован правильно (и target.com проделал довольно хорошую работу)

В этом нет ничего плохого шаблон, если он реализован правильно (который target.com, кажется, на удивление неплохо справляется с этой задачей, всего несколько вещей, которые они могли бы сделать лучше).

Используя 'target' в качестве примера, вы заметите что, когда вы нажимаете, например, «категории», открытое меню фактически обрабатывается как модальный диалог.

Он имеет role="dialog", а «кнопка», которая его открывает, имеет aria-expanded.

Они также захватывают фокус табуляции в этом модальном окне и предоставляют кнопку «закрыть», которая появляется внизу списка, если вы используете клавишу табуляции.

Пока все хорошо, ничего плохого в цикле внутри модального окна диалог, поскольку это ожидаемое поведение.

Они также понимают некоторые другие вещи правильно, когда «диалог» открыт, вы не можете получить доступ к любому другому контенту. Например, в программе чтения с экрана вы можете нажимать клавиши 1–6, чтобы найти следующие уровни заголовков, вы не можете этого сделать, пока меню открыто, поскольку они применяют aria-hidden="true" ко всему вне модального меню (настоящая модальная ловушка).

Также вы можете закрыть модальное меню, и фокус будет возвращен элементу меню, который открыл его в первую очередь, поэтому они тоже правильно управляют фокусом.

Наконец, вы можете закрыть модальное меню с помощью клавиша Escape , что также является ожидаемым поведением.

Итак, если вы хотите следовать этому шаблону для своих меню, я бы сказал go для него, они доступны, как есть, и Пользователь программы чтения с экрана не будет бороться с ними.

Что мы можем сделать лучше, чем target.com

Target правильно поняла основы, им просто не хватает нескольких ключевых шагов.

«Кнопка», открывающая меню, должна иметь атрибут aria-controls, чтобы правильно связать все вместе.

Пункты меню в диалоговых окнах меню должны иметь <nav> элементов aro и <ul> (хотя возможно, поскольку эти модальные окна должны быть доступны только через кнопку меню, эта связь подразумевается, и это второстепенный момент).

Спрайты стрелок, которые они используют, имеют focusable="false", что хорошо, но они не добавляли role="presentation" или еще лучше aria-hidden="true", поэтому они будут объявлены, если ваше средство чтения с экрана настроено на подробный. (aria-hidden="true" предпочтительнее, так как поддержка лучше).

Сами меню не должны быть многоуровневыми. то есть, если вы нажмете «главное меню» вверху списка, тогда станет непонятно, где вы находитесь, я все еще в модальном диалоговом окне? Кроме того, это реализовано таким образом, что он не объявляет первый элемент в списке «главного меню», когда вы переходите по ссылке (возможно, проблема с синхронизацией?), Поэтому это дезориентирует. Это самая большая проблема с их реализацией .

Есть и другие вещи, но вы понимаете, что если ваше меню представляет собой всего лишь один список на «раскрывающийся» (модальный) способ это реализовано, вполне приемлемо, удобно и лучше, чем многие реализации меню, которые я видел.

Так что мне следует использовать role="application"

Нет.

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

О, вы хотите подробнее? Нет проблем!

Нет, вам не нужно использовать role="application" здесь, на самом деле вы создадите гораздо больше проблем с доступностью, сделав это.

role="application" подразумевает что все элементы управления являются настраиваемыми, и вам следует игнорировать стандартные элементы управления веб-сайта. (вы в основном говорите пользователю / программе чтения с экрана: «Относитесь к этому как к настольному приложению, где сочетания клавиш будут объяснены через меню et c. 'и' ожидают странного поведения, не связанного с веб-сайтами, не полагайтесь на свои обычные сочетания клавиш, поскольку они, вероятно, не будут работать ')

Так как это соответствует стандартному веб-шаблону (захват фокуса в модальном ) добавление role="application" на самом деле запутает людей.

Вы упомянули о цикле Tab , но внутри списка он работает так, как ожидалось (нажатие стрелки вниз в конце списка не приводит к l oop), поэтому цикл Tab происходит только в модальном окне.

Я думаю, что следующая цитата для страницы, на которую я указал role="application", суммирует важную информацию. Я выделил жирным шрифтом ключевые моменты, относящиеся к вашему вопросу, и добавил комментарии после них, если это необходимо.

Роль приложения указывает вспомогательным технологиям, что эта часть веб-контента содержит элементы которые не соответствуют любому другому известному элементу HTML или виджету WAI-ARIA . Любая особая интерпретация структур и виджетов HTML должна быть приостановлена, а управление должно быть полностью передано браузеру и веб-приложению для обработки взаимодействия с мышью, клавиатурой или сенсорным экраном.

В этом режиме веб-автор несет полную ответственность за обработку любого ввода с клавиатуры, управление фокусом и другие взаимодействия и не может предполагать, что вспомогательные технологии будут выполнять какую-либо обработку на своей стороне .

Так что, если вы добавите role="application", вы не получите нативного поведения любого элемента, это потребует много работы! (на практике большинство программ чтения с экрана по-прежнему поддерживают базовую c функциональность, но они делают это, потому что люди злоупотребляют role="application")

Если веб-приложение, охватываемое ролью приложения , содержит части, которые следует рассматривать как обычный веб-контент, следует использовать роль документа или статьи .

Таким образом, вам нужно будет добавить role="article" или role="document" в списки, кнопки закрытия et c. По сути, в любом случае все это будет иметь role="article" (поскольку это будет наиболее подходящая роль).

Если вы не создаете очень сложное программное обеспечение, role="application" не следует использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...