Featherlight — минималистичная lightbox-библиотека, не ориентированная изначально на доступность «из коробки». Однако благодаря простой DOM-структуре и отсутствию жёсткой логики управления фокусом, библиотека хорошо поддаётся адаптации под требования WCAG с использованием ARIA-атрибутов. ARIA в контексте Featherlight используется для корректного описания модального окна, управления фокусом и информирования вспомогательных технологий о состоянии интерфейса.
role="dialog" и role="alertdialog")Lightbox по своей природе является модальным диалогом. Основной
контейнер Featherlight (.featherlight) должен иметь явно
заданную роль:
<div class="featherlight" role="dialog" aria-modal="true">
Ключевые моменты:
role="dialog" сообщает скринридерам,
что перед ними диалоговое окно.aria-modal="true" указывает, что
остальной контент страницы временно недоступен.role="alertdialog"
допустимо только в случаях, когда содержимое требует немедленного
внимания (ошибка, подтверждение критичного действия).Featherlight по умолчанию не устанавливает эти роли, поэтому их необходимо добавлять вручную — либо через модификацию шаблона, либо через события библиотеки.
Диалоговое окно должно иметь логически связанный заголовок и
описание. Для этого применяются aria-labelledby и
aria-describedby.
Пример структуры:
<div class="featherlight" role="dialog" aria-modal="true"
aria-labelledby="fl-title" aria-describedby="fl-content">
<h2 id="fl-title">Галерея изображений</h2>
<div id="fl-content">
...
</div>
</div>
Принципы:
aria-labelledby всегда предпочтительнее, чем
aria-label, если заголовок уже присутствует в DOM.aria-describedby используется только для
дополнительного описания, а не для основного текста.aria-hiddenПри открытии Featherlight визуально перекрывает страницу, но DOM-контент остаётся доступным. Для корректной работы скринридеров необходимо временно скрывать основной контент:
$('body > *:not(.featherlight)').attr('aria-hidden', 'true');
При закрытии lightbox атрибут должен быть удалён:
$('body > *').removeAttr('aria-hidden');
Это предотвращает «утечку фокуса» и навигацию по невидимым элементам.
Особенности:
aria-hidden="true" не заменяет управление фокусом, но
дополняет его.aria-hidden к родителю элемента,
который содержит текущий фокус.Кнопка закрытия Featherlight (.featherlight-close-icon)
визуально представлена символом ×, который не имеет
семантического значения для вспомогательных технологий.
Корректная разметка:
<button class="featherlight-close-icon" aria-label="Закрыть диалог">
×
</button>
Требования:
<button>, а не
<span> или <a>.aria-label с
ясным действием.title как единственного источника доступного
имени.aria-liveЕсли содержимое lightbox загружается динамически (AJAX, подгрузка
изображений, смена слайдов), может потребоваться использование
aria-live.
Пример:
<div id="fl-content" aria-live="polite">
Рекомендации:
polite, если обновление не критично.assertive для медиа-контента и галерей.aria-live ко всему диалогу — только к
изменяемым областям.ARIA не заменяет нативную семантику. В Featherlight важно:
role="button" при
возможности использовать <button>.Для контейнеров, которые не должны получать фокус, следует явно исключать их:
<div class="featherlight-content" tabindex="-1">
Это позволяет программно переводить фокус внутрь диалога без добавления лишних элементов в таб-цепочку.
При наличии элементов управления внутри lightbox (табы, переключатели, галереи) необходимо отражать их состояние:
aria-expanded — для раскрывающихся
блоков.aria-selected — для активных элементов
в списках.aria-current — для текущего слайда или
шага.Пример для галереи:
<button aria-selected="true">1</button>
<button aria-selected="false">2</button>
Состояния должны обновляться синхронно с визуальными изменениями.
role="dialog" без управления фокусом.aria-hidden на
<body>.aria-label + текст).ARIA-атрибуты в Featherlight не являются декоративным дополнением. Они выполняют строго определённую функцию и должны применяться осознанно, с учётом жизненного цикла модального окна и взаимодействия с DOM.