Кратко
СкопированоРоль изменяющихся областей из 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> и другие неинтерактивные элементы.
Как понять
СкопированоИзменяющаяся область — это область страницы, в которой содержимое обновляется из-за внешних событий или действий пользователей. Благодаря изменяющимся областям вспомогательные технологии узнают об обновлениях на странице и автоматически рассказывают о них пользователям.