Заставить программу чтения с экрана игнорировать раздел, но прочитать его содержимое - PullRequest
1 голос
/ 19 апреля 2019

У меня есть некоторый код, который выглядит примерно так (например, сокращено):

html {
  background: #eee;
}

section {
  border-radius: 4px;
  border: 1px solid #ccc;
  background: #fff;
  margin: 1em;
  padding: 1em;
}

[tabindex]:focus {
  outline: 1px dashed blue;
}
<section tabindex="0">
  <h1>
    Section 1
  </h1>
  <p>
    This section will be highlighted but it won't go inside as 
    nothing inside has tabindex. I don't want it to be read at all.
  </p>
</section>

<section tabindex="0">
  <h1>
    Section 2
  </h1>
  <p>
    This section will be highlighted and there is an element inside with 
    tabindex. I don't want the section to be read, but I want to read
    the focusable elements when they are focused.
  </p>
  <p tabindex="0">
    For example: this paragraph has tabindex. It should be read when focused.
  </p>
</section>

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

Внутри каждого из этих разделов может быть что угодно: текст, HTML-код, фокусируемое содержимое (либо потому, что оно имеет tabindex, либопотому что он имеет интерактивные элементы).Это веб-компонент, и я не могу контролировать, что происходит внутри.

У нас есть пользователи программ чтения с экрана и пользователи с плохим зрением, они оба используют клавиатуру для навигации, а для последних мы хотим помочьопределить, в каком разделе они находятся (на странице с несколькими разделами / карточками), не оказывая негативного влияния на пользователей программы чтения с экрана.

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

Например: при использовании программы чтения с экрана, такой как ChromeVox или VoiceOver, при нажатии на вкладку будет выделен первый раздел ибудет звучать примерно так:

[Раздел] Раздел 1. Этот раздел будет выделен, но он не войдет внутрь, поскольку внутри ничего нет tabindex.Я не хочу, чтобы он читался вообще.

При повторном нажатии на вкладку будет выделен второй раздел, и он будет звучать примерно так:

[Раздел] Раздел 2. Этот раздел будет выделен, и внутри него будет элемент tabindex.Я не хочу, чтобы раздел читался, но я хочу прочитать фокусируемые элементы, когда они сфокусированы.Например: этот абзац имеет tabindex.Его следует читать, когда он сфокусирован.

При нажатии на вкладку в третий раз активируется последний абзац внутри раздела (он имеет tabindex), и программа чтения с экранаскажем:

Например: этот абзац имеет tabindex.Его следует читать, когда он сфокусирован.

Этот сценарий не идеален, потому что мы повторяем контент (помните, что приведенный выше код является примером, в действительности это больше, чем просто).Когда раздел получает фокус, он полностью читается;и когда содержимое внутри получает фокус, оно снова читается.Последнее предложение было прочитано дважды: когда раздел активен и когда он сам активен.

Я хотел бы получить следующее поведение:

  1. Нажмите tab и первый раздел выделен.Ничего не читается.
  2. Нажмите tab , и второй раздел будет выделен.Ничего не читается.
  3. Нажмите tab , и последний абзац будет выделен И он будет прочитан.

Я пытался разобраться в этом поведении с помощью различныхподходы:

  • Использование role="presentation": поэтому семантика роли не будет сопоставлена ​​с API доступа и не будет прочитана ... проблема в том, что role="presentation" не применяется к фокусируемым элементам (например, элементы с tabindex).
  • Использование role="none": это синоним role="presentation", поэтому он не работаеттаким же образом.
  • Использование aria-label="": игнорирует пустое aria-label и все еще читает все содержимое раздела.
  • Использование aria-hidden="true": таким образом раздел игнорируется, а его содержимое не читается ... но его фокусируемое содержимое также игнорируется и не читается при получении фокуса - вот что я хочу:

html {
  background: #eee;
}

section {
  border-radius: 4px;
  border: 1px solid #ccc;
  background: #fff;
  margin: 1em;
  padding: 1em;
}

[tabindex]:focus {
  outline: 1px dashed blue;
}
<section tabindex="0" aria-hidden="true">
  <h1>
    Section 1
  </h1>
  <p>
    This section will be highlighted but it won't go inside as 
    nothing inside has tabindex. I don't want it to be read at all.
  </p>
</section>

<section tabindex="0" aria-hidden="true">
  <h1>
    Section 2
  </h1>
  <p>
    This section will be highlighted and there is an element inside with 
    tabindex. I don't want the section to be read, but I want to read
    the focusable elements when they are focused.
  </p>
  <p tabindex="0">
    For example: this paragraph has tabindex. It should be read when focused.
  </p>
</section>

Я попытался обернуть все содержимое раздела в div с aria-hidden="false", но кажется, что родительский aria-hidden="true" заменяет его.

Есть ли способ достичь того, чего я хочу?

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Пользователям программы чтения с экрана не требуется tabindex для навигации по тексту с помощью клавиатуры.

Только интерактивные элементы (кнопки, ссылки, элементы формы, ...) могут иметь tabindex. И вам не нужно добавлять tabindex, если вы используете собственный интерактивный элемент (a[href] button, input, ...), только для пользовательских элементов управления (<div role="button" tabindex="0">click here</div>).

Фокусируемые элементы не должны находиться внутри другого фокусируемого элемента.

Программы чтения с экрана имеют в основном два режима навигации : режим просмотра / чтения (обычно с помощью клавиш со стрелками) и режим фокусировки / формы (с помощью клавиши tab). Пользователь программы чтения с экрана никогда не будет использовать клавишу tab с намерением прочитать неинтерактивный текст.

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

1 голос
/ 19 апреля 2019

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

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