Живые области: aria-live aria-atomic aria-relevant
Объявляйте асинхронные обновления вспомогательным технологиям
«Живые области: aria-live aria-atomic aria-relevant» — бесплатный урок HTML Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения HTML Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс HTML Academy содержит 4 уроков всего.
Что такое живые области?
Живая область — это раздел страницы, содержимое которого обновляется динамически. Программы чтения с экрана отслеживают живые области и автоматически объявляют изменения, не перемещая focus пользователя.
Создание живой области
Добавьте aria-live к элементу container:
<!-- Polite: announce when user is idle -->
<div aria-live="polite" id="notifications"></div>
<!-- Inject text to announce: -->
<script>
document.getElementById('notifications').textContent = '5 new messages';
// Screen reader announces: '5 new messages' when user pauses
</script>Итоги по значениям aria-live
Три уровня aria-live:
off— объявления отсутствуют (по умолчанию для неживых областей)polite— объявляет сообщение, когда пользователь делает паузу в речиassertive— объявляет сообщение немедленно, прерывая текущую речь
aria-atomic подробно
aria-atomic определяет, что объявляется при изменении содержимого:
<div aria-live="polite" aria-atomic="false"> <!-- default -->
Items in cart: <span id="count">3</span>
</div>
<!-- Only the changed span is announced: '4' -->
<div aria-live="polite" aria-atomic="true">
Items in cart: <span id="count">3</span>
</div>
<!-- The entire div is announced: 'Items in cart: 4' -->
<!-- aria-atomic="true" gives more context but is more verbose -->Значения aria-relevant
aria-relevant указывает, какие изменения DOM вызывают объявления:
<!-- Default: additions text -->
<div aria-live="polite" aria-relevant="additions text">
<!-- Announce removals too: -->
<div aria-live="polite" aria-relevant="removals">
<!-- Announce everything: -->
<div aria-live="polite" aria-relevant="all">
<!-- Values: additions, removals, text, all
'additions' = added nodes announced
'removals' = removed nodes announced
'text' = text content changes announced -->Предопределённые роли живых областей
Некоторые роли неявно устанавливают aria-live:
role="alert"— aria-live="assertive" + aria-atomic="true"role="status"— aria-live="polite" + aria-atomic="true"role="log"— aria-live="polite"role="timer"— aria-live="off"role="marquee"— aria-live="off"
Состояние загрузки с живой областью
Объявляйте о начале и завершении загрузки:
<div role="status" aria-live="polite" aria-atomic="true" id="load-status">
<!-- empty initially -->
</div>
<script>
async function loadData() {
document.getElementById('load-status').textContent = 'Loading...';
const data = await fetchData();
renderResults(data);
document.getElementById('load-status').textContent =
`${data.length} results loaded.`;
}
</script>Обратная связь при отправке формы
Живая область для состояния отправки формы:
<form id="contact-form" novalidate>
<input type="email" name="email">
<button type="submit">Subscribe</button>
</form>
<div role="status" aria-live="polite" id="form-status"></div>
<script>
form.addEventListener('submit', async (e) => {
e.preventDefault();
const status = document.getElementById('form-status');
status.textContent = 'Submitting...';
await submitForm(new FormData(form));
status.textContent = 'Thank you! You are now subscribed.';
});
</script>Количество результатов поиска
Динамически объявляйте результаты поиска:
<label for="search">Search</label>
<input type="search" id="search">
<div role="status" aria-live="polite" aria-atomic="true" id="results-count"></div>
<div id="results"></div>
<script>
let debounceTimer;
search.addEventListener('input', () => {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => {
const results = filterResults(search.value);
renderResults(results);
document.getElementById('results-count').textContent =
`${results.length} results for "${search.value}"`;
}, 300);
});
</script>Антишаблоны живых областей
Избегайте следующих ошибок при работе с живыми областями:
- Не создавайте и не удаляйте живые области — делайте их постоянными, с пустым начальным содержимым
- Не помещайте живые области внутрь областей с aria-hidden
- Не используйте assertive для обычных обновлений — это сильно мешает работе пользователя
- Не объявляйте обновления слишком часто (ограничивайте частоту обновления количества результатов поиска)
Тестирование живых областей
Как тестировать объявления живых областей:
- Включите VoiceOver (Mac: Cmd+F5) или NVDA (Windows: Ctrl+Alt+N)
- Вызовите обновление и прослушайте объявление
- Проверьте время: polite ждёт, assertive прерывает
- Убедитесь, что axe DevTools не сообщает о проблемах с живыми областями
Быстрая проверка
Какая роль неявно устанавливает aria-live assertive и aria-atomic true?
Итоги: живые области
Основы живых областей:
aria-live="polite"— ждёт паузы пользователяaria-live="assertive"— немедленно прерывает речьaria-atomic="true"— объявляет всю областьrole="alert"= assertive + atomic;role="status"= polite + atomic- Делайте живые области постоянными; сначала очищайте, затем устанавливайте содержимое
Часто задаваемые вопросы
Урок «Живые области: aria-live aria-atomic aria-relevant» бесплатный?
Да — полный текст урока «Живые области: aria-live aria-atomic aria-relevant» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс HTML Academy, подпишись на CoddyKit PRO. Курс HTML Academy содержит 4 уроков всего.
Чему я научусь в уроке «Живые области: aria-live aria-atomic aria-relevant»?
Объявляйте асинхронные обновления вспомогательным технологиям Ты практикуешь HTML Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать HTML Academy?
Предыдущий опыт не требуется. HTML Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Живые области: aria-live aria-atomic aria-relevant»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке HTML Academy?
Да. Каждый урок HTML Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- aria-expanded и aria-controls для переключателей
- aria-selected и шаблоны вкладок
- Живые области: aria-live aria-atomic aria-relevant
- Тестирование с экранными дикторами