Доступный CSS -только вкладка - PullRequest
1 голос
/ 14 апреля 2020

Я работаю над сайтом, который должен (а) работать без JavaScript и (б) быть доступным с клавиатуры.

Я использовал трюк с меткой цели для создания представления вкладки (https://css-tricks.com/functional-css-tabs-revisited/), но я заметил, что это зависит от нажатия на ярлык. Я не могу понять, как заставить его работать с клавиатурой. Возможно ли это?

.tabs {
  background-color: #eee;
  min-height: 400px;
}

.tabs__list {
  border-bottom: 1px solid black;
  display: flex;
  flex-direction: row;
  list-style: none;
  margin: 0;
  padding: 0;
  position: relative;
}

.tabs__tab {
  padding: 0.5rem;
}

.tabs__content {
  display: none;
  left: 0;
  padding: 0.5rem;
  position: absolute;
  top: 100%;
}

.tabs__input {
  display: none;
}

.tabs__input+label {
  cursor: pointer;
}

.tabs__input:focus,
.tabs__input:hover {
  color: red;
}

.tabs__input:checked+label {
  color: red;
}

.tabs__input:checked~.tabs__content {
  display: block;
}
<div class="tabs">
  <ul class="tabs__list">
    <li class="tabs__tab">
      <input class="tabs__input" type="radio" id="tab-0" name="tab-group" checked>
      <label for="tab-0" class="tabs__label" tabindex="0" role="button">Tab 0</label>
      <div class="tabs__content">
        Tab 0 content
      </div>
    </li>
    <li class="tabs__tab">
      <input class="tabs__input" type="radio" id="tab-1" name="tab-group">
      <label for="tab-1" class="tabs__label" tabindex="0" role="button">Tab 1</label>
      <div class="tabs__content">
        Tab 1 content
      </div>
    </li>
  </ul>
</div>

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Принятый ответ не является доступным решением.

Я внес некоторые исправления и некоторые замечания здесь. Не используйте принятый ответ в производстве, если вы наткнетесь на этот вопрос в будущем. Это ужасный опыт работы с клавиатурой.

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

Однако Я бы порекомендовал вам пересмотреть требование не JavaScript.

Я могу понять, что есть хороший запасной вариант (пример которого я привожу ниже с исправлениями) есть) но нет никакого способа сделать полностью доступный набор CSS только вкладок.

Во-первых, вы должны использовать WAI-ARIA, чтобы дополнить ваш HTML, чтобы сделать экранные программы еще более понятными. См. Примеры вкладок на W3 C, чтобы увидеть, какие роли WAI-ARIA вам следует использовать. Это НЕ возможно без JavaScript, так как необходимо изменить состояние (например, aria-hidden должно измениться).

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

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

Проблема 1 - tabindex на этикетке.

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

Чтобы это исправить, я просто удалил tabindex с меток.

Проблема 2 - нет индикаторов фокуса при навигации по клавиатуре.

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

Чтобы исправить это, я настроил CSS с помощью следующей

/*make it so when the checkbox is focused we add a focus indicator to the label.*/
.tabs__input:focus + label {
  outline: 2px solid #333;
}

Задача 3 - использование одного и того же состояния для состояний :hover и :focus.

Это еще одна плохая практика, которую нужно go убрать, всегда по-другому показывать состояния наведения и фокуса. Некоторые пользователи программы чтения с экрана и экранной лупы будут использовать свою мышь, чтобы проверить, правильно ли они сфокусированы, и ориентироваться на странице. Без отдельного состояния наведения трудно проверить, что вы находитесь над сфокусированным элементом.

/*use a different colour background on hover, you should not use the same styling for hover and focus states*/
.tabs__label:hover{
   background-color: #ccc;
}

Пример

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

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

.tabs {
  background-color: #eee;
  min-height: 400px;
}

.tabs__list {
  border-bottom: 1px solid black;
  display: flex;
  flex-direction: row;
  list-style: none;
  margin: 0;
  padding: 0;
  position: relative;
}

.tabs__tab {
  padding: 0.5rem;
}

.tabs__content {
  display: none;
  left: 0;
  padding: 0.5rem;
  position: absolute;
  top: 100%;
}

.tabs__input {
  position: fixed;
  top:-100px;
}

.tabs__input+label {
  cursor: pointer;
}


.tabs__label:hover{
   background-color: #ccc;
}

.tabs__input:focus + label {
  outline: 2px solid #333;
}

.tabs__input:checked+label {
  color: red;
}

.tabs__input:checked~.tabs__content {
  display: block;
}
<a href="#">A link so you can see where your focus indicator is</a>
<div class="tabs">
  <ul class="tabs__list">
    <li class="tabs__tab">
      <input class="tabs__input" type="radio" id="tab-0" name="tab-group" checked>
      <label for="tab-0" class="tabs__label" role="button">Tab 0</label>
      <div class="tabs__content">
        Tab 0 content
      </div>
    </li>
    <li class="tabs__tab">
      <input class="tabs__input" type="radio" id="tab-1" name="tab-group">
      <label for="tab-1" class="tabs__label" role="button">Tab 1</label>
      <div class="tabs__content">
        Tab 1 content
      </div>
    </li>
  </ul>
</div>
1 голос
/ 14 апреля 2020

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

Я бы использовал :focus, чтобы выделить выбранную вкладку, и свойство tabindex, чтобы оно работало так, как я хотел.

Пожалуйста, предоставьте дополнительную информацию, если у вас есть проблема с SPECIFI C проблема, связанная с ней, и приведите здесь базовый c пример кода, без связывания.

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

.tabs {
  background-color: #eee;
  min-height: 400px;
}

.tabs__list {
  border-bottom: 1px solid black;
  display: flex;
  flex-direction: row;
  list-style: none;
  margin: 0;
  padding: 0;
  position: relative;
}

.tabs__tab {
  padding: 0.5rem;
}

.tabs__content {
  display: none;
  left: 0;
  padding: 0.5rem;
  position: absolute;
  top: 100%;
}

.tabs__input {
  position: fixed;
  top:-100px;
}

.tabs__input+label {
  cursor: pointer;
}

.tabs__input:focus
.tabs__input:hover {
  color: red;
}

.tabs__input:checked+label {
  color: red;
}

.tabs__input:checked~.tabs__content {
  display: block;
}
<div class="tabs">
  <ul class="tabs__list">
    <li class="tabs__tab">
      <input class="tabs__input" type="radio" id="tab-0" name="tab-group" checked>
      <label for="tab-0" class="tabs__label" tabindex="0" role="button">Tab 0</label>
      <div class="tabs__content">
        Tab 0 content
      </div>
    </li>
    <li class="tabs__tab">
      <input class="tabs__input" type="radio" id="tab-1" name="tab-group">
      <label for="tab-1" class="tabs__label" tabindex="0" role="button">Tab 1</label>
      <div class="tabs__content">
        Tab 1 content
      </div>
    </li>
  </ul>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...