Доступный индикатор прогресса в React

TL;DR
Кратко: покроем, как создать доступный индикатор прогресса (progress bar) в React с ARIA-атрибутами, простыми стилями и проверкой на скринридерах. В статье — код компонента, варианты стилизации, тестовый чек‑лист и критерии приёмки.
Прогресс-бары повышают вовлечённость: пользователи видят цель и знают, сколько осталось. Но визуальная индикация должна быть доступна и людям, использующим вспомогательные технологии. Ниже — пошаговая инструкция по созданию переиспользуемого и доступного ProgressBar в React.
Создайте компонент ProgressBar
Создайте файл ProgressBar.js и добавьте следующий код:
const ProgressBar = ({progress}) => {
return (
{`${progress}%`}
);
};
export default ProgressBar;
Первый div — контейнер, второй — сама полоса прогресса. span показывает процент.
Для доступности у внутреннего div есть:
- role=”progressbar” — объявляет элемент как индикатор прогресса.
- aria-valuenow — текущее значение (например, 50).
- aria-valuemin — минимальное значение.
- aria-valuemax — максимальное значение.
Примечание: aria-valuemin и aria-valuemax необязательны, если диапазон по умолчанию 0–100.
Стилизация индикатора
Ширина заполненной части зависит от пропса progress, поэтому удобнее передавать стиль из компонента. Пример inline‑стилей:
const container = {
height: 20,
width: "100%",
backgroundColor: "#fff",
borderRadius: 50,
margin: 50
}
const bar = {
height: "100%",
width: `${progress}%`,
backgroundColor: "#90CAF9",
borderRadius: "inherit",
}
const label = {
padding: "1rem",
color: "#000000",
}
И используйте их в разметке:
{`${progress}%`}
Отрисовка компонента:
Это отображает полосу на 50%.
Дополнительные рекомендации по доступности
- Добавьте aria-label или aria-labelledby, если контекст не очевиден: aria-label=”Загрузка файла”.
- Если значение изменяется динамически, подумайте о live‑регионе (например, aria-live=”polite”) у скрытого элемента, чтобы скринридер озвучивал обновления.
- Для пользователей клавиатуры обеспечьте фокусируемость и понятную последовательность Tab.
- Проверьте цветовой контраст заполненной и пустой частей — не полагайтесь только на цвет для передачи информации.
Альтернативные подходы
- Использовать нативный элемент
- Библиотеки компонентов (Material UI, Ant Design) уже содержат доступные индикаторы; используйте их, если нужны готовые решения.
- Для сложных сценариев — комбинировать SVG и ARIA: SVG даёт гибкость рисунка, ARIA — семантику.
Тесты и чек-лист приёмки
Краткий чек‑лист для тестирования перед деплоем:
- aria-valuenow корректно отражает progress при разных значениях.
- aria-valuemin и aria-valuemax установлены или верно опущены.
- Цветовой контраст соответствует рекомендациям WCAG (проверьте инструменты).
- Скринридер (NVDA/VoiceOver/JAWS) озвучивает значение при загрузке и при обновлении (при необходимости).
- Полоса реагирует на изменение размера окна и адаптируется на мобильных устройствах.
- Компонент доступен с клавиатуры (если он интерактивен).
Критерии приёмки
- При значении progress=0 скринридер сообщает 0% (или другое текстовое описание).
- При прогрессе 100% элемент отмечается как завершённый и при необходимости скрывается или заменяется сообщением.
- Визуально и семантически информация о прогрессе передаётся без использования только цвета.
Когда этот подход не сработает
- Если требуется сложная анимация с высокой производительностью на старых устройствах — inline‑стили и перерендеры могут оказывать нагрузку; лучше использовать CSS-анимации или requestAnimationFrame.
- Для очень нестандартной визуализации лучше SVG или canvas с явной семантикой ARIA.
Полезная методология быстрого внедрения
- Реализуйте минимальный компонент с role=”progressbar” и aria-valuenow.
- Добавьте стили и тесты контраста.
- Прогоните тесты с основными скринридерами и на мобильных браузерах.
- Обновите документацию компонента и добавьте истории в Storybook.
Короткое резюме
Доступный индикатор прогресса в React — это комбинация правильной семантики (role, aria‑атрибуты), адаптивных стилей и тестирования с вспомогательными технологиями. Простая реализация легко масштабируется и может служить блоком для сложных интерфейсов.
Важно: всегда тестируйте с реальными пользователями или эмуляторами скринридеров, чтобы убедиться, что поведение соответствует ожиданиям.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone