FAST Element предоставляет гибкие возможности для организации клавиатурной навигации в веб-компонентах, обеспечивая удобный доступ и управление фокусом с помощью клавиш. Основная цель — сделать интерфейсы доступными и предсказуемыми при использовании клавиатуры.
Фокус в FAST Element контролируется через стандартные атрибуты HTML
(tabindex) и встроенные методы компонента. Для управления
фокусируемыми элементами используются следующие механизмы:
tabindex — определяет порядок
обхода элементов при навигации клавишей Tab.
tabindex="0" делает элемент фокусируемым в естественном
порядке DOM.tabindex="-1" делает элемент фокусируемым программно,
но исключает его из последовательности обхода клавишей
Tab.Методы компонента:
focus() — программно устанавливает фокус на
элемент.blur() — снимает фокус.Пример управления фокусом в кастомном компоненте:
import { FASTElement, html, css } from "@microsoft/fast-element";
class MyButton extends FASTElement {
template = html`<button @click="${x => x.handleClick()}">Нажми</button>`;
handleClick() {
console.log("Кнопка нажата");
}
}
FASTElement.define({ name: 'my-button', template: MyButton.template, styles: css`` });
Фокус автоматически устанавливается на кнопку при взаимодействии через клавиатуру.
FAST Element поддерживает обработку стандартных событий клавиатуры:
keydown, keyup, keypress.
Основное применение — создание логики, реагирующей на навигацию и
действия пользователя:
keydown — вызывается при нажатии клавиши, до выполнения
действия по умолчанию.keyup — вызывается при отпускании клавиши.keypress — устаревший, используется редко,
предпочтительно keydown.Пример обработки клавиш для навигации:
this.addEventListener("keydown", (e) => {
switch (e.key) {
case "ArrowDown":
this.moveFocusNext();
e.preventDefault();
break;
case "ArrowUp":
this.moveFocusPrevious();
e.preventDefault();
break;
}
});
Для реализации логики обхода элементов внутри компонента используется коллекция фокусируемых элементов и методы для переключения фокуса:
getFocusableElements() {
return Array.from(this.shadowRoot.querySelectorAll('[tabindex="0"]'));
}
moveFocusNext() {
const elements = this.getFocusableElements();
const currentIndex = elements.indexOf(this.shadowRoot.activeElement);
const nextIndex = (currentIndex + 1) % elements.length;
elements[nextIndex].focus();
}
moveFocusPrevious() {
const elements = this.getFocusableElements();
const currentIndex = elements.indexOf(this.shadowRoot.activeElement);
const prevIndex = (currentIndex - 1 + elements.length) % elements.length;
elements[prevIndex].focus();
}
Такая реализация обеспечивает циклическую навигацию с клавиатуры по элементам внутри компонента.
FASTElement и FocusControllerFAST Element предлагает FocusController для централизованного управления фокусом в компонентах с большим количеством интерактивных элементов. Основные возможности:
roving tabindex.Пример интеграции FocusController:
import { FASTElement, FocusController } from "@microsoft/fast-element";
class MenuList extends FASTElement {
focusController = new FocusController(this);
connectedCallback() {
super.connectedCallback();
this.focusController.register();
}
}
Контроллер позволяет автоматически реализовать шаблон roving
tabindex, когда один элемент получает
tabindex="0", а все остальные — -1, что
обеспечивает последовательный обход клавишей Tab.
tabindexРовинг tabindex — стандартная практика для сложных
компонентов, таких как меню, вкладки, списки. Суть:
tabindex="0" — текущий
активный.tabindex="-1".tabindex
пересчитывается.Пример применения в компоненте вкладок:
moveFocusTo(index) {
const tabs = this.shadowRoot.querySelectorAll('[role="tab"]');
tabs.forEach((tab, i) => tab.tabIndex = i === index ? 0 : -1);
tabs[index].focus();
}
Это обеспечивает логичное и предсказуемое поведение при работе с клавиатурой.
Ctrl+Arrow, Shift+Tab и
другие, что полезно для сложных интерфейсов.role,
aria-selected, aria-expanded совместно с
фокусом делает навигацию доступной для экранных читалок.focus-moved или item-selected, чтобы другие
компоненты реагировали на изменение фокуса.tabindex для контроля
последовательности обхода.Клавиатурная навигация в FAST Element сочетает программируемый контроль фокуса, обработку событий и поддержку стандартов доступности, что делает создание интерактивных и доступных компонентов простым и предсказуемым.