Динамическая настройка tabindex в навигационном ящике

Я пытаюсь игнорировать фокус, когда ящик закрыт, но я все равно могу переходить по ссылкам, даже когда он закрыт (когда для showDrawer ref установлено значение false). Я даже могу использовать табуляцию, если установлю tabindex = "-1" на <nav>. Единственное решение, которое я нашел, — это добавить :tabindex = "showDrawer ? 0 : -1" непосредственно к каждому из <router-link> или <button>, даже не к <li>, а к самому элементу внутри него, иначе это не будет работать. Я чувствую, что это не лучший способ сделать это. Мне нужно как-то сделать это с помощью tabindex, потому что удаление ящика из DOM, когда он закрыт, повысит производительность.

<template>
    <nav class = "drawer" :tabindex = "showDrawer ? 0 : -1">
        <ul class = "drawer__list">
            <li class = "drawer__item">
                <router-link
                    to = "/"
                    >Home</router-link>
            </li>
            <li class = "drawer__item">
                <button
                    About
                </button>
            </li>
            <li class = "drawer__item">
                <button
                    Log In
                </button>
            </li>
        </ul>
    </nav>
    <ItemOverlay :class = "{ active: showDrawer }" />
</template>

Ищем возможное решение.

используйте v-show вместо v-if. при этом будет использоваться display: none, чтобы скрыть навигацию вместо полного удаления ее из DOM. Это по-прежнему должно предотвращать фокусировку при вкладке.

yoduh 15.04.2024 01:35

@yoduh, но тогда переход не сработает. Я хочу сохранить анимацию скрытия/открытия ящика.

Michael 15.04.2024 02:00

Вы также можете использовать @keyframes для переключения на display: none в конце перехода CSS.

Andy 15.04.2024 14:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Замечательно, что вы начинаете рассматривать взаимодействие с клавиатурой для обеспечения доступности! Я надеюсь, что смогу прояснить два недоразумения, которые у вас сейчас возникают.

  1. tabindex не наследуется в DOM, применяется только к самому элементу
  2. Порядок фокусировки — не единственное, о чем следует беспокоиться при сокрытии ящика (навигации), общий доступ с помощью вспомогательных технологий также должен быть запрещен.

Это можно сделать с помощью атрибута inert:

<nav class = "drawer" :inert = "!showDrawer">

То есть, если вы не можете использовать CSS, который надежно скрывает элемент от взаимодействия, и вспомогательные технологии, такие как display: none или visibility: hidden.

<p><a href = "#">First tab stop</a></p>

<nav inert>
  <ul>
    <li><a href = "#" current = "page">Active Page</a></li>
    <li><a href = "#">Another Page</a></li>
  </ul>
</nav>

<p><a href = "#">Last tab stop</a></p>

Альтернативой было бы скрыть навигацию от вспомогательных технологий.

<nav class = "drawer" :aria-hidden = "!showDrawer">

и избегайте фокусировки на каждом интерактивном элементе

<router-link :tabindex = "showDrawer ? 0 : -1"…

inert делает и то, и другое.

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

Andy 15.04.2024 10:32

inert сработало, спасибо! Так просто. Я также обнаружил, что этот атрибут не будет работать, если я установлю его на <ItemDrawer/>, который является компонентом, находящимся внутри <AppHeader> (в моем случае Drawer является частью заголовка). Итак, мне придется сначала перейти к <ItemDrawer/>, а затем добавить inert к <nav> там.

Michael 15.04.2024 12:29

только что проверил еще раз. inert работало только за счет запрета пользователю нажимать/фокусироваться, но я все равно могу получить доступ как к <router-link>, так и к <button> в <nav><ul><li>button or router-link<li/><ul/><nav/> с помощью голосового помощника. Я использую Edge и в нем есть встроенный голосовой помощник.

Michael 15.04.2024 13:04

Это будет работать так, как ожидалось, только если я добавлю inert и aria-hidden к <nav>.

Michael 15.04.2024 13:33

Это странно, inert должен поддерживаться в Edge начиная с версии 102. Согласно a11ysupport, он работает в Edge. Но я не знаком со встроенным голосовым помощником.

Andy 15.04.2024 13:53

поэтому в Edge, если я щелкну правой кнопкой мыши по заголовку и выберу опцию «Читать вслух», он начнется с логотипа, а затем прочитает ссылки в скрытом ящике, пока я не добавлю :aria-hidden = "!showDrawer". Но если я использую любую другую программу чтения с экрана и просто вкладку, потому что я установил inert, все работает нормально. Я думаю, что самый безопасный вариант — использовать оба inert и aria-hidden для поддержки всех браузеров. В любом случае это более короткий путь, вместо добавления tabindex к каждой ссылке, что приводит к слишком большому количеству дубликатов.

Michael 15.04.2024 14:48

Другие вопросы по теме