a11y-debugging について
a11y-debugging は、ブラウザツールでウェブのアクセシビリティ問題を調査する開発者向けのスキルです。Lighthouse の監査、アクセシビリティツリー、キーボード操作、ページスクリプトによる確認を組み合わせて問題を探します。
主な機能
- 01Lighthouse によるアクセシビリティ監査
- 02アクセシビリティツリーと見出しレベルの確認
- 03コントロール名・フォームラベル・画像代替テキストの確認
- 04キーボードフォーカスとモーダル内のフォーカス管理のテスト
- 05タップ領域サイズと色のコントラストの確認
活用シーン
- 01ラベルのないフォームコントロールの特定
- 02見出し構造と読み上げ順序の確認
- 03モーダル表示時のキーボードフォーカス動作の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ gsmlg-dev/ code-agent --skill a11y-debuggingインストール後、Claude Code で/a11y-debuggingを入力して読み込まれたか確認します。
同梱ファイルreferences/a11y-snippets.md
詳細
コアコンセプト
アクセシビリティツリーと DOM の違い:要素を視覚的に非表示にする方法(例:CSS opacity: 0)は、スクリーンリーダーに対して、display: none や aria-hidden="true" とは異なる動作をします。take_snapshot ツールはページのアクセシビリティツリーを返します。これは支援技術から「見える」内容を表すため、セマンティック構造を把握するうえで最も信頼できる情報源です。
web.dev のドキュメントを読む:特定のアクセシビリティガイドライン(https://web.dev/articles/accessible-tap-targets など)を調べる必要がある場合は、URL の末尾に .md.txt を追加すると(例:https://web.dev/articles/accessible-tap-targets.md.txt)、整形された生の Markdown 版を取得できます。こちらのほうがずっと読みやすくなります!
ワークフローのパターン
1. 自動監査(Lighthouse)
まず Lighthouse のアクセシビリティ監査を実行し、包括的なベースラインを取得します。このツールは全体的なスコアを提示し、修正方法のアドバイスとともに、問題がある具体的な要素を一覧表示します。
- 監査を実行します:
- ページを再読み込みして読み込み時の問題を検出するため、
modeを"navigation"に設定します。 - 完全な JSON レポートを保存するため、
outputDirPath(例:/tmp/lh-report)を設定します。
- ページを再読み込みして読み込み時の問題を検出するため、
- 概要を分析します:
scores(0~1 の範囲)を確認します。スコアが 1 未満の場合、違反があります。audits.failedの件数を確認します。
- レポートを確認します(重要):
- 解析:ファイル全体を行ごとに読み込まないでください。失敗項目を絞り込むには、
jqなどの CLI ツール、または Node.js のワンライナーを使用します:# 失敗した監査項目とその詳細を抽出 node -e "const r=require('./report.json'); Object.values(r.audits).filter(a=>a.score!==null && a.score<1).forEach(a=>console.log(JSON.stringify({id:a.id, title:a.title, items:a.details?.items})))" - これにより、レポート全体をコンテキストに読み込まずに、問題がある要素の
selectorとsnippetを効率よく抽出できます。
- 解析:ファイル全体を行ごとに読み込まないでください。失敗項目を絞り込むには、
2. ブラウザーの問題と監査
Chrome は一般的なアクセシビリティの問題を自動的にチェックします。list_console_messages を使って、次の設定でネイティブ監査の結果を確認します:
types:["issue"]includePreservedMessages:true(ページ読み込み中に発生した問題を検出するため)
これにより、手動で調査しなくても、ラベルの欠落、無効な ARIA 属性、その他の重大なエラーが見つかることがよくあります。
3. セマンティクスと構造
アクセシビリティツリーには、見出しの階層とセマンティックなランドマークが表示されます。
- ページに移動します。
take_snapshotを使ってアクセシビリティツリーを取得します。- 見出しレベルを確認します:見出しレベル(
h1、h2、h3など)が論理的で、レベルを飛ばしていないことを確認します。スナップショットには見出しのロールが含まれます。 - コンテンツの並べ替え:DOM の順序(アクセシビリティツリーの順序を決定します)が、視覚的な読み上げ順序と一致していることを確認します。
take_screenshotを使って視覚的なレイアウトを確認し、スナップショットの構造と比較することで、CSS のフロートや絶対配置によって論理的な流れが乱れていないか検出します。
4. ラベル、フォーム、テキストによる代替
take_snapshotの出力から、ボタン、入力欄、画像を探します。- インタラクティブ要素にアクセシブルな名前が付いていることを確認します(たとえば、アイコンしか含まないボタンの名前が
""になっていてはいけません)。 - ラベルのない入力欄:すべてのフォーム入力欄に対応するラベルがあることを確認します。references/a11y-snippets.md にある 「フォーム入力欄のラベル漏れを検索」スニペットを使って、
evaluate_scriptを実行します。 - 画像に
altテキストがあるか確認します。
5. フォーカスとキーボード操作
キーボードトラップや適切なフォーカス管理を視覚的なフィードバックなしでテストするには、フォーカスされている要素を追跡します。
press_keyツールで"Tab"または"Shift+Tab"を使い、フォーカスを移動します。take_snapshotを使って、更新されたアクセシビリティツリーを取得します。- スナップショット内でフォーカス中として示されている要素を見つけ、フォーカスが想定されたインタラクティブ要素に移動したことを確認します。
- モーダルが開いた場合、フォーカスはモーダル内に移動し、閉じるまでモーダル内に「トラップ」されなければなりません。
6. タップ対象とビジュアル
web.dev によると、タップ対象は少なくとも 48x48 ピクセルで、十分な間隔を確保する必要があります。アクセシビリティツリーにはサイズが表示されないため、references/a11y-snippets.md にある 「Measure Tap Target Size」スニペットを使って evaluate_script を実行してください。
スナップショットの要素の uid を引数として evaluate_script に渡します。
7. 色のコントラスト
色のコントラスト比を確認するには、まずネイティブのアクセシビリティの問題を確認します。
types: ["issue"]を指定してlist_console_messagesを呼び出します。- 出力に「Low Contrast」の問題がないか確認します。
ネイティブの監査で問題が報告されない場合(一部のヘッドレス環境ではこのようなことがあります)、または特定の要素を手動で確認する必要がある場合は、references/a11y-snippets.md にある 「Check Color Contrast」スニペットを使って evaluate_script を実行してください。
8. ページ全体のチェック
コンポーネントのテストでは見落とされがちな、ドキュメントレベルのアクセシビリティ設定を 「Global Page Checks」スニペットを使って確認してください。references/a11y-snippets.md にあります。
トラブルシューティング
標準的な a11y クエリが失敗する場合や、evaluate_script のスニペットが予期しない結果を返す場合:
- 目視確認:自動スクリプトでコントラストを判定できない場合(グラデーション画像や複雑な背景の上にテキストがある場合など)は、
take_screenshotを使って要素を撮影してください。モデルは画像から正確なコントラスト比を測定できませんが、視認性を目視で評価し、明らかな問題を特定できます。