Библиотека ally.js предназначена для повышения доступности веб-приложений, предоставляя набор утилит для управления фокусом, проверки доступности элементов и создания интерактивных интерфейсов, соответствующих стандартам WCAG. Одной из ключевых возможностей является работа с зонами сброса (drop zones) — областями, куда можно перемещать элементы с помощью клавиатуры или drag-and-drop.
Зона сброса — это элемент интерфейса, на который пользователь может перетащить другой элемент. В ally.js зоны сброса можно определить, управлять их состояниями и визуализировать возможность сброса, что повышает доступность для пользователей с ограниченными возможностями.
Для создания зоны сброса используется метод
createDropTarget. Основные параметры:
const dropZone = ally.drop.createDropTarget({
element: document.querySelector('#drop-area'),
accept: '.draggable',
onDrop: function(draggable, dropZone) {
console.log('Элемент сброшен:', draggable, 'в зону:', dropZone);
}
});
Метод createDropTarget возвращает объект зоны сброса,
который можно использовать для управления состояниями: активации,
деактивации, проверки готовности к сбросу.
Для улучшения пользовательского опыта и доступности важно отображать текущее состояние зоны сброса: активна ли она, можно ли сбросить элемент, или сброс запрещён. ally.js предоставляет встроенные утилиты для отслеживания состояния:
isDropTargetActive(dropZone) — возвращает
true, если зона активна и готова принять элемент.isDropTargetHover(dropZone) — возвращает
true, если элемент находится над зоной.setDropTargetState(dropZone, state) — позволяет вручную
управлять визуальной индикацией состояния, где state может
быть "normal", "hover",
"disabled".Пример:
const dropZone = ally.drop.createDropTarget({ element: document.querySelector('#drop-area') });
document.addEventListener('dragenter', (event) => {
if (dropZone.accepts(event.target)) {
ally.drop.setDropTargetState(dropZone, 'hover');
}
});
document.addEventListener('dragleave', () => {
ally.drop.setDropTargetState(dropZone, 'normal');
});
Ally.js обеспечивает полноценную поддержку клавиатурного управления. Для зоны сброса это критично, так как пользователи без мыши должны иметь возможность перемещать элементы и видеть, когда зона готова принять объект.
Методы и события:
focusDropTarget(dropZone) — перемещает фокус на зону
сброса.blurDropTarget(dropZone) — снимает фокус.keydown и keyup используются для
управления сбросом через клавиши, например, Enter или
Space.Пример обработки клавиатурного сброса:
dropZone.element.addEventListener('keydown', (event) => {
if (event.key === 'Enter' && dropZone.isActive) {
dropZone.onDrop(currentDraggable, dropZone);
}
});
Зоны сброса в ally.js могут создаваться и удаляться динамически, что удобно для интерфейсов с изменяющимся контентом. Методы:
destroyDropTarget(dropZone) — удаляет зону и
освобождает ресурсы.updateDropTarget(dropZone, options) — позволяет
изменить параметры зоны, например, CSS-селектор принимаемых элементов
или колбэк onDrop.Пример динамического изменения:
ally.drop.updateDropTarget(dropZone, {
accept: '.new-draggable',
onDrop: (item) => console.log('Новый элемент сброшен:', item)
});
Для пользователя важно видеть где можно сбросить элемент. ally.js не навязывает стиль, но предоставляет классы для управления состояниями:
.ally-drop-target — базовый класс зоны..ally-drop-target-hover — активный при наведении..ally-drop-target-disabled — неактивная зона.CSS-пример:
.ally-drop-target {
border: 2px dashed #ccc;
padding: 20px;
transition: border-color 0.3s;
}
.ally-drop-target-hover {
border-color: #4CAF50;
background-color: #f0fff0;
}
.ally-drop-target-disabled {
border-color: #ccc;
opacity: 0.5;
}
Ally.js позволяет интегрировать зоны сброса с фреймворками и библиотеками UI, включая React, Vue и Angular. Ключевые моменты:
querySelector.Поддержка ARIA-атрибутов обеспечивает совместимость с экранными читалками:
dropZone.element.setAttribute('aria-dropeffect', 'move');
dropZone.element.setAttribute('aria-label', 'Зона для сброса элемента');
Эти атрибуты информируют пользователя о возможностях взаимодействия.
Ally.js предоставляет детальное событие для мониторинга действий пользователя:
onDrop — успешный сброс.onEnter — элемент вошел в зону.onLeave — элемент покинул зону.Пример с логированием:
dropZone.onEn ter = (draggable) => console.log('Элемент вошел в зону:', draggable);
dropZone.onLe ave = (draggable) => console.log('Элемент покинул зону:', draggable);
Это позволяет создавать адаптивный интерфейс, где визуальная и функциональная индикация реагируют на действия пользователя в реальном времени.