0Pricing
HTML Academy · Урок

Живые области: 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 — локальная установка не требуется.

Все уроки этого курса

  1. aria-expanded и aria-controls для переключателей
  2. aria-selected и шаблоны вкладок
  3. Живые области: aria-live aria-atomic aria-relevant
  4. Тестирование с экранными дикторами
← Назад к HTML Academy