Popper.js предоставляет мощный и гибкий механизм позиционирования всплывающих элементов, таких как тултипы, всплывающие меню и подсказки. При создании доступных интерфейсов важно учитывать работу с экранными читалками (screen readers), чтобы пользователи с нарушениями зрения могли корректно воспринимать контент.
ARIA-атрибуты являются ключевым инструментом для интеграции Popper.js с экранными читалками. Для всплывающих элементов необходимо:
aria-describedby или
aria-labelledby для связывания целевого элемента с тултипом
или подсказкой.role="tooltip" для всплывающих элементов,
чтобы экранные читалки распознавали их назначение.Пример связывания кнопки с тултипом:
<button id="saveBtn" aria-describedby="tooltip1">Сохранить</button>
<div id="tooltip1" role="tooltip">
Сохранить текущие изменения
</div>
import { createPopper } from '@popperjs/core';
const button = document.querySelector('#saveBtn');
const tooltip = document.querySelector('#tooltip1');
createPopper(button, tooltip, {
placement: 'top',
modifiers: [
{
name: 'offset',
options: {
offset: [0, 8],
},
},
],
});
В этом примере Popper.js отвечает за точное позиционирование тултипа,
а экранная читалка получает контент сразу благодаря
aria-describedby.
Если содержимое тултипа изменяется динамически (например, статус
операции), важно уведомлять экранные читалки о обновлении. Для этого
используют атрибут aria-live:
<div id="tooltip1" role="tooltip" aria-live="polite">
Подготовка...
</div>
Popper.js не управляет содержимым, но позиционирует элемент.
Обновление текста в тултипе автоматически будет озвучено читалкой
благодаря aria-live="polite" или "assertive" в
зависимости от важности информации.
Для всплывающих элементов с интерактивным контентом (например, меню, выпадающие списки) важно корректно управлять фокусом:
tabindex="-1" для Popper-элемента и вручную устанавливать
фокус при открытии.Пример управления фокусом:
const popperInstance = createPopper(button, tooltip, {
placement: 'bottom',
});
button.addEventListener('click', () => {
tooltip.style.display = 'block';
tooltip.setAttribute('tabindex', '-1');
tooltip.focus();
});
tooltip.addEventListener('blur', () => {
tooltip.style.display = 'none';
button.focus();
});
Иногда требуется визуально скрыть элемент, оставив его доступным для
читалок. Для этого используют класс sr-only или аналогичные
техники с CSS:
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
white-space: nowrap;
border: 0;
}
Это полезно для элементов, которые Popper.js позиционирует, но которые не должны быть видимыми на экране.
Некоторые модификаторы Popper.js могут влиять на доступность, если они меняют размеры или порядок отображения:
position: absolute или fixed не влияет на
ARIA, но обеспечивает правильное расположение на экране.Для проверки совместимости Popper.js с читалками следует использовать:
aria-live или через фокус.aria-describedby или aria-labelledby.role="tooltip" и при необходимости
aria-live для динамического контента.Popper.js предоставляет гибкие инструменты позиционирования, а соблюдение ARIA-стандартов гарантирует, что всплывающие элементы будут полностью доступны пользователям с ограничениями по зрению.