SortableJS — это мощная библиотека для реализации перетаскивания элементов в интерфейсе на стороне клиента. Одним из ключевых аспектов при работе с интерактивными элементами является доступность (accessibility), которая обеспечивает возможность использования функционала всеми пользователями, включая людей с ограниченными возможностями.
Доступность в контексте SortableJS строится на трёх базовых принципах:
Поддержка клавиатурной навигации Элементы списка
должны быть перемещаемыми не только мышью, но и с помощью клавиатуры.
SortableJS предоставляет возможности для отслеживания фокуса и обработки
событий клавиш, таких как Enter, Space,
ArrowUp, ArrowDown.
Атрибуты ARIA Для корректного восприятия перетаскиваемых элементов вспомогательными технологиями необходимо использовать ARIA-атрибуты. Ключевые атрибуты:
aria-grabbed — указывает, что элемент захвачен и может
быть перемещён.aria-dropeffect — показывает тип операции, доступной
при перетаскивании (move, copy,
link).role="list" и role="listitem" — задают
семантику контейнера и элементов списка.Визуальная индикация фокуса и перемещения Для
пользователей с ограничениями зрения важна наглядная обратная связь. При
выборе элемента с клавиатуры или при начале перетаскивания необходимо
выделять элемент визуально с помощью классов CSS, например
.sortable-chosen и .sortable-ghost.
SortableJS позволяет гибко настраивать взаимодействие с клавиатурой через опции:
fallbackOnBody и
swapThreshold Настройки, влияющие на корректное
перемещение элементов при использовании альтернативных методов
взаимодействия.
handle и filter
Позволяют ограничить перетаскивание только определёнными зонами или
исключить неинтерактивные элементы из перетаскивания.
Пример конфигурации с поддержкой клавиатуры и ARIA:
const sortable = new Sortable(listElement, {
animation: 150,
handle: '.drag-handle',
ghostClass: 'sortable-ghost',
chosenClass: 'sortable-chosen',
onStart: function (evt) {
evt.item.setAttribute('aria-grabbed', 'true');
},
onEnd: function (evt) {
evt.item.setAttribute('aria-grabbed', 'false');
}
});
SortableJS не предоставляет встроенной поддержки полноценной клавиатурной навигации, но библиотека позволяет подключить обработчики событий для реализации этой функциональности. Стандартный подход:
ArrowUp и ArrowDown
для перемещения выбранного элемента.Пример обработчика клавиатуры:
listElement.addEventListener('keydown', (event) => {
const item = document.activeElement;
if (!item.classList.contains('sortable-item')) return;
if (event.key === 'ArrowUp' && item.previousElementSibling) {
listElement.insertBefore(item, item.previousElementSibling);
}
if (event.key === 'ArrowDown' && item.nextElementSibling) {
listElement.insertBefore(item.nextElementSibling, item.nextElementSibling.nextSibling);
}
});
Для проверки корректной реализации доступности рекомендуется:
aria-label или aria-labelledby.aria-posinset и
aria-setsize.Доступность в SortableJS требует внимательного подхода к настройке ARIA-атрибутов, обработке событий клавиатуры и визуальной обратной связи. При правильной реализации интерфейс становится удобным для всех пользователей, сохраняя интерактивность и функциональность.