KNOWLEDGE K2@WEB相談室
『WAI-ARIA活用の基本知識と一覧』について紹介
『WAI-ARIA活用の基本知識と一覧』について紹介
(2025.5.12)
私たちは「人」を中心にしたクリエイティブを企業アイデンティティとし、WEBアクセシビリティ対応をご支援しています。すべての人にとって心地よく使えるWEBサービスを目指し、豊かなユーザー体験でビジネスの可能性を広げ、誰もがつながる未来を創造します。
WAI-ARIAとは Web Accessibility Initiative – Accessible Rich Internet Applications の略で、スクリーンリーダーなどの支援技術に情報を正しく伝えるためのHTML属性(ARIA属性)の仕様です。通常のHTMLだけでは伝えきれない役割や状態を補うことで、WEBアプリや動的UIのアクセシビリティを向上させます。
このページでは、WEBアクセシビリティ対応に欠かせないARIA属性について、基本から実践的な使い方までを体系的にまとめたリファレンスです。スクリーンリーダー対応の限界や誤用例にも触れ、実務で迷わないための指針となる内容です。チーム内共有・教育用資料・実装時の確認リストとしても活用できます。
ARIAの基本属性は、画面に表示されないラベルや補足説明をスクリーンリーダーに伝えるために使われます。要素に意味や文脈を与える役割があり、アクセシブルなUIの基礎となる重要な属性群です。正しい用途の理解が不可欠です。
属性名 | 説明 | 主な使用ケース | 注意点 |
---|---|---|---|
aria-label |
画面に表示されないテキストラベルを提供 | アイコンボタン、リンク、カスタムUIなど
|
ラベルがUIに表示されない場合に限定 |
aria-labelledby |
他の要素のIDを参照してラベルを設定 | モーダル、フォーム、複数ラベルが必要な場合
|
ID指定が正しくないと読み上げ不可 |
aria-describedby |
補足説明のIDを指定し、読み上げに追加 | 入力フォームの説明文、補足の読み上げ
|
長すぎるテキストは避ける |
aria-hidden |
読み上げ対象から除外 | 視覚的装飾、読み上げ不要な要素
|
本文の重要情報を除外しないよう注意 |
ARIAロールは、要素の『役割』を明示的に指定するための属性で、スクリーンリーダーなどにその機能や目的を伝えます。カスタムUIでボタンやダイアログなどの意味を補完する際に使用され、HTMLの構造を補強する役割があります。
属性名 | 説明 | 使用例 |
---|---|---|
role="button" |
divやspanをボタンとして扱う | カスタムUIボタン |
role="dialog" |
モーダルダイアログを示す | ポップアップやダイアログウィンドウ |
role="navigation" |
ナビゲーション領域を示す | グローバルナビ、パンくずリストなど |
role="alert" |
重要な通知を即時読み上げ | エラーメッセージや緊急メッセージ |
ARIAの状態・プロパティ属性は、UI要素の『現在の状態』(展開中・選択中・無効など)をスクリーンリーダーに伝えるために使います。動的に変化するインターフェースの意味や挙動を補足し、ユーザーに正確な状況を伝える重要な属性群です。
属性名 | 説明 | 状態 | 例 |
---|---|---|---|
aria-expanded |
展開・折りたたみ状態 | true/false | アコーディオンメニューなど |
aria-checked |
チェック状態 | true/false/mixed | チェックボックス、トグルスイッチなど |
aria-disabled |
無効状態 | true/false | 非アクティブなボタン・入力項目 |
aria-selected |
選択状態を表す | true/false | タブ、リストの選択項目 |
『開閉状態』や『関連するパネル要素』をスクリーンリーダーに正しく伝えるために、ARIA属性を追加します。
要素 | 属性 | 用途 |
---|---|---|
開閉ボタン | aria-expanded | メニューの状態 [true(開)/false(閉)] |
開閉ボタン | aria-controls | 関連付けるコンテンツ領域のIDと一致させる |
コンテンツ領域 | id | ボタンのaria-controlsと一致させる |
<div id="groupA">
<button
aria-expanded="false" ←状態に応じfalse/trueをJavaScriptで変更
aria-controls="targetA" ←コンテンツを包括する要素のIDと同じにする
id="opnerBtn"
>
詳細を表示
</button>
<div id="targetA" hidden> ←状態に応じfalse/trueをJavaScriptで変更(デフォルトはtrue)
<p>この部分が開閉されるコンテンツです。</p>
</div>
</div>
const opnerBtn = document.getElementById('opnerBtn');
const targetA = document.getElementById('targetA');
opnerBtn.addEventListener('click', () => {
const expanded = opnerBtn.getAttribute('aria-expanded') === 'true';
opnerBtn.setAttribute('aria-expanded', String(!expanded)); ←ボタンの属性値を状態に応じfalse/trueに
targetA.hidden = expanded;←ボタンに合わせてfalse/trueに
});
タブメニューは『タブ』『対応するパネル』『選択状態』などを正しくスクリーンリーダーに伝える必要があります。ARIA属性で関係性と状態を明示します。
要素 | 属性 | 用途 |
---|---|---|
タブリスト | role="tablist" | タブを囲む要素(親要素)を示す |
各タブ | role="tab" | タブボタンと識別させる |
各タブ | aria-selected | 選択中のタブに true、それ以外は false |
各タブ | aria-controls | 紐づくパネルのIDを指定 |
各タブ | id | 紐づくパネルの aria-labelledby と一致させる |
各パネル | role="tabpanel" | コンテンツ領域と識別させる |
各パネル | aria-labelledby | 紐づくタブのIDを指定 |
各パネル | id | 紐づくタブの aria-controls と一致させる |
<nav role="tablist">
<button id="tabA" role="tab" aria-selected="true" aria-controls="panelA">タブA</button>
<button id="tabB" role="tab" aria-selected="false" aria-controls="panelB">タブB</button>
</nav>
<div id="panelA" role="tabpanel" aria-labelledby="tabA">
<p>タブAのコンテンツです。</p>
</div>
<div id="panelB" role="tabpanel" aria-labelledby="tabB" hidden>
<p>タブBのコンテンツです。</p>
</div>
const tabs = document.querySelectorAll('[role="tab"]');
const panels = document.querySelectorAll('[role="tabpanel"]');
tabs.forEach(tab => {
tab.addEventListener('click', () => {
// タブの選択状態を更新
tabs.forEach(t => t.setAttribute('aria-selected', 'false')); ←タブボタンを全てfalse
tab.setAttribute('aria-selected', 'true'); ←対象のタブボタンのみtrue
// 対応するパネルの表示制御
panels.forEach(panel => panel.hidden = true); ←コンテンツを全て非表示
const panelId = tab.getAttribute('aria-controls');
document.getElementById(panelId).hidden = false; ←対象のコンテンツのみ表示
});
});
モバイルなどで使われる開閉式ナビゲーション(ハンバーガーメニュー)では、『メニューの開閉状態』や『ナビゲーションの関連性』をスクリーンリーダーに正しく伝えることが重要です。
要素 | 属性 | 用途 |
---|---|---|
開閉ボタン | aria-expanded | メニューの状態 [true(開)/false(閉)] |
開閉ボタン | aria-controls | 操作対象のナビゲーションエリアのIDを指定 |
開閉ボタン | aria-label | アイコンボタンの際、内容をテキストで明示 |
ナビゲーションエリア | id | ボタンのaria-controlsと一致させる |
ナビゲーションエリア | role="navigation" | ナビゲーション領域として指定 |
<button
id="menuBtn"
aria-controls="mainNav" ←ナビゲーションを包括する要素のIDと同じにする
aria-expanded="false" ←状態に応じfalse/trueをJavaScriptで変更
aria-label="メニューを開く"
>
☰
</button>
<nav id="mainNav" role="navigation" hidden> ←状態に応じfalse/trueをJavaScriptで変更(デフォルトはtrue)
<ul>
<li><a href="#">トップページ</a></li>
<li><a href="#">サービス</a></li>
<li><a href="#">お問い合わせ</a></li>
</ul>
</nav>
const menuBtn = document.getElementById('menuBtn');
const mainNav = document.getElementById('mainNav');
menuBtn.addEventListener('click', () => {
const expanded = menuBtn.getAttribute('aria-expanded') === 'true';
menuBtn.setAttribute('aria-expanded', String(!expanded)); ←ボタンの属性値を状態に応じfalse/trueに
mainNav.hidden = expanded; ←対象のコンテンツのみ表示
});
モーダルは、背景から独立して「現在の操作に集中させる」UIであり、スクリーンリーダーにも明確に伝える必要があります。ARIA属性を用いて、ダイアログであること・タイトル・内容・閉じる操作を明示します。
要素 | 属性 | 用途 |
---|---|---|
モーダル | role="dialog" | スクリーンリーダーに「ダイアログ」と伝える |
モーダル | aria-modal="true" | モーダルが現在の操作の中心であると示す |
モーダル | aria-labelledby | モーダルのタイトル(見出し)のIDを参照 |
モーダル | aria-describedby | モーダル本文の説明領域のIDを参照 |
<button id="openModal">モーダルを開く</button>
<div
id="modal"
role="dialog"
aria-modal="true"
aria-labelledby="modalTitle" ←モーダルの見出しIDと同じにする
aria-describedby="modalDesc" ←モーダルのコンテンツを包括する要素のIDと同じにする
hidden ←状態に応じfalse/trueをJavaScriptで変更(デフォルトはtrue)
>
<h2 id="modalTitle">お知らせ</h2>
<p id="modalDesc">これはモーダルウィンドウの例です。</p>
<button id="closeModal">閉じる</button>
</div>
const openBtn = document.getElementById('openModal');
const closeBtn = document.getElementById('closeModal');
const modal = document.getElementById('modal');
openBtn.addEventListener('click', () => {
modal.hidden = false;
modal.focus(); // モーダルにフォーカス
});
closeBtn.addEventListener('click', () => {
modal.hidden = true;
openBtn.focus(); // 元のボタンにフォーカスを戻す
});
以下は『どんな目的でARIA属性を使いたいか』に応じた逆引きリストです。用途から必要な属性を探す際の参考にしてください。
目的 | 属性と使用例 |
---|---|
視覚に表示されないラベルを読み上げたい | aria-label
アイコンボタン、カスタムUI |
既存要素の内容をラベルにしたい | aria-labelledby
モーダルのタイトル、複数要素を1つのラベルに |
補足情報や説明文を読み上げさせたい | aria-describedby
入力欄の説明文、エラーメッセージ |
読み上げさせたくない要素を除外したい | aria-hidden
装飾アイコン、視覚だけで意味が伝わる記号など |
divやspanをボタンやリンクのように扱いたい | role
JavaScript制御のカスタムUI(button, link など) |
要素の状態(開閉・選択・有効など)を伝えたい | aria-expanded , aria-checked , aria-disabled など
アコーディオン、チェックボックス、トグル |
通知やアラートを即座に読み上げさせたい |
role="alert" , aria-live
フォーム送信後のエラー、リアルタイム更新 |
ARIA(Accessible Rich Internet Applications)を利用する際は、便利である一方で誤用するとアクセシビリティを損ねる危険性もあります。以下に、実務で特に重要な注意点を詳しく解説します。
HTMLにはアクセシビリティ対応されたタグが用意されているので、ARIAは『代替手段』であり『第一選択肢』ではありません。
例:<button>, <a>, <form>, <label>など
これらの標準的なHTML要素は、ブラウザ・スクリーンリーダーにとって意味が理解されやすいです。
NG例:
<div role="button" onclick="hogehoge()">OK</div> <!-- → <button> を使うのが正解 -->
OK例:
<button onclick="hogehoge()">OK</button>
属性名 | 主な用途 |
---|---|
aria-label | ラベルを明示(視覚的には表示されない) |
aria-labelledby | 別要素の内容をラベルとして関連付ける |
aria-describedby | 補足説明やヒントを関連付ける |
よくある誤用例:
スクリーンリーダーはOSやブラウザ、アプリの仕様に依存するため、ARIA属性が意図通りに読み上げられない場合があります。正しく実装しても全ての環境で一貫した体験を保証できるわけではなく、実機検証とシンプルな構造設計が重要です。
仕様どおりに動かないケース:
このような環境差を踏まえ、過信せず、重要な情報はできるだけ明示的なHTMLと文言で補完するのがベストです。
また、同じARIA属性でもVoiceOverでは読み上げられても、NVDAでは無視されるなど、動作の一貫性は保証されません。
ARIA属性は、HTMLだけでは伝わりにくいUIの意味や状態を補足し、支援技術に正確な情報を提供する重要な手段です。本リファレンスでは『基本属性』『ロール』『状態・プロパティ』を中心に、実装時に迷いやすいポイントや使用例を整理しました。
ARIAは便利な反面、誤用するとアクセシビリティを損ねる危険性もあります。HTMLの構造を優先し、正しい属性選びと実機検証を重視することが大切です。このページがチーム内共有や日々のコーディングの指針となれば幸いです。
私たちは、WEBサービスのアクセシビリティ対応のご相談はもちろん、御社のWEB戦略パートナーとしてお役に立てるご支援をしています。いつでもお気軽にお問い合わせください。
※本情報はページ公開時のものです。情報は常に更新され掲載内容と異なる場合がございます。
私たちは「人」を中心にしたクリエイティブを企業アイデンティティとし、WEBアクセシビリティ対応をご支援しています。すべての人にとって心地よく使えるWEBサービスを目指し、豊かなユーザー体験でビジネスの可能性を広げ、誰もがつながる未来を創造します。
是非、私たちにお悩みご相談ください!
創業から16年の営業活動で得たノウハウを基に、WEBサイトの戦略・制作・運用を三位一体として仕組化することで、お客様のコミュニケーション課題を解決いたします。