実践Webアクセシビリティ

動的なコンテンツをアクセシブルにする:ARIAライブリージョンの使い方

Tags: Webアクセシビリティ, ARIA, ライブリージョン, JavaScript

はじめに

近年のWebサイト開発では、ページの再読み込みなしにコンテンツが動的に更新されるシングルページアプリケーション(SPA)や、非同期通信による部分的なコンテンツ更新が一般的となっています。チャットメッセージの受信、フォーム送信結果の表示、検索結果のフィルタリングなどがその例です。

しかし、このような動的なコンテンツの変更は、視覚的な変化としては認識できても、スクリーンリーダーなどの支援技術を利用しているユーザーにはその変化が伝わりにくく、情報を見落としてしまう可能性があります。特に、ユーザーの操作とは直接関係なくバックグラウンドで更新される通知などは、見過ごされやすい典型的な例です。

このような課題を解決し、動的なコンテンツの更新を支援技術利用者に適切に伝えるために有効なのが、WAI-ARIAが提供する「ライブリージョン」の概念と関連属性です。

なぜARIAライブリージョンが必要か

視覚障碍のあるユーザーや、認知特性により画面上の変化に気づきにくいユーザーにとって、コンテンツの自動的な更新は重要な情報を見落とす原因となります。スクリーンリーダーは、基本的にユーザーが操作している要素やフォーカスがある場所を中心に情報を読み上げます。ユーザーが意識していない、画面の他の場所で発生した内容の変更は、特に設定がない限り自動的に読み上げられません。

ARIAライブリージョンを設定した要素は、その内容が更新された際に、スクリーンリーダーが自動的にその変更を検知し、ユーザーに通知または読み上げを行います。これにより、ユーザーは画面全体の再読み込みを待つことなく、リアルタイムで重要な情報を受け取ることができます。これは、WCAG 2.1/2.2の達成基準4.1.2「名前、役割、値」など、状態やプロパティの変化をプログラムが解釈できるようにすることに関連します。

ARIAライブリージョンとは

ARIAライブリージョンとは、その領域内のコンテンツが動的に更新された際に、支援技術(主にスクリーンリーダー)にその変更を自動的に読み上げるよう指示するための仕組みです。これはHTML要素にaria-live属性を付与することで実現します。

aria-live属性には主に以下の2つの値があります。

通常はpoliteを使用することが推奨されます。assertiveの使用は、本当に重要な、即時的な通知が必要な場合に限定すべきです。assertiveを多用すると、ユーザーは頻繁に作業を中断され、かえって使い勝手が悪化する可能性があります。

また、ライブリージョンには関連する属性としてaria-atomicaria-relevantがあります。

具体的な実装方法

1. 基本的な使い方 (aria-live="polite")

まず、通知を表示するためのHTML要素を用意し、aria-live="polite"属性を付与します。role="status"も併せて使用することが一般的です。これはライブリージョンの一種であり、一部の支援技術で追加のセマンティクスを提供する可能性があります。

<div id="notification-area" role="status" aria-live="polite">
  <!-- 通知メッセージはここにJavaScriptで挿入されます -->
</div>

次に、JavaScriptでこの要素の内容を更新します。

const notificationArea = document.getElementById('notification-area');

// 通知を表示する関数
function showNotification(message) {
  notificationArea.textContent = message;
}

// 例: 何らかの操作後に通知を表示
// setTimeout(() => {
//   showNotification('設定が保存されました。');
// }, 2000);

このコードにより、notificationArea要素のtextContentが更新されると、スクリーンリーダーは現在の読み上げが終わり次第、「設定が保存されました。」と読み上げます。

2. aria-atomic="true" の活用

通知メッセージ全体を一貫して読み上げたい場合、特に複数の部分が同時に更新される可能性がある場合は、aria-atomic="true"を設定します。

<div id="notification-area-atomic" role="status" aria-live="polite" aria-atomic="true">
  <!-- 通知メッセージはここにJavaScriptで挿入されます -->
</div>
const notificationAreaAtomic = document.getElementById('notification-area-atomic');

function showAtomicNotification(message) {
  notificationAreaAtomic.textContent = message;
  // または innerHTML で複雑な内容を更新する場合
  // notificationAreaAtomic.innerHTML = `<strong>成功:</strong> ${message}`;
}

// 例: 原子的にメッセージを更新
// setTimeout(() => {
//   showAtomicNotification('ユーザーデータが正常に同期されました。');
// }, 2000);

aria-atomic="true"を設定すると、notificationAreaAtomic内の内容が少しでも変更された場合、領域内のコンテンツ全体が一度に読み上げられます。

3. 緊急性の高い通知 (aria-live="assertive")

エラーメッセージなど、ユーザーに即座に伝えたい情報にはaria-live="assertive"を使用します。role="alert"も併せて使用すると、セマンティクスがより明確になります。role="alert"は暗黙的にaria-live="assertive"aria-atomic="true"を持つため、通常はrole="alert"のみを設定すれば十分です。

<div id="error-message-area" role="alert">
  <!-- エラーメッセージはここにJavaScriptで挿入されます -->
</div>
const errorMessageArea = document.getElementById('error-message-area');

function showErrorMessage(message) {
  errorMessageArea.textContent = message;
}

// 例: フォーム送信失敗時にエラーメッセージを表示
// function handleSubmit(event) {
//   // ... バリデーションや送信処理 ...
//   if (submissionFailed) {
//     showErrorMessage('ユーザー名の入力形式に誤りがあります。');
//   }
// }

role="alert"(またはaria-live="assertive")を設定した要素の内容が更新されると、スクリーンリーダーは現在の読み上げを中断して直ちにその内容を読み上げます。

実装時の注意点

テスト方法

実装したライブリージョンのアクセシビリティは、実際に支援技術を使って確認することが最も重要です。

  1. スクリーンリーダーでの確認:
    • ご使用のOSに搭載されているスクリーンリーダー(Windows: Narrator, macOS: VoiceOver)や、広く使われているスクリーンリーダー(NVDA, JAWSなど)を起動します。
    • ライブリージョンの内容が更新される操作を行います(例: ボタンクリックで通知表示、フォーム送信、非同期通信完了など)。
    • コンテンツが更新された際に、意図した通りにメッセージが読み上げられるか、読み上げのタイミング(politeassertiveか)が適切かを確認します。
    • aria-atomic="true"の効果を確認するために、領域内の一部だけを更新するようなシナリオがあれば試してみます。
  2. 開発者ツールでの確認:
    • ブラウザの開発者ツールを開き、要素のインスペクターでライブリージョン要素にaria-live属性などが正しく付与されているかを確認します。
    • 一部のブラウザ開発者ツールには、アクセシビリティツリーを表示する機能があります。そこで、ライブリージョンがどのように認識されているかを確認できます。
  3. 自動評価ツールの補助的な利用:
    • Lighthouse, Axe devTools, WAVEなどの自動評価ツールは、aria-live属性の基本的な存在や正しい値の指定といった静的なマークアップのチェックに役立ちますが、内容が更新された際の動的な読み上げ動作そのものを完璧にテストすることはできません。あくまで補助的なツールとして活用してください。

まとめ

ARIAライブリージョンは、動的なコンテンツの更新をスクリーンリーダーユーザーを含む支援技術利用者に適切に伝えるための強力なツールです。aria-live属性(特にpoliteassertive)やaria-atomic属性を適切に使用することで、ユーザーはWebサイトの状態変化をリアルタイムに把握し、スムーズに操作を続けることができます。

実装にあたっては、politeを基本とし、緊急性の高い情報にのみassertiveを使用すること、不要なライブリージョンを避けること、そして必ず実際にスクリーンリーダーを使ってテストを行うことが重要です。

この記事が、あなたのWebサイトにおける動的なコンテンツのアクセシビリティ向上の一助となれば幸いです。