Floating элементы — это интерактивные элементы интерфейса, которые визуально “всплывают” над основным содержимым страницы: всплывающие подсказки (tooltips), контекстные меню, модальные окна, dropdown-меню и popovers. Для обеспечения доступности таких элементов крайне важно корректно использовать ARIA атрибуты, чтобы технологии вспомогательного доступа могли правильно интерпретировать состояние и поведение элемента.
role в
floating элементахrole задаёт семантическую роль элемента
в документе, что позволяет скринридерам и другим вспомогательным
технологиям правильно распознавать его назначение.
tooltip — используется для
подсказок, которые появляются при наведении или фокусе на элементе.
Пример:
<button id="btn">Кнопка</button>
<div role="tooltip" id="tooltip">Подсказка</div>
Для связи кнопки и подсказки используется атрибут
aria-describedby.
menu и
menuitem — применяются для dropdown и
контекстных меню.
<ul role="menu" id="menu">
<li role="menuitem">Пункт 1</li>
<li role="menuitem">Пункт 2</li>
</ul>dialog — для модальных окон,
popovers с интерактивным контентом.
aria для управления состояниемARIA предоставляет атрибуты, которые сообщают вспомогательным технологиям о текущем состоянии элемента:
aria-expanded — указывает, открыт
ли всплывающий элемент.
<button aria-expanded="false" aria-controls="dropdown">Меню</button>
<ul id="dropdown" role="menu" hidden>
<li role="menuitem">Пункт 1</li>
</ul>
При открытии меню aria-expanded меняется на
"true".
aria-hidden — скрывает элементы от
скринридеров. Часто используется для floating элементов, которые
визуально скрыты:
<div role="tooltip" aria-hidden="true">Подсказка</div>aria-describedby — связывает
управляющий элемент с описанием или подсказкой:
<button aria-describedby="tooltip">Кнопка</button>
<div role="tooltip" id="tooltip">Описание кнопки</div>aria-labelledby — связывает элемент
с заголовком, обычно для диалогов:
<div role="dialog" aria-labelledby="dialogTitle">
<h2 id="dialogTitle">Заголовок окна</h2>
</div>aria-activedescendant — указывает
на активный элемент внутри контейнера, полезно для клавиатурной
навигации в меню или списках.
Floating элементы редко существуют сами по себе — они привязаны к управляющему элементу (кнопка, поле ввода). Ключевые ARIA атрибуты для этой связи:
aria-controls — указывает на
элемент, которым управляет управляющий элемент.
<button aria-controls="menu" aria-expanded="false">Открыть меню</button>
<ul id="menu" role="menu" hidden>...</ul>aria-describedby — для подсказок и
пояснений, показываемых рядом с элементом.
aria-labelledby — если floating
элемент имеет собственный заголовок, полезно связать его с
контейнером.
Библиотека Floating UI предоставляет инструменты для точного позиционирования floating элементов, но для доступности необходимо управлять атрибутами ARIA вручную или через встроенные утилиты.
Пример tooltip с Floating UI и ARIA:
import {computePosition, offset, flip} from '@floating-ui/dom';
const button = document.querySelector('#btn');
const tooltip = document.querySelector('#tooltip');
button.addEventListener('mouseenter', () => {
tooltip.setAttribute('aria-hidden', 'false');
computePosition(button, tooltip, {
middleware: [offset(5), flip()]
}).then(({x, y}) => {
Object.assign(tooltip.style, {
left: `${x}px`,
top: `${y}px`
});
});
});
button.addEventListener('mouseleave', () => {
tooltip.setAttribute('aria-hidden', 'true');
});
В этом примере:
aria-hidden управляет видимостью подсказки для
скринридеров.computePosition отвечает за точное позиционирование над
кнопкой.aria-expanded или aria-hidden.role,
соответствующий типу floating элемента.aria-expanded для
элементов, которые открываются/закрываются.aria-controls и
aria-describedby.role="dialog" с
aria-labelledby и опционально
aria-describedby для пояснений.Для меню и списков важно использовать:
aria-activedescendant для указания текущего выбранного
элемента.aria-selected на
активном элементе.Правильная интеграция ARIA с floating элементами делает интерфейс доступным для всех пользователей, обеспечивая предсказуемое и корректное поведение для технологий вспомогательного доступа.