Как я могу получить NVDA и аналогичные файлы для считывания aria-label И содержимого <foreignobject>? - PullRequest
2 голосов
/ 17 января 2020

это мой первый пост на StackOverflow, поэтому извиняюсь за любые ошибки. У меня есть дерево графики SVG c, которое я хотел бы сделать доступным для пользователей NVDA и аналогичных. Каждый узел в графике SVG c кодируется так:

<g class="node" >
<foreignObject tabindex="0" focusable="true" aria-label="I want this read by screen readers such as NVDA..." class="nodestyle">...and I'd like this read out as well.</foreignObject>
</g>

В тот момент, когда я вкладываю вкладку в каждый узел, Chrome просто считывает текст в чужом объекте, а Edge Chromium читает только из текста метки арии в g. Я пытался использовать заголовок, метку и т. Д. c как в g, так и в ForeignBject, но я не могу заставить ни один браузер считывать оба фрагмента текста. Кто-нибудь может подсказать, как мне этого добиться, если это вообще возможно? Я не хочу заниматься хакерскими делами, такими как вставка дополнительного текста, а затем скрытие его с помощью CSS. Спасибо

Ответы [ 2 ]

1 голос
/ 21 января 2020

К сожалению, с примером, который у вас есть, это будет очень трудно реализовать (не часть надписи, а общедоступность в целом из-за структуры документа).

Первое, что вам нужно сделать, это исправить DOM порядок SVG - первый узел, на котором вы приземлились, - «нет», что сбивает с толку, и исправить порядок DOM намного проще, чем пытаться управлять tabindex.

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

Для этого я бы следовал соглашениям складного контента - этот пример аккордеона должен помочь вам понять, как использовать aria-expanded и aria-controls правильно. (но используйте его только для понимания этих концепций, это не правильное решение для вашей проблемы.)

Далее вам нужно подумать о том, чтобы дать пользователю знать, какие варианты были ему предоставлены. Самый простой способ сделать это - обернуть SVGs в <ul>, так как программа чтения с экрана сообщит им, сколько элементов можно выбрать (в расширенном разделе).

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

Также посмотрите на этот пример представления дерева файлового обозревателя , который похож на то, что при правильном вложении вам не нужно слишком беспокоиться о маркировке. (поскольку вы можете просто использовать свойство <title> вашего SVGs в качестве содержимого, если вы обнаружите, что простой текст не читается правильно).

Что вы заметите в приведенных выше примерах, так это то, что текст «родительского узла» фактически содержится в <li role="treeitem">, поэтому при выборе подэлемента он одновременно считывает и родительский элемент, и выбранный элемент. автоматически.

Попытка выполнить все вышеперечисленное с использованием только SVG приведет к многочисленным головным болям с обходными путями (т. е. вы можете использовать aria-labelledby с несколькими идентификаторами для дочерних элементов, чтобы добиться того, что вы первоначально задавался, но тогда у вас много проблем с удобством обслуживания), поэтому я бы порекомендовал попытаться скопировать структуру treeview и сохранить ваши SVG простыми.

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

Пример

Немного трудно читать, но, надеюсь, должен дать вам представление о том, как должна выглядеть ваша конечная структура. Я удалил много атрибутов позиционирования et c. чтобы было легче читать.

<h3 id="tree_lbl">
  Decision Tree
</h3>
<ul role="tree" aria-labelledby="tree_lbl">
  <li role="treeitem" aria-expanded="false">
      <g class="node">
        <foreignObject tabindex="0" focusable="true" class="nodestyle">Is this a decision tree?</foreignObject>
      </g>
    <ul role="group">
      <li role="treeitem" aria-expanded="false">
        <g class="node">
          <foreignObject tabindex="0" focusable="true" class="nodestyle">Yes</foreignObject>
        </g>
        <ul role="group">
          <li role="treeitem">
            <g class="node"><foreignObject tabindex="0" focusable="true" class="nodestyle">A</foreignObject></g>
          </li>
          <li role="treeitem">
            <g class="node">
              <foreignObject tabindex="0" focusable="true" class="nodestyle">B</foreignObject>
            </g>
          </li>
        </ul>
      </li>
      <li role="treeitem" aria-expanded="false">
        <span>
          <g class="node">
              <foreignObject tabindex="0" focusable="true" class="nodestyle">No</foreignObject></g>
        </span>
        <ul role="group">
          <li role="treeitem" class="doc">
            <g class="node">
              <foreignObject tabindex="0" focusable="true" class="nodestyle">A1</foreignObject>
            </g>
          </li>
          <li role="treeitem" class="doc">
            <g class="node">
              <foreignObject tabindex="0" focusable="true" class="nodestyle">B1</foreignObject>
            </g>
          </li>
        </ul>
      </li>
    </ul>
  </li>
  </ul>
1 голос
/ 21 января 2020

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

Это очень не решенная проблема, поэтому Мне любопытно о любой работе, сделанной в этом месте, и я надеюсь, что вы готовы к дальнейшей переписке Проверьте эта статья . Я думаю, что это часть любого правильного решения. Этот тоже стоит посмотреть.

Я пробовал много вещей, также остановился на SVG с посторонними объектами и вкладками для навигации. Даже реализовано несколько разных механизмов выбора веток.

Хитрость в выборе веток. Существует атрибут с именем aria-flowto , который принимает один или несколько идентификаторов 'destination' в качестве значения, но он имеет очень слабую поддержку, и нет рекомендуемых идиом для выбора среди них. (Однако его можно заставить работать с javascript).

Одна из моих попыток использует javaScript для копирования содержимого полей в метку арии, прикрепленную к элементу с tabindex=0 в теме. Это работает довольно хорошо, но не дает никакой возможности «просматриваемого» контента. Опять же, объявление ветвей - это сложная задача.

Если вы хотите, чтобы разметка внутри foreignObject была доступной для просмотра с использованием семанти c возможностей, таких как заголовки, вам, вероятно, придется использовать role=document, что во многих сообществах a11y участники, без сомнения, будут предупреждать вас, потому что это сложно. Мне удалось role=document нормально работать в HTML, но я еще не интегрировал его с SVG. Я пока не знаю, будет ли он хорошо работать с графическим модулем WAI-ARIA ролей.

...