Фокус и tab-индексы

Driver.js — это библиотека для создания пошаговых интерактивных гидов по интерфейсу веб-приложений. Один из ключевых аспектов её работы — управление фокусом элементов и корректное взаимодействие с клавиатурной навигацией через tab-индексы. Эти механизмы обеспечивают как доступность для пользователей с клавиатурой, так и правильное визуальное выделение активного шага.


Управление фокусом элементов

Driver.js автоматически управляет фокусом на текущем активном элементе. Это достигается через методы .highlight() и .moveNext() / .movePrevious(), которые обеспечивают плавное выделение и фокусировку.

Основные моменты:

  • Фокусировка элемента: при переходе к следующему шагу библиотека устанавливает tabindex="-1" на элемент и вызывает метод .focus(). Это позволяет пользователю сразу взаимодействовать с выделенным элементом.

  • Возврат фокуса: после завершения тура Driver.js может вернуть фокус к первоначальному элементу страницы или на body, чтобы избежать потери управления клавиатурой.

  • Обработка модальных окон и скрытых элементов: если элемент не видим или находится внутри скрытого контейнера, Driver.js корректно игнорирует его или автоматически открывает родительский контейнер.

const driver = new Driver();
driver.defineSteps([
  {
    element: '#button1',
    popover: {
      title: 'Кнопка подтверждения',
      description: 'Нажмите, чтобы подтвердить действие.',
      position: 'bottom'
    }
  }
]);

driver.start();

В этом примере фокус автоматически переместится на элемент #button1 при показе соответствующего шага.


Использование tab-индексов

Tab-индексы определяют порядок навигации по элементам страницы с клавиатуры. В Driver.js можно управлять этим для улучшения UX:

  • Временная установка tabindex: Driver.js добавляет tabindex="-1" к элементу, если он изначально не фокусируемый. Это делает любой элемент доступным для .focus().

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

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

driver.defineSteps([
  {
    element: '#input1',
    popover: {
      title: 'Поле ввода',
      description: 'Введите данные для поиска.',
      position: 'top'
    },
    onNext: function(el) {
      el.setAttribute('tabindex', '0'); // временно делаем элемент фокусируемым
    }
  }
]);

Особенности фокусировки при динамических изменениях DOM

В современных SPA (Single Page Application) элементы могут появляться динамически. Driver.js поддерживает такие случаи через:

  • Отслеживание появляющихся элементов: если элемент отсутствует на момент инициализации шага, библиотека использует MutationObserver и повторно пытается установить фокус, когда элемент станет доступен.

  • Обновление фокуса при изменении контента: при асинхронной подгрузке контента или изменении layout, Driver.js корректирует позицию поповера и фокус элемента.

driver.defineSteps([
  {
    element: '#dynamicButton',
    popover: {
      title: 'Динамическая кнопка',
      description: 'Кнопка появится после загрузки данных.',
      position: 'right'
    }
  }
]);

driver.start();

Сочетание с клавишами навигации

Driver.js полностью поддерживает клавиатурную навигацию:

  • Tab и Shift+Tab: позволяют пользователю переходить между элементами в порядке их tab-индекса.
  • Escape: закрывает текущий поповер и завершает тур.
  • Enter / Space: могут быть привязаны к действиям на текущем элементе через кастомные колбэки.

Для корректной работы с клавиатурой важно, чтобы все элементы тура были фокусируемыми. Driver.js автоматически решает этот вопрос, устанавливая временный tabindex и возвращая исходные значения после завершения шага.


Рекомендации по использованию

  1. Минимизировать изменение tabindex вручную, если элементы уже фокусируемы.
  2. Проверять видимость элементов, иначе фокус может быть установлен на скрытый элемент.
  3. Использовать события onNext, onPrevious и onHighlightStarted для дополнительного контроля над фокусом.
  4. Сохранять доступность страницы: убедиться, что после завершения тура пользователи с клавиатурой могут продолжить навигацию без ограничений.

Фокус и tab-индексы — фундаментальная часть взаимодействия с пользователем в Driver.js. Грамотная настройка этих механизмов обеспечивает не только удобство и наглядность тура, но и соблюдение принципов доступности для всех типов пользователей.