Focus
Плагин Focus позволяет управлять фокусом на странице.
Установка
Вы можете использовать этот плагин, включив его из тега <script>
или установив с помощью менеджера пакетов.
Через CDN
Вы можете подключить CDN-сборку этого плагина с помощью тега <script>
, только подключать нужно ДО основного JS-файла Alpine.
Через менеджер пакетов
Вы можете установить Focus для использования внутри вашей сборки следующим образом:
Затем инициализируйте его в своей сборке:
x-trap
Focus предлагает специальный API для захвата фокуса внутри элемента: директива x-trap
.
x-trap
принимает выражение в формате JS. Если результат этого выражения равен true
, то фокус будет удерживаться внутри этого элемента до тех пор, пока выражение не станет false
, после чего фокус будет возвращён туда, где он находился ранее.
Например:
Вложение диалогов
Иногда возникает необходимость вложить один диалог в другой. x-trap
делает это тривиальным и обрабатывает автоматически.
x-trap
ведет учет новых «пойманных» элементов и сохраняет последний активно сфокусированный элемент. После того, как элемент будет «отловлен», фокус будет возвращён в исходное положение.
Этот механизм является рекурсивным, поэтому можно бесконечно долго удерживать фокус внутри уже захваченного элемента, а затем «разворачивать» каждый элемент последовательно.
Вот вложение в действии:
Модификаторы
.inert
При создании таких вещей, как диалоговые окна/модальные окна, рекомендуется скрывать все остальные элементы на странице от программ чтения с экрана при захвате фокуса.
Если добавить .inert
к x-trap
, то при перехвате фокуса все остальные элементы получат атрибуты aria-hidden="true"
, а при отключении перехвата фокуса эти атрибуты также будут удалены.
.noscroll
При построении диалогов/модалов с помощью Alpine рекомендуется отключать прокрутку окружающего содержимого, когда диалог открыт.
x-trap
позволяет делать это автоматически с помощью модификаторов .noscroll
.
Добавив .noscroll
, Alpine уберет со страницы полосу прокрутки и запретит пользователям прокручивать страницу вниз, пока открыт диалог.
Например:
Обратите внимание, что при открытом диалоговом окне прокрутка на этой странице больше не производится.
.noreturn
Иногда не требуется возвращать фокус на прежнее место. Рассмотрим выпадающий список, который срабатывает при фокусировке на поле ввода, возврат фокуса на поле ввода при закрытии просто вызовет повторное открытие выпадающего списка.
x-trap
позволяет отключить это поведение с помощью модификатора .noreturn
.
После добавления .noreturn
Alpine не будет возвращать фокус при установке x-trap
на false
.
Например:
Обратите внимание, что при закрытии этого выпадающего списка фокус не возвращается на поле ввода.
.noautofocus
По умолчанию, когда x-trap
отлавливает фокус внутри элемента, он фокусируется на первом фокусируемом элементе внутри этого элемента. Это разумное значение по умолчанию, однако в некоторых случаях вы можете захотеть отключить это поведение и не фокусировать автоматически элементы при срабатывании x-trap
.
Добавив .noautofocus
, Alpine не будет автоматически фокусировать элементы при захвате фокуса.
$focus
Этот плагин предлагает множество небольших утилит для управления фокусом на странице. Эти утилиты доступны с помощью магического свойства $focus
.
Предлагаемая утилита | Описание |
---|---|
focus(el) | Фокусировка переданного элемента (внутренняя обработка раздражителей): использование nextTick и т. д. |
focusable(el) | Определить, является ли элемент фокусируемым |
focusables() | Получить все «фокусируемые» элементы в пределах текущего элемента |
focused() | Получение текущего сфокусированного элемента на странице |
lastFocused() | Получение последнего сфокусированного элемента на странице |
within(el) | Укажите элемент, на который следует распространить магию $focus (по умолчанию это текущий элемент) |
first() | Фокусировка первого фокусируемого элемента |
last() | Фокусировка последнего фокусируемого элемента |
next() | Фокусировка следующего фокусируемого элемента |
previous() | Фокусировка предыдущего фокусируемого элемента |
noscroll() | Предотвращение прокрутки к элементу, на котором будет сосредоточена фокусировка |
wrap() | При получении «next» или «previous» используйте «wrap around» (например, возврат первого элемента, если получен «next» элемент последнего элемента) |
getFirst() | Получение первого фокусируемого элемента |
getLast() | Получение последнего фокусируемого элемента |
getNext() | Получение следующего фокусируемого элемента |
getPrevious() | Получение предыдущего фокусируемого элемента |
Рассмотрим несколько примеров использования этих утилит. Приведённый ниже пример позволяет пользователю управлять фокусом внутри группы кнопок с помощью клавиш со стрелками. Это можно проверить, щелкнув на кнопке, а затем используя клавиши со стрелками для перемещения фокуса:
Обратите внимание, что при фокусировке последней кнопки, нажатие «стрелки вправо» ничего не сделает. Добавим метод .wrap()
, чтобы фокус «оборачивался»:
Теперь добавим две кнопки, одна из которых будет фокусироваться на первом элементе группы кнопок, а другая — на последнем:
Обратите внимание, что для каждой кнопки необходимо добавить метод .within()
, чтобы $focus
знал, что нужно обращаться к другому элементу (div
, оборачивающему кнопки).
Проверка знаний
-
Как отключить автоматическую фокусировку элемента при захвате фокуса?
-
Как передать фокус следующему фокусируемому элементу?