Isotope — это мощная библиотека для управления расположением элементов на странице с возможностью фильтрации, сортировки и анимации. Управление фокусом является критически важным аспектом для обеспечения доступности интерфейсов и корректного взаимодействия пользователя с интерактивными элементами.
Фокус определяет элемент, который в данный момент готов к взаимодействию с клавиатурой. В контексте Isotope, фокус может быть применён к отдельным элементам сетки, что особенно важно при динамической фильтрации и сортировке, когда DOM элементы добавляются или удаляются.
Ключевые моменты:
tabindex="0" может принимать
фокус.При использовании метода filter изменяется видимость
элементов. Для корректного фокусирования необходимо:
Пример кода для безопасного переназначения фокуса:
const iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'fitRows'
});
function filterAndFocus(filterSelector) {
const focusedElement = document.activeElement;
iso.arrange({ filter: filterSelector });
const visibleItems = iso.filteredItems.map(item => item.element);
if (!visibleItems.includes(focusedElement)) {
visibleItems[0].focus();
}
}
В этом примере после фильтрации проверяется, находится ли элемент с текущим фокусом среди видимых элементов. Если нет, фокус автоматически устанавливается на первый элемент.
Для поддержки клавиатурной навигации важно реализовать перемещение фокуса по сетке элементов:
tabindex="-1" исключаются из стандартного
цикла табуляции, но могут получать фокус программно.Пример обработки клавиш для сетки Isotope:
document.querySelector('.grid').addEventListener('keydown', (e) => {
const current = document.activeElement;
const items = Array.from(document.querySelectorAll('.grid-item'));
const index = items.indexOf(current);
if (e.key === "ArrowRight") {
const next = items[index + 1] || items[0];
next.focus();
}
if (e.key === "ArrowLeft") {
const prev = items[index - 1] || items[items.length - 1];
prev.focus();
}
});
Этот подход обеспечивает интуитивное перемещение фокуса, даже если элементы динамически скрываются или добавляются.
Сортировка элементов через метод sortBy также меняет
порядок DOM. Важно:
Пример:
const focusedElement = document.activeElement;
iso.arrange({ sortBy: 'name' });
const sortedItems = iso.items.map(item => item.element);
if (sortedItems.includes(focusedElement)) {
focusedElement.focus();
} else {
sortedItems[0].focus();
}
При добавлении новых элементов через append или
insert следует учитывать:
tabindex="0"
для возможности фокусирования.const newItems = iso.appended(newElements);
newItems[0].element.setAttribute('tabindex', '0');
newItems[0].element.focus();
aria-live или другие ARIA атрибуты для
уведомления о динамических изменениях контента.keydown на уровне
документа, использовать делегирование на контейнер сетки.layout и updateSortData для
минимизации изменений DOM и сокращения лишнего перерисовывания.Управление фокусом в Isotope — это не просто вопрос доступности, а ключевой инструмент для обеспечения плавного пользовательского опыта на динамических сетках элементов. Правильная реализация предотвращает потерю фокуса, улучшает навигацию клавиатурой и поддерживает интерактивность интерфейса на высшем уровне.