Popper.js — это мощная библиотека для управления позиционированием всплывающих элементов, таких как тултипы, поповеры, дропдауны. Важно, чтобы такие элементы были доступны для пользователей с ограниченными возможностями, и для этого используются ARIA (Accessible Rich Internet Applications) атрибуты. В Popper.js поддержка ARIA осуществляется через настройку и синхронизацию с целевыми элементами и самим поппером.
aria-describedby Привязывает
элемент-триггер к элементу, который описывает его содержание, обычно это
тултип или подсказка. Пример:
<button id="btn" aria-describedby="tooltip">Кнопка</button>
<div id="tooltip" role="tooltip">Это подсказка</div>
В Popper.js достаточно передать ссылку на элемент-поппер, чтобы
aria-describedby корректно указывал на него.
role="tooltip" Указывает, что
элемент является тултипом. ARIA role помогает скринридерам распознавать
тип элемента. Без этого роли подсказки будут игнорироваться. Popper.js
автоматически не добавляет role, но часто используется вместе с
кастомными модификаторами:
const popperInstance = Popper.createPopper(reference, popper, {
modifiers: [{
name: 'applyAria',
enabled: true,
fn({ state }) {
state.elements.popper.setAttribute('role', 'tooltip');
state.elements.reference.setAttribute('aria-describedby', state.elements.popper.id);
}
}]
});aria-hidden Управляет видимостью
элемента для скринридеров. Когда тултип скрыт, его нужно пометить
aria-hidden="true". При показе — менять на
false:
function showTooltip() {
tooltip.setAttribute('aria-hidden', 'false');
popperInstance.update();
}
function hideTooltip() {
tooltip.setAttribute('aria-hidden', 'true');
}Popper.js использует модификаторы, которые позволяют
вмешиваться в процесс позиционирования и взаимодействия. Для ARIA часто
создают кастомный модификатор ariaAttributes:
const ariaModifier = {
name: 'ariaAttributes',
enabled: true,
phase: 'write',
fn({ state }) {
const { reference, popper } = state.elements;
popper.setAttribute('role', 'tooltip');
reference.setAttribute('aria-describedby', popper.id);
}
};
const popperInstance = Popper.createPopper(reference, popper, {
modifiers: [ariaModifier]
});
Ключевые моменты:
phase: 'write' — модификатор срабатывает после расчета
позиции и может изменять DOM.state.elements.popper.id — важно, чтобы поппер имел
уникальный ID для связи с aria-describedby.Чтобы тултип оставался доступным, даже когда его нет на экране, используют динамическое управление ARIA:
Показ тултипа:
tooltip.setAttribute('aria-hidden', 'false');Скрытие тултипа:
tooltip.setAttribute('aria-hidden', 'true');Иногда комбинируют с классами для анимации или с
display: none, но следует помнить, что
display: none полностью скрывает элемент от скринридеров,
поэтому атрибут aria-hidden предпочтительнее для контроля
доступности.
Для дропдаунов и поповеров с несколькими уровнями элементов ARIA расширяется:
aria-haspopup — указывает на
наличие всплывающего меню.
<button aria-haspopup="true" aria-expanded="false">Меню</button>aria-expanded — отражает состояние
открыто/закрыто.
button.setAttribute('aria-expanded', 'true'); // при открытии
button.setAttribute('aria-expanded', 'false'); // при закрытииrole="menu" и
role="menuitem" — для элементов внутри меню.
<ul role="menu">
<li role="menuitem">Пункт 1</li>
<li role="menuitem">Пункт 2</li>
</ul>Popper.js может быть использован для управления позиционированием этих элементов, а ARIA атрибуты обеспечивают их корректное восприятие скринридерами.
id элементу поппера.aria-describedby и
role="tooltip" для тултипов.aria-hidden динамически при
показе/скрытии.aria-haspopup,
aria-expanded и правильные роли элементов.Эти практики обеспечивают совместимость с доступными технологиями и делают интерфейс полностью управляемым через Popper.js с точки зрения доступности.