📄
概念 📚 software-design-concepts

アクセシビリティ(実装観点)

WAI-ARIA・セマンティックHTML・キーボード操作・スクリーンリーダー対応の具体的な実装指針

アクセシビリティ(Accessibility、a11y)はすべてのユーザーが平等にサービスを利用できるよう保証する実装責務である。視覚障害・運動障害・認知障害など様々な特性を持つユーザーが存在し、支援技術(スクリーンリーダー・キーボード操作・スイッチアクセス等)を通じてWebを利用している。アクセシビリティ対応は「障害者のため」という限定的な視点ではなく、状況的な制約(画面をまぶしい屋外で見る・片手が塞がっている等)を持つ全ユーザーへの品質保証として捉えるべきである。

セマンティックHTMLはアクセシビリティの基盤である。<button><a><h1><h6><nav><main><form> 等の意味論的な要素は、スクリーンリーダーが要素の役割・状態を自動的に解釈できる情報を持つ。<div><span>onClick をつけてボタンとして使う実装は、キーボード操作やスクリーンリーダーからのアクセスを壊すため、特別な理由がない限り避けるべきである。

WAI-ARIA(Web Accessibility Initiative - Accessible Rich Internet Applications)はHTMLのネイティブなセマンティクスで表現できない複雑なUIパターン(タブ・モーダル・コンボボックス等)に意味論を追加するための仕様である。role属性でUIの役割を定義し、aria-* 属性で状態(aria-expandedaria-selected等)やラベル(aria-labelaria-describedby等)を提供する。ARIAの第一原則は「ネイティブのHTMLで表現できる場合はARIAを使わない」ことであり、不適切なARIAの付与はアクセシビリティを悪化させることがある。

コードレビューで着目するポイント

  • <div><span>onClickを付けてインタラクティブな要素として使っていないか(<button><a>を使うべき)
  • インタラクティブな要素が Tab キーでフォーカス可能であり、EnterSpace キーで操作できるか
  • フォームの入力フィールドに <label> が正しく関連付けられているか(for属性またはラップ)
  • モーダル・ダイアログが開いた際にフォーカスがモーダル内に閉じ込められ(Focus Trap)、閉じたら元の要素にフォーカスが戻るか
  • 画像に意味のある alt テキストが設定されているか(装飾的な画像は alt=""
  • エラーメッセージが aria-describedby 等で入力フィールドと関連付けられているか
  • axe-coreやESLint jsx-a11y等の自動テストが CI に組み込まれているか

典型的なアンチパターン

<div> ボタン: クリックハンドラーを <div> に設定してボタンとして使う実装は、キーボードフォーカスが当たらず(Tab で到達できない)、スクリーンリーダーがボタンとして認識しない。<button> 要素を使えばフォーカス・Enterキー操作・セマンティクスが標準で得られる。

フォーカスの消滅: outline: none を全要素に適用してフォーカスリングを消すと、キーボードユーザーが「今どこにいるか」を失う。フォーカスリングはデザインを損なわない形(カスタムスタイル)で維持するか、:focus-visible を使ってマウス操作時のみ非表示にすべきである。

ARIA の過剰な付与: <button role="button"> のように、ネイティブのセマンティクスを持つ要素に同じ意味のARIAを重ねる実装は冗長だが無害である。しかし <nav role="navigation">aria-label なしで複数のナビゲーションを配置したり、aria-live を広いコンテナに無差別に設定するなど、誤ったARIAは支援技術のユーザーに混乱を引き起こす。

参考リソース

  • 標準: WAI-ARIA 1.2 - ARIAのロール・プロパティ・ステートの公式仕様
  • 標準: WCAG 2.1 - Webアクセシビリティのガイドライン(A・AA・AAAの3段階)
  • ツール: axe-core - ブラウザ拡張・Jest・Playwrightで使えるアクセシビリティ自動テストエンジン
  • ツール: ESLint jsx-a11y - Reactのアクセシビリティ問題を静的解析で検出するESLintプラグイン
  • ツール: Radix UI - キーボード操作・フォーカス管理・WAI-ARIAが適切に実装されたヘッドレスUIコンポーネント
  1. 1. 📄アーキテクチャスタイル
  2. 2. 📄ドメインモデリング
  3. 3. 📄モジュール分割と依存管理
  4. 4. 📄データモデリング
  5. 5. 📄API設計
  6. 6. 📄整合性とトランザクション
  7. 7. 📄非同期処理(Queue/Event)
  8. 8. 📄キャッシング
  9. 9. 📄ユーザーリサーチ
  10. 10. 📄情報アーキテクチャ
  11. 11. 📄インタラクションデザイン
  12. 12. 📄UX原則とヒューリスティクス
  13. 13. 📄アクセシビリティ(UX観点)
  14. 14. 📄UXメトリクス
  15. 15. 📄スケーラビリティ
  16. 16. 📄可用性とレジリエンス
  17. 17. 📄オブザーバビリティ
  18. 18. 📄環境・インフラ設計
  19. 19. 📄データマイグレーション
  20. 20. 📄セキュリティ設計原則
  21. 21. 📄データ保護とマルチテナント
  22. 22. 📄LLMセキュリティ
  23. 23. 📄ビジュアルデザイン原則
  24. 24. 📄デザインシステム
  25. 25. 📄コンポーネント設計
  26. 26. 📄スタイリング
  27. 27. 📄状態管理
  28. 28. 📄フロントエンドパフォーマンス
  29. 29. 📄アクセシビリティ(実装観点)
  30. 30. 📄アニメーションとインタラクション
  31. 31. 📄設計原則
  32. 32. 📄デザインパターン(GoF)
  33. 33. 📄エンタープライズパターン
  34. 34. 📄クリーンコード
  35. 35. 📄リファクタリング
  36. 36. 📄型設計とコントラクト
  37. 37. 📄関数型プログラミング概念
  38. 38. 📄エラーハンドリング
  39. 39. 📄テスト戦略と哲学
  40. 40. 📄テスト種別(機能テスト)
  41. 41. 📄テスト種別(UI・ビジュアル)
  42. 42. 📄テスト種別(契約・境界)
  43. 43. 📄テスト種別(非機能テスト)
  44. 44. 📄テストダブル
  45. 45. 📄テスト設計技法
  46. 46. 📄並行処理・マルチスレッド
  47. 47. 📄パフォーマンス最適化
  48. 48. 📄ドキュメント管理
  49. 49. 📄バージョン管理と開発プロセス
  50. 50. 📄脅威モデリング
  51. 51. 📄通信保護(TLS)
  52. 52. 📄暗号化・機密情報管理
  53. 53. 📄認証・セッション管理
  54. 54. 📄認可・アクセス制御
  55. 55. 📄入力バリデーション
  56. 56. 📄インジェクション攻撃
  57. 57. 📄出力エンコーディング
  58. 58. 📄エラーハンドリング(セキュリティ観点)
  59. 59. 📄SSRF(サーバーサイドリクエストフォージェリ)
  60. 60. 📄依存関係管理
  61. 61. 📄設計・実装 参考書籍
  62. 62. 📄セキュリティ参考資料
  63. 63. 📄正規化(データベース正規化)