WCAG 2.1 チェックリスト:実装者向け具体例集
アクセシビリティの現状と重要性
Web アクセシビリティ(a11y)はもはや「あったらいい」ではなく「必須」です。WCAG 2.1(Web Content Accessibility Guidelines 2.1)は、世界中で採用されているアクセシビリティ基準で、日本でも行政サイト・公共施設の Web サイトでは WCAG 2.1 AA レベルへの準拠が求められています。
しかし「WCAG に準拠すべき」と言われても、何から始めたら良いのか分からないという開発者も多いでしょう。
今回は、WCAG 2.1 の主要項目を「実装者向けチェックリスト」として、具体的なコード例とともにまとめておきたいと思います。
WCAG 2.1 の階層構造
WCAG 2.1 には 3 つの準拠レベルがあります:
| レベル | 説明 | 推奨される用途 |
| A | 基本的なアクセシビリティ要件 | 最小限の対応 |
| AA | より広いユーザーをサポート | 一般的な企業サイト、公共機関 |
| AAA | 最高レベルのアクセシビリティ | 医療・教育機関など |
日本の多くの企業では「AA レベル」を目指すことが一般的です。
実装チェックリスト 1:色コントラスト
基準:AA レベル 4.5:1、AAA レベル 7:1
色覚障害やロービジョンのユーザーのために、テキストと背景の色コントラスト比を確保します。
❌ ダメな例:
<p style="color: #999999; background-color: #ffffff;">
薄いグレーテキスト(コントラスト比 5.4:1)
</p>
✅ 良い例:
<p style="color: #333333; background-color: #ffffff;">
濃いグレーテキスト(コントラスト比 12.6:1、AA/AAA両対応)
</p>
チェック方法: WebAIM Contrast Checker(https://webaim.org/resources/contrastchecker/)で確認できます。
実装チェックリスト 2:キーボード操作対応
基準:すべてのインタラクティブ要素が Tab キーで到達可能
マウスが使えないユーザーのために、Tab キーですべてのボタン・リンク・フォーム要素に到達できることが必須です。
❌ ダメな例(div をボタンに):
<div onclick="handleClick()">
クリック
</div>
✅ 良い例(button 要素を使う):
<button onclick="handleClick()">
クリック
</button>
タブ順序を制御する場合:
<!-- tabindex="0" で Tab キーの対象に含める -->
<div tabindex="0" role="button">カスタムボタン</div>
<!-- tabindex="-1" で Tab キーから外す -->
<div tabindex="-1">プログラムからのみアクセス</div>
実装チェックリスト 3:スクリーンリーダー対応(ARIA)
基準:screen reader で正確に情報が伝わる
スクリーンリーダー(音声読み上げソフト)を使うユーザーのために、HTML の意味を正確に伝える必要があります。
❌ ダメな例(意味が分からない):
<div>
<div>買い物かごに追加</div>
<div>5個入り</div>
<div>1,980 円</div>
</div>
✅ 良い例(見出しと構造を明確に):
<article>
<h2>商品名</h2>
<p>内容量:5個入り</p>
<p>価格:1,980 円</p>
<button aria-label="買い物かごに追加">追加</button>
</article>
ARIA ラベルの種類:
<!-- aria-label:要素の用途を説明 -->
<button aria-label="ナビゲーションメニューを開く">☰</button>
<!-- aria-labelledby:別の要素でラベル付け -->
<h2 id="dialog-title">ユーザー設定</h2>
<div role="dialog" aria-labelledby="dialog-title">...</div>
<!-- aria-describedby:詳細説明を追加 -->
<input type="password" aria-describedby="pwd-hint">
<p id="pwd-hint">8文字以上、大文字・数字を含む</p>
実装チェックリスト 4:フォーカス管理
基準:キーボード操作時に現在位置が視覚的に分かる
フォーカス状態(Tab で選ばれている要素)が分かりにくいと、キーボード操作が困難になります。
❌ ダメな例(フォーカスを削除):
/* フォーカスを非表示にしている */
button:focus {
outline: none;
}
✅ 良い例(視認可能なフォーカス):
button:focus {
outline: 2px solid #0066cc;
outline-offset: 2px;
}
/* または */
button:focus-visible {
box-shadow: 0 0 0 3px rgba(0, 102, 204, 0.3);
}
実装チェックリスト 5:セマンティック HTML
基準:要素の意味を正確に表現
スクリーンリーダーは HTML の要素の種類を読み上げます。意味のある要素を選択することが重要です。
❌ ダメな例(すべて div):
<div>
<div>タイトル</div>
<div>
<div><a href="#">リンク 1</a></div>
<div><a href="#">リンク 2</a></div>
</div>
<div>本文...</div>
</div>
✅ 良い例(セマンティック要素):
<header>
<h1>タイトル</h1>
<nav>
<ul>
<li><a href="#">リンク 1</a></li>
<li><a href="#">リンク 2</a></li>
</ul>
</nav>
</header>
<main>
<article>本文...</article>
</main>
実装チェックリスト 6:画像の alt テキスト
基準:すべての画像に説明的な alt テキストを記述
スクリーンリーダーは alt テキストを読み上げるため、画像の内容を正確に説明することが必須です。
❌ ダメな例(意味のない alt):
<img src="chart.png" alt="画像">
<img src="product.jpg" alt="pic">
<img src="icon.svg" alt=""><!-- 装飾画像だが alt がない -->
✅ 良い例(説明的な alt):
<!-- グラフの場合:何を示しているか、主要データを記載 -->
<img src="chart.png" alt="2026年1月〜9月の売上推移:3月にピーク達成">
<!-- 商品画像の場合:商品の特徴を記載 -->
<img src="product.jpg" alt="赤いスニーカー、サイズ27cm">
<!-- 装飾画像の場合:alt=""でスクリーンリーダーから隠す -->
<img src="icon.svg" alt="">
実装チェックリスト 7:リンク・ボタンの識別
基準:リンク・ボタンがそれぞれ識別可能
スクリーンリーダーはリンクとボタンを区別して読み上げます。正しい HTML 要素を使うことが重要です。
❌ ダメな例(意味不明なリンク・ボタン):
<!-- 「詳細」だけでは何の詳細か分からない -->
<a href="/product/123">詳細</a>
<!-- div をボタンに見立てている -->
<div onclick="submit()" style="cursor: pointer; background: blue; color: white;">
送信
</div>
✅ 良い例(意味が明確なリンク・ボタン):
<!-- リンクのテキストで目的地が明確 -->
<a href="/product/123">商品「赤いスニーカー」の詳細ページを見る</a>
<!-- またはvisually hidden text -->
<a href="/product/123">
詳細
<span class="sr-only">:赤いスニーカー</span>
</a>
<!-- button 要素でボタンとして明確 -->
<button type="submit">送信</button>
Visually Hidden Text の CSS:
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
/* スクリーンリーダーと :focus-visible 時には表示 */
.sr-only:focus-visible {
position: static;
width: auto;
height: auto;
padding: inherit;
margin: inherit;
overflow: visible;
clip: auto;
white-space: normal;
}
実装チェックリスト 8:ARIA live region
基準:動的に変わるコンテンツをスクリーンリーダーに通知
ページを再読み込みせずにコンテンツが変わる場合(検索結果、エラーメッセージなど)、スクリーンリーダーに変更を通知する必要があります。
❌ ダメな例(変更が通知されない):
<div id="search-results">
<!-- JavaScript で検索結果を挿入 -->
</div>
✅ 良い例(aria-live で通知):
<!-- aria-live="polite" で新しいコンテンツを読み上げ -->
<div id="search-results" aria-live="polite" aria-label="検索結果">
<!-- JavaScript で検索結果を挿入 -->
</div>
<!-- aria-live の種類 -->
<!-- aria-live="polite" - 現在の読み上げ完了後に通知(推奨) -->
<!-- aria-live="assertive" - 即座に中断して通知(エラーのみ) -->
<!-- aria-live="off" - 通知しない -->
チェック・テスト方法(詳細ガイド)
自動チェックツール
1. axe DevTools(推奨)
- Chrome/Firefox 拡張機能として提供
- WCAG 2.1 AA/AAA の基準をカバー
- 自動スキャンで問題を特定
- 無料版・有料版あり
使い方: DevTools を開いて「Scan ALL of my page」をクリック → 問題がリストアップされる
2. WAVE(WebAIM)
- ブラウザ拡張またはオンラインツール
- ビジュアルに問題箇所を表示
- 初心者向けで分かりやすい
3. Lighthouse(Chrome DevTools)
- Chrome に組み込まれている
- Performance、SEO とともにアクセシビリティスコアを測定
- 基本的な問題のみ検出(手動確認の補助)
手動テスト
1. キーボード操作テスト
- マウスを使わず、Tab キーのみで全機能を操作
- チェック項目:
- Tab キーで全要素に到達できるか?
- Shift + Tab で逆順移動できるか?
- Enter キーで機能が実行されるか?
- フォーカスが視認可能か?
2. スクリーンリーダーテスト
- macOS:VoiceOver(標準搭載、Cmd + F5 で有効化)
- Windows:NVDA(無料、https://www.nvaccess.org/)
- チェック項目:
- ページの構造が正確に読み上げられるか?
- 画像の alt テキストが読み上げられるか?
- フォームラベルが正確か?
- エラーメッセージが分かるか?
3. 色コントラスト測定
- WebAIM Contrast Checker(https://webaim.org/resources/contrastchecker/)
- 色コードを入力して AA/AAA 準拠を確認
4. 画面拡大テスト
- ブラウザで 200%、300% に拡大
- チェック項目:
- テキストが読めるか?
- 水平スクロールが必要になっていないか?
- レイアウトが崩れていないか?
5. 音声操作テスト
- 音声認識で操作可能か確認(Windows Narrator、macOS Dictation)
実装チェックリスト(まとめ)
| 項目 | WCAG 基準 | チェック内容 |
| 色コントラスト | 1.4.3 AA | テキスト vs 背景 4.5:1 以上 |
| キーボード操作 | 2.1.1 A | Tab キーで全要素に到達可能 |
| フォーカス表示 | 2.4.7 AA | :focus 時に outline 表示 |
| ARIA ラベル | 1.3.1 A | screen reader が正確に読み上げる |
| セマンティック | 1.3.1 A | <button>, <nav> など意味のある要素を使用 |
| 画像の alt テキスト | 1.1.1 A | すべての画像に意味のある alt を記述 |
以上で WCAG 2.1 チェックリストの説明を終えたいと思います。
アクセシビリティは「面倒な要件」ではなく、「より多くのユーザーに価値を届ける」ための投資です。このチェックリストを参考に、段階的に対応を進めていくことで、より包括的な Web サイトが実現できますね。

コメント