Библиотека Interact.js предоставляет гибкие средства для работы с интерактивными элементами на веб-странице, включая перетаскивание, масштабирование и вращение. Одним из важных аспектов UX является поддержка клавиатурной навигации, которая позволяет управлять элементами без мыши, что критично для доступности интерфейсов. Interact.js предлагает методы для интеграции клавиатурного управления через события и модификаторы.
Для начала необходимо подключить библиотеку:
import interact from 'interactjs';
Затем элементу назначается интерактивное поведение:
interact('.draggable')
.draggable({
listeners: {
move(event) {
const target = event.target;
const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;
const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;
target.style.transform = `translate(${x}px, ${y}px)`;
target.setAttribute('data-x', x);
target.setAttribute('data-y', y);
}
}
});
Чтобы добавить клавиатурную навигацию, используется
прослушка событий keydown. Основная идея: при нажатии
клавиш стрелок менять координаты элемента на фиксированное смещение,
аналогичное движению мышью.
const step = 10; // шаг перемещения в пикселях
const element = document.querySelector('.draggable');
element.tabIndex = 0; // делаем элемент фокусируемым
element.addEventListener('keydown', (event) => {
let x = parseFloat(element.getAttribute('data-x')) || 0;
let y = parseFloat(element.getAttribute('data-y')) || 0;
switch (event.key) {
case 'ArrowUp':
y -= step;
break;
case 'ArrowDown':
y += step;
break;
case 'ArrowLeft':
x -= step;
break;
case 'ArrowRight':
x += step;
break;
}
element.style.transform = `translate(${x}px, ${y}px)`;
element.setAttribute('data-x', x);
element.setAttribute('data-y', y);
event.preventDefault();
});
Interact.js поддерживает модификаторы, которые позволяют ограничивать перемещение элементов определёнными правилами: сетка, границы контейнера, инерция. Эти модификаторы можно применять и к клавиатурной навигации, синхронизируя шаг движения с сеткой или ограничивая область передвижения.
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.snap({
targets: [interact.snappers.grid({ x: 50, y: 50 })],
range: Infinity,
relativePoints: [{ x: 0, y: 0 }]
}),
interact.modifiers.restrictRect({
restriction: 'parent',
endOnly: true
})
]
});
При такой конфигурации каждое нажатие стрелки будет перемещать элемент на 50 пикселей, соблюдая ограничения контейнера.
Interact.js позволяет объединять различные типы
ввода. Клавиатура не конфликтует с перетаскиванием мышью или
жестами на сенсорных устройствах. Основной принцип — синхронизация
позиции элемента через data-x и data-y:
Это позволяет создавать унифицированное управление элементами на странице.
setInterval при событии keydown и
очистка интервала на keyup.aria-posinset,
aria-setsize и роли элементов, чтобы технологии чтения с
экрана корректно интерпретировали положение элементов.tabIndex для интерактивных элементов,
чтобы они могли получать фокус.preventDefault() для стрелок,
чтобы избежать скролла страницы при перемещении элементов.Клавиатурная навигация в Interact.js позволяет создавать доступные и гибкие интерфейсы, объединяя управление мышью, сенсорными устройствами и клавишами для полноценного интерактивного опыта.