Клавиатурная навигация — важный аспект доступности интерфейса,
который напрямую влияет на восприятие анимаций при прокрутке. При
использовании библиотеки AOS (Animate On Scroll) необходимо учитывать,
что пользователь может перемещаться по странице не только с помощью мыши
или сенсорного экрана, но и через клавиатуру — с использованием клавиш
Tab, Shift + Tab, Enter,
Space, стрелок и других.
Анимации, привязанные к событию прокрутки, могут не срабатывать при таком способе взаимодействия, поскольку фокус перемещается между элементами без фактического скроллинга.
По умолчанию AOS отслеживает положение элементов относительно
viewport и запускает анимации при их появлении в зоне видимости. При
перемещении по странице с помощью Tab:
opacity: 0, transform и т.д.)Клавиатурная навигация возможна только для фокусируемых элементов. Основные правила:
<a>,
<button>, <input>) фокусируются
автоматическиtabindex="0" или
вышеПример:
<div data-aos="fade-up" tabindex="0">
Контент с анимацией
</div>
Добавление tabindex делает элемент доступным для
навигации, но не решает проблему запуска анимации.
Для корректной работы с клавиатурой необходимо отслеживать событие
focus и вручную инициировать анимацию.
Пример решения:
document.querySelectorAll('[data-aos]').forEach(el => {
el.addEventListener('focus', () => {
el.classList.add('aos-animate');
});
});
Особенности:
aos-animate — ключевой триггер для отображения
анимацииAOS управляет состоянием элементов через собственный механизм, включая:
refresh,
refreshHard)Прямое вмешательство (например, добавление класса) может нарушить согласованность. Более корректный подход:
document.querySelectorAll('[data-aos]').forEach(el => {
el.addEventListener('focus', () => {
AOS.refresh();
});
});
Однако это не всегда гарантирует мгновенное появление анимации.
В случаях, когда требуется точный контроль над отображением элементов
при фокусе, можно дополнительно использовать
IntersectionObserver.
Пример:
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('aos-animate');
}
});
});
document.querySelectorAll('[data-aos]').forEach(el => {
observer.observe(el);
});
Это решение:
Анимации могут мешать восприятию, если элемент получает фокус до завершения появления:
transform)Рекомендуется:
data-aos-duration с умеренными значениями
(300–600 мс)Пример:
<button data-aos="fade" data-aos-duration="400">
Кнопка
</button>
Современные браузеры поддерживают псевдокласс
:focus-visible, который позволяет отделить клавиатурный
фокус от мышиного.
Пример:
:focus-visible {
outline: 2px solid #000;
}
При использовании AOS важно, чтобы:
overflow или
transformAOS по умолчанию скрывает элементы до анимации:
[data-aos] {
opacity: 0;
}
Это создаёт проблему доступности:
Решения:
data-aos-once="true" — элемент анимируется
один раз и остаётся видимым[data-aos] {
opacity: 1;
transform: none;
}
[data-aos].aos-animate {
opacity: 1;
}
Неправильный порядок tabindex может приводить к:
Рекомендуется:
tabindex > 0Для улучшения доступности можно использовать ARIA-атрибуты:
<div data-aos="fade-up" aria-hidden="true">
Контент
</div>
После анимации:
el.addEventListener('focus', () => {
el.classList.add('aos-animate');
el.setAttribute('aria-hidden', 'false');
});
Это позволяет:
В некоторых случаях предпочтительно полностью отключать AOS при навигации с клавиатуры.
Пример:
let isKeyboardUser = false;
document.addEventListener('keydown', () => {
isKeyboardUser = true;
});
if (isKeyboardUser) {
AOS.init({
disable: true
});
}
Альтернативный подход — использовать медиа-запрос:
AOS.init({
disable: window.matchMedia('(prefers-reduced-motion: reduce)').matches
});
data-aos-delay) для интерактивных
компонентов1. Фокус на невидимом элементе Причина:
opacity: 0 до анимации Решение: принудительное отображение
при focus
2. Анимация не запускается Причина: отсутствие
scroll-события Решение: ручное добавление aos-animate
3. Нарушение логики навигации Причина: неправильный
tabindex Решение: соблюдение естественного порядка DOM
4. Потеря фокуса Причина: transform или overflow Решение: минимизация визуальных эффектов для фокусируемых элементов
Грамотное использование AOS в сочетании с клавиатурной навигацией требует баланса:
Правильная настройка позволяет сохранить плавность интерфейса и обеспечить полноценную работу для всех категорий пользователей.