Featherlight — лёгкая и минималистичная библиотека для создания модальных окон в JavaScript. Несмотря на простоту, она предоставляет возможности для обеспечения доступности, что особенно важно для пользователей, использующих скринридеры. Рассмотрим ключевые аспекты поддержки таких технологий.
Для корректного восприятия модальных окон скринридерами необходимо использовать ARIA-атрибуты:
Пример правильной разметки модального окна:
<div id="lightbox" class="featherlight" role="dialog" aria-labelledby="lightbox-title" aria-describedby="lightbox-desc">
<h2 id="lightbox-title">Пример модального окна</h2>
<p id="lightbox-desc">Это окно демонстрирует поддержку скринридеров в Featherlight.</p>
</div>
Открытие модального окна требует переноса фокуса внутрь него. Featherlight позволяет программно управлять фокусом через колбэки:
Пример реализации:
var lastFocus;
$.featherlight('#lightbox', {
beforeOpen: function() {
lastFocus = document.activeElement;
},
afterOpen: function() {
var firstFocusable = this.$content.find('button, a, input, textarea, select').first();
(firstFocusable.length ? firstFocusable : this.$content).focus();
},
afterClose: function() {
if(lastFocus) lastFocus.focus();
}
});
Чтобы предотвратить перемещение фокуса за пределы модального окна при навигации клавишей Tab, реализуется фокус-трап. Featherlight не предоставляет встроенный фокус-трап, но его легко добавить:
this.$content.on('keydown', function(e) {
if(e.key === 'Tab') {
var focusable = $(this).find('a, button, input, textarea, select').filter(':visible');
var first = focusable.first()[0];
var last = focusable.last()[0];
if(e.shiftKey && document.activeElement === first) {
e.preventDefault();
last.focus();
} else if(!e.shiftKey && document.activeElement === last) {
e.preventDefault();
first.focus();
}
}
});
Для улучшения доступности фоновые элементы страницы должны быть
скрыты от скринридеров с помощью aria-hidden.
Featherlight позволяет это реализовать через колбэк
beforeOpen и afterClose:
var $mainContent = $('main');
$.featherlight('#lightbox', {
beforeOpen: function() {
$mainContent.attr('aria-hidden', 'true');
},
afterClose: function() {
$mainContent.removeAttr('aria-hidden');
}
});
Если модальное окно содержит динамически загружаемый контент (например, через AJAX), важно обновлять ARIA-описания и фокус после загрузки:
$.featherlight({
ajax: '/example.html',
afterContent: function() {
this.$content.attr('aria-label', 'Динамический контент');
this.$content.focus();
}
});
Поддержка скринридеров невозможна без полноценной клавиатурной навигации. Featherlight предоставляет опцию закрытия окна клавишей Esc, а также можно обрабатывать дополнительные сочетания для управления:
$(document).on('keydown', function(e) {
if(e.key === 'Escape' && $('.featherlight:visible').length) {
$.featherlight.close();
}
});
Для проверки корректности работы скринридеров рекомендуется:
Эти подходы обеспечивают совместимость Featherlight с современными стандартами доступности, позволяя пользователям, использующим скринридеры, получать полноценный опыт работы с модальными окнами.