Сравнение с ally.js

Библиотека Tabbable в JavaScript предназначена для определения всех элементов на странице, которые могут получать фокус через клавишу Tab. Она используется для обеспечения доступности интерфейсов и контроля навигации с клавиатуры. В отличие от ручного перебора DOM-элементов, Tabbable предоставляет высокоуровневый API, который корректно учитывает такие особенности, как скрытые элементы, элементы с disabled и специфические правила для форм.

Основные функции:

  • tabbable(container) — возвращает массив элементов внутри указанного контейнера, которые могут быть сфокусированы через Tab.
  • isTabbable(element) — проверяет, является ли отдельный элемент доступным для фокусировки с Tab.
  • focusable(container) — возвращает все элементы, которые можно сфокусировать, включая те, которые не входят в порядок табуляции.

Эти функции учитывают скрытые элементы (display: none и visibility: hidden), атрибут tabindex и элементы <input>, <button>, <a> с соответствующими условиями.

Отличие Tabbable от ally.js

Библиотека ally.js также предназначена для управления фокусом и доступностью, но отличается по подходу и набору возможностей.

1. Основная цель

  • Tabbable сосредоточена на вычислении порядка табуляции и проверке фокусируемости элементов.
  • ally.js предоставляет более широкий спектр инструментов для доступности: управление фокусом, обнаружение активных элементов, навигация по контенту, управление атрибутами ARIA.

2. API

  • В Tabbable API минималистичное и узкоспециализированное:

    import { tabbable } from 'tabbable';
    
    const elements = tabbable(document.body);
    elements.forEach(el => console.log(el.tagName));
  • В ally.js API более разветвлённое:

    import * as ally from 'ally.js';
    
    const tabbableElements = ally.query.tabstoppable({ context: document.body });

3. Размер и производительность

  • Tabbable весит меньше, около нескольких килобайт, что делает её подходящей для проектов, где критична скорость загрузки.
  • ally.js — более объёмная библиотека, предоставляющая множество функций, которые не всегда нужны для простой проверки табуляции, но полезны при комплексной доступности интерфейсов.

4. Обработка нестандартных случаев

  • Tabbable корректно работает с tabindex="-1", скрытыми элементами и встроенными элементами формы, но не управляет фокусом динамически.
  • ally.js поддерживает динамическое управление фокусом, управление модальными окнами, предотвращение ухода фокуса за пределы контейнера и работу с ARIA-атрибутами.

5. Простота интеграции

  • Tabbable легко подключается в проект через npm или CDN, не требует конфигурации.
  • ally.js требует понимания модели доступности и больше настроек, но позволяет создавать более комплексные решения для взаимодействия с пользователем.

Примеры использования Tabbable

Поиск всех табулируемых элементов на странице:

import { tabbable } from 'tabbable';

const allTabbable = tabbable(document.body);
console.log(allTabbable); // [button, input, a, ...]

Проверка, можно ли сфокусировать конкретный элемент:

import { isTabbable } from 'tabbable';

const button = document.querySelector('#submit');
if (isTabbable(button)) {
  button.focus();
}

Фокусировка первого доступного элемента:

import { tabbable } from 'tabbable';

const firstFocusable = tabbable(document.querySelector('#form'))[0];
if (firstFocusable) {
  firstFocusable.focus();
}

Когда выбирать Tabbable

  • Для анализа порядка табуляции и управления фокусом на ограниченной области интерфейса.
  • Когда важна минимальная нагрузка и простота кода.
  • Для проектов, где не требуется динамическое управление ARIA-атрибутами и сложная логика доступности.

Tabbable идеальна для лёгких инструментов проверки фокусируемости, создания собственных систем управления клавиатурой и анализа доступности элементов формы. В то время как ally.js подходит для комплексных приложений, где необходимо полное управление доступностью и модальными состояниями.