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

#accessibility #screen-readers #nvda #wcag2.0

#Специальные возможности #программы чтения с экрана #nvda #wcag2.0

Вопрос:

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

Таблица с проблемами

Как вы можете видеть, когда я просматриваю каждый заголовок, такой как CSLO, дата начала и т. Д., Он считывает заголовок сверху. Поэтому каждый раз, когда я фокусируюсь с помощью кнопок табуляции или стрелок на любом имени заголовка, он также считывает две кнопки сверху.

Я пытался разделить кнопки, используя разные роли, извлекая классы и т. Д., Но я действительно не определил, почему он всегда запускает кнопки, даже если они не сфокусированы.

Код для этого выглядит следующим образом:

 <table
  class="table table-bordered table-hover component-editable slolisting dataTable ui-sortable"
  data-editable-id="slo-list-237"
  id="DataTables_Table_0"
  style="display: table"
>
  <thead>
    <tr class="header_action" role="row">
      <th rowspan="1" colspan="1">
        <div class="btn-group checkall-actions">
          <label
            class="btn btn-default component-editable-checkall"
            onclick="component.editable.select_all_rows(event, this);"
          >
            amp;nbsp;<input type="checkbox" />amp;nbsp;
          </label>
        </div>
      </th>
      <th colspan="7" rowspan="1">
        <div
          class="btn-group unfocus-actions"
          style="display: inline-block"
        >
          <button
            class="btn btn-primary"
            onclick="creating_init(event, this);"
          >
            Add CSLO
          </button>

          <button
            class="btn btn-default"
            onclick="showModalSyncCSLO('MATH100 - Mathematics for General Education','237');"
          >
            CSLO Synchronization
          </button>
        </div>
      </th>
    </tr>

    <tr class="header_title" role="row">
      <th
        rowspan="2"
        style="width: 60px"
        class="sorting_disabled component-editable-multi-selector-row"
        role="columnheader"
        colspan="1"
      ></th>
      <th
        rowspan="2"
        style="width: 40em"
        class="sorting_disabled"
        role="columnheader"
        colspan="1"
      >
        CSLO
      </th>
      <th
        rowspan="2"
        class="sorting_disabled"
        role="columnheader"
        colspan="1"
      >
        Start Date
      </th>
      <th
        rowspan="2"
        class="sorting_disabled"
        role="columnheader"
        colspan="1"
      >
        End Date
      </th>
      <th colspan="2" class="slo" rowspan="1">
        SLO Performance
      </th>
    </tr>
    <tr class="header_title" role="row">
      <th
        class="slo sorting_disabled"
        role="columnheader"
        rowspan="1"
        colspan="1"
      >
        Expected
      </th>
      <th
        class="slo sorting_disabled"
        role="columnheader"
        rowspan="1"
        colspan="1"
      >
        Fall 2020
      </th>
    </tr>
  </thead>
 

Забавно, что это происходит только в некоторых программах чтения с экрана, таких как NVDA в Chrome.

Ответ №1:

При навигации по таблице программа чтения с экрана автоматически считывает заголовок столбца и (если применимо) строки.

Поскольку вы разместили две кнопки, охватывающие эти строки, они будут считываться каждый раз. Это также связано с тем, что все они заданы как <th> элементы.

Вы можете переместить эти кнопки за пределы таблицы и переместить флажок для выбора столбцов вниз на одну строку (в ту же строку, что и CSLO, дата начала и т. Д.).

Это устранит проблему.

Или вы могли бы использовать <col> и <colgroup>

Вы также можете изучить определение ваших столбцов с помощью элементов <col> и <colgroup> . Это помогает программе чтения с экрана правильно связывать многострочные заголовки.

В W3C есть отличная статья о том, как их использовать, с множеством примеров, а вот отличная статья о MDN об <col> и <colspan> .

Вы все равно можете получить объявленные кнопки (вместо этого вы могли бы поместить их в a <td> , хотя технически это не очень хорошая практика, это должно остановить проблему с объявлением и не повлиять на удобство использования …. вам нужно будет протестировать в программе чтения с экрана, хотя, чтобы быть уверенным, я никогда не пробовал этого!)

Пара других второстепенных моментов

В вашей текущей таблице нет необходимости в role="row" и role="columnheader" , <tr> и <th> у вас уже есть эти роли по умолчанию, при условии, что вы поддерживаете IE8 .

Вы можете удалить rowspan="1" и colspan="1" — ячейки по умолчанию имеют размер 1 строка на 1 столбец, поэтому это ненужная информация (ничего общего с доступностью, это просто облегчит чтение вашей разметки). Вам нужно только добавить rowspan и colspan , когда вы переопределяете диапазон.

Комментарии:

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