Unpoly предоставляет мощный механизм для управления фокусом
элементов при работе с многослойными интерфейсами. Важно
понимать, что каждый слой (layer) в Unpoly — это отдельный
контекст, и взаимодействие с фокусом элементов в этих слоях требует
осознанного подхода.
Каждый слой в Unpoly имеет собственное дерево DOM, но может находиться поверх других слоев. Основные типы слоев:
up.layer.content) —
базовый контент страницы.up.layer.popup) —
модальные окна или временные панели.up.layer.background) —
используются для фоновых процессов без прямого взаимодействия
пользователя.При открытии нового слоя Unpoly автоматически управляет фокусом следующим образом:
Это поведение предотвращает потерю контекста для пользователя и обеспечивает доступность интерфейса.
Unpoly предоставляет несколько методов и событий для управления фокусом:
up.focus(element)
Принудительно устанавливает фокус на указанный элемент. Работает даже внутри модальных и всплывающих слоев:
up.focus('#search-input');События фокусировки слоев
up:layer:opened — срабатывает после открытия слоя.
Можно использовать для установки фокуса на определённый элемент.up:layer:closed — срабатывает после закрытия слоя,
удобно для возврата фокуса на инициирующий элемент.Пример:
up.on('up:layer:opened', function(event) {
if (event.layer.type === 'popup') {
up.focus(event.layer.element.querySelector('input:first-of-type'));
}
});Атрибут up-autofocus
Можно использовать HTML-атрибут на элементе, чтобы указать, что фокус должен автоматически устанавливать именно этот элемент при открытии слоя:
<input type="text" up-autofocus>
Unpoly автоматически переносит фокус на этот элемент при рендеринге слоя.
В сложных интерфейсах с несколькими вложенными слоями нужно учитывать следующие моменты:
Пример ручного управления:
const triggerButton = document.querySelector('#open-popup');
up.on('up:layer:opened', function(event) {
if (event.layer.type === 'popup') {
const input = event.layer.element.querySelector('input:first-of-type');
up.focus(input);
}
});
up.on('up:layer:closed', function(event) {
triggerButton.focus();
});
При загрузке нового контента через Unpoly (up.render)
важно учитывать фокус:
up-autofocus, фокус перемещается на
него.focus: false при рендере:up.render('#comments', '/comments', { focus: false });
up-autofocus совместно с событиями открытия слоев.Фокус в Unpoly — это не просто установка курсора на элемент. Это
контекстный механизм, позволяющий управлять вниманием
пользователя, сохранять доступность интерфейса и корректно работать с
множественными слоями одновременно. Правильное использование
up.focus, up-autofocus и событий
открытия/закрытия слоев обеспечивает интуитивное и безопасное поведение
при взаимодействии с динамическим интерфейсом.