Кратко
СкопированоРоль изменяющихся областей из WAI-ARIA. Делает область с логами изменяющейся или «живой» областью.
Логи — это отдельный документ или часть страницы, где выводятся данные или информация о действиях пользователей в определённой последовательности. Старая информация обычно скрывается по мере добавления новой.
Пример
Скопировано<h3>История сообщений</h3><div role="log"> <ul> <li> Одолжишь своего вельш-корги-кардигана до понедельника? Очень нужно. <time datetime="2077-04-21T12:09">12:09</time> </li> <li> Тебя снова взломали? <time datetime="2077-04-21T13:00">13:00</time> </li> </ul></div>
<h3>История сообщений</h3> <div role="log"> <ul> <li> Одолжишь своего вельш-корги-кардигана до понедельника? Очень нужно. <time datetime="2077-04-21T12:09">12:09</time> </li> <li> Тебя снова взломали? <time datetime="2077-04-21T13:00">13:00</time> </li> </ul> </div>
Как пишется
СкопированоДобавьте к элементу role
. Роль можно использовать для всех тегов и ARIA-ролей.
Подходящие ситуации для log
:
- чаты;
- логи с ошибками;
- история изменений документа;
- любые другие логи.
По умолчанию роли заданы свойство aria
и состояние aria
. Это значит, что скринридеры не сразу расскажут об изменениях внутри такой области.
Если это крайне важные изменения, задайте логам aria
. Делайте это с большой осторожностью, так как в этом случае скринридеры будут быстро зачитывать изменившееся содержимое и прерывать действия пользователей.
Когда нужно, чтобы пользователи узнали обо всех изменениях в логах, в том числе о старых записях, не обойтись без aria
.
Из-за значения polite
у aria
скринридеры будут зачитывать всё добавившееся содержимое. Это может сыграть против вас в чатах. Вспомогательные технологии будут читать не только сообщения от собеседников, но и те, которые отправил сам пользователь. Можно оставить всё как есть. В случае небольших чатов это не проблема. Например, если это чат с техподдержкой сервиса.
Чтобы улучшить опыт пользователей в длинных чатах как в мессенджерах, можно использовать трюк с удалением роли log
после отправки пользователем его сообщения на несколько секунд.
Давайте разберём log
на примере чата с Докой.
<div role="log" id="chat-log" tabindex="0"> <div> <p>Дока</p> <p> Привет, я Дока — дружелюбный справочник для фронтендеров на понятном языке 🐶 Давай дружить? </p> <time datetime="2023-09-18T14:00:00"> 14:00 </time> </div> <div> <p>Пользователь Доки</p> <!-- Текст сообщения и время отправки --> </div></div>
<div role="log" id="chat-log" tabindex="0"> <div> <p>Дока</p> <p> Привет, я Дока — дружелюбный справочник для фронтендеров на понятном языке 🐶 Давай дружить? </p> <time datetime="2023-09-18T14:00:00"> 14:00 </time> </div> <div> <p>Пользователь Доки</p> <!-- Текст сообщения и время отправки --> </div> </div>
Так как у контейнера с ролью есть свойство overflow
, добавим его в порядок фокуса с помощью tabindex
. Пользователи клавиатуры смогут прокрутить его стрелками.
Чтобы скринридеры не зачитывали сообщения, которые отправили читатели, удалим на секунду role
и вернём её после этого обратно. С этим поможет set
.
const chatLog = document.getElementById('chat-log')chatLog.removeAttribute('role')setTimeout(() => { chatLog.setAttribute('role', 'log')}, 100)
const chatLog = document.getElementById('chat-log') chatLog.removeAttribute('role') setTimeout(() => { chatLog.setAttribute('role', 'log') }, 100)
Элементам с role
можно задавать подписи. Для видимой подойдёт атрибут aria
, а для невидимой — aria
. Только помните, что хоть на практике и можно добавлять подписи ко всем элементам, спецификация не рекомендует подписывать <div>
, <span>
и другие неинтерактивные элементы.
Как понять
СкопированоИзменяющаяся область — это область страницы, в которой содержимое обновляется из-за внешних событий или действий пользователей. Благодаря изменяющимся областям вспомогательные технологии узнают об обновлениях на странице и автоматически рассказывают о них пользователям.