В Popper.js управление поведением всплывающих элементов, таких как
тултипы, поповеры и модальные окна, тесно связано с
ARIA-атрибутами, среди которых ключевое место занимает
атрибут role. Этот атрибут используется для обеспечения
доступности (accessibility) и правильной семантики элементов в DOM.
role для Popper.jsPopper.js не накладывает ограничения на конкретные
значения role, однако чаще всего применяются следующие:
tooltip Атрибут
role="tooltip" используется для всплывающих подсказок.
Важно, чтобы элемент с этим атрибутом был связан с целевым элементом
через aria-describedby. Пример:<button id="btn">Нажми меня</button>
<div id="tooltip" role="tooltip">
Это всплывающая подсказка
</div>
import { createPopper } from '@popperjs/core';
const button = document.querySelector('#btn');
const tooltip = document.querySelector('#tooltip');
createPopper(button, tooltip, {
placement: 'top',
});
button.setAttribute('aria-describedby', 'tooltip');
Особенности:
role="tooltip" должен быть полностью скрыт до
момента активации (display: none или
visibility: hidden).role отвечает именно за доступность.menu и menuitem Для
контекстных меню или выпадающих списков часто используются
role="menu" для контейнера и role="menuitem"
для отдельных элементов:<button id="menuBtn">Меню</button>
<ul id="menu" role="menu">
<li role="menuitem">Элемент 1</li>
<li role="menuitem">Элемент 2</li>
</ul>
createPopper(document.querySelector('#menuBtn'), document.querySelector('#menu'), {
placement: 'bottom-start',
});
Особенности:
role="menu" должен управлять фокусом при
открытии.dialog Для модальных окон используется
role="dialog". Это особенно важно при создании кастомных
диалогов:<div id="modal" role="dialog" aria-modal="true" aria-labelledby="modalTitle">
<h2 id="modalTitle">Заголовок окна</h2>
<p>Содержимое модального окна</p>
</div>
createPopper(document.body, document.querySelector('#modal'), {
placement: 'center',
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport',
},
},
],
});
Особенности:
aria-modal="true" указывает на модальное
поведение.role с
модификаторами Popper.jsPopper.js предоставляет систему модификаторов
(modifiers), которые позволяют динамически адаптировать
поведение всплывающих элементов. Некоторые модификаторы напрямую
взаимодействуют с семантикой role:
offset – обеспечивает смещение
всплывающего элемента, полезно для корректного отображения
тултипов.flip – автоматически меняет
расположение элемента при недостатке места, не нарушая при этом
доступности.preventOverflow – гарантирует, что
элемент с любым role не выйдет за пределы контейнера или
viewport.Пример модификаторов для тултипа:
createPopper(button, tooltip, {
placement: 'top',
modifiers: [
{ name: 'offset', options: { offset: [0, 8] } },
{ name: 'flip', options: { fallbackPlacements: ['bottom', 'right', 'left'] } },
{ name: 'preventOverflow', options: { padding: 8 } },
],
});
roleВ сложных интерфейсах один и тот же Popper элемент может менять
назначение: иногда это тултип, иногда — меню или кастомный виджет. В
таких случаях role необходимо изменять динамически:
function setRole(element, newRole) {
element.setAttribute('role', newRole);
}
setRole(tooltip, 'menu'); // Меняем роль с tooltip на menu
Важно: при изменении role также нужно
обновлять соответствующие ARIA-атрибуты (aria-describedby,
aria-labelledby, aria-haspopup,
aria-expanded), иначе доступность нарушается.
role, соответствующий типу
всплывающего элемента.role вместе с ARIA-атрибутами для полной
доступности.role с помощью
инструментов accessibility audit, таких как Lighthouse или axe.Эффективное применение role атрибутов в сочетании с
Popper.js позволяет создавать интерактивные, адаптивные и доступные
интерфейсы, сохраняя семантическую чистоту HTML и обеспечивая корректное
взаимодействие с вспомогательными технологиями.