В Material-UI (MUI) управление фокусом и навигация с клавиатуры являются важной частью обеспечения доступности компонентов. MUI изначально проектируется с поддержкой ARIA и стандартных событий клавиатуры, что позволяет пользователям перемещаться между элементами интерфейса без использования мыши.
Клавиша Tab используется для перехода между
фокусируемыми элементами. В MUI любой компонент, который принимает
tabIndex или имеет интерактивное поведение
(Button, TextField, Checkbox,
Select), автоматически становится частью последовательности
фокуса.
Пример базового использования:
import Button from '@mui/material/Button';
Особенности:
tabIndex={0} — элемент участвует в стандартной
последовательности Tab.tabIndex={-1} — элемент фокусируется только программно
(element.focus()), исключён из обычного Tab-перехода.Компоненты, такие как Menu, Select, Autocomplete и Tabs, реализуют собственную логику навигации с клавиатуры.
Для Menu и MenuItem предусмотрены следующие горячие клавиши:
Пример:
import Menu from '@mui/material/Menu';
import MenuItem from '@mui/material/MenuItem';
import Button from '@mui/material/Button';
import { useState } from 'react';
function SimpleMenu() {
const [anchorEl, setAnchorEl] = useState(null);
const handleClick = (event) => setAnchorEl(event.currentTarget);
const handleClose = () => setAnchorEl(null);
return (
<>
>
);
}
В этом примере фокус автоматически переходит на первый элемент меню при открытии, а клавиши стрелок позволяют перемещаться по списку без мыши.
Компонент Tabs поддерживает навигацию с клавиатуры в соответствии с рекомендациями WAI-ARIA:
Пример:
import Tabs from '@mui/material/Tabs';
import Tab from '@mui/material/Tab';
import { useState } from 'react';
function KeyboardTabs() {
const [value, setValue] = useState(0);
const handleChange = (event, newValue) => setValue(newValue);
return (
);
}
Вкладки автоматически обрабатывают навигацию стрелками и фокусировку.
onKeyDownДля более сложных компонентов иногда требуется вручную обработать клавиатуру. MUI позволяет это через обработчики событий:
import TextField from '@mui/material/TextField';
function CustomInput() {
const handleKeyDown = (event) => {
if (event.key === 'Enter') {
console.log('Нажата клавиша Enter');
}
};
return ;
}
Важно помнить о передаче события дальше, если нужно сохранить стандартное поведение:
event.preventDefault(); // отмена стандартного действия
event.stopPropagation(); // прекращение распространения события
MUI предоставляет методы для управления фокусом через рефы. Это полезно для модальных окон или динамически появляющихся компонентов.
import Button from '@mui/material/Button';
import { useRef } from 'react';
function FocusButton() {
const buttonRef = useRef(null);
const focusButton = () => buttonRef.current.focus();
return (
<>
>
);
}
MUI компоненты по умолчанию используют ARIA-атрибуты для обеспечения совместимости с клавиатурой и экранными читалками:
aria-haspopup для кнопок открытия меню.aria-controls для связи элементов управления и
областей.aria-expanded для раскрывающихся списков.aria-selected для активных вкладок.Правильная настройка этих атрибутов обеспечивает предсказуемое поведение навигации с клавиатуры и улучшает доступность интерфейса.