A 非干渉

2.1.2 キーボードトラップなし

アクセシビリティ達成基準 2.1.2 キーボードトラップなし(等級 A)は、Webコンテンツが キーボード操作中に特定の要素にフォーカスが閉じ込められてしまう(トラップされる)状況を防ぐことを求めるものです。

要件

キーボードのみによる操作中に、フォーカスがあるコンポーネントから他のコンテンツに移動できなくなるような“キーボードトラップ”があってはならない。

もし制限される場合は、「Esc」キーや「タブ」キーなどで 明示的に抜け出す手段が提供されている必要があります。

内容

項目内容
対象キーボード操作でナビゲーションするすべてのインターフェース
フォーカス移動Tabキーなどで前後の要素へ移動できる必要あり
トラップ状態特定の要素内(例:モーダルやカスタムUI)でフォーカスが出られなくなるのはNG
脱出手段の提供特殊なケースでは、Escapeキーや「戻る」リンクなどが必要

不適合の例

問題点
JavaScript製のモーダルウィンドウにフォーカスが入り、Tabで他の要素に移動できないモーダルの中に閉じ込められる(=トラップ)
カスタムUIコンポーネント内で矢印キーなどは機能するが、外部にフォーカスを出せないキーボードだけでは他のUIへ移れない

適合の例

対応内容
モーダルを開いた際、Tabキーでモーダル内のフォーカスが循環し、「閉じる」ボタンに到達可能。その後は Escape キーでモーダルを閉じられる明示的な脱出手段があるため適合
iframe やカスタムUIでも Tab / Shift + Tab で外部に戻れる設計になっているフォーカス制御が正常で適合

実装上の注意

ポイント推奨方法
JavaScript UIfocus() の使用時は tabindex を確認し、Trapにならないよう制御
モーダルEscape キーで閉じられる機能を追加。Tabで巡回可能に設計
iframe や埋め込み要素キーボードで iframe 外に出られるように tabindex="-1" を活用

コード例:フォーカストラップの回避

// モーダル内で Tab 移動が循環するよう制御
const focusableElements = modal.querySelectorAll('a, button, input, [tabindex]:not([tabindex="-1"])');
const firstEl = focusableElements[0];
const lastEl = focusableElements[focusableElements.length - 1];

modal.addEventListener('keydown', (e) => {
  if (e.key === 'Tab') {
    if (e.shiftKey && document.activeElement === firstEl) {
      e.preventDefault();
      lastEl.focus();
    } else if (!e.shiftKey && document.activeElement === lastEl) {
      e.preventDefault();
      firstEl.focus();
    }
  }
});

利点

  • 視覚・身体障害のあるユーザーもキーボードだけで操作可能
  • UIの一貫性が向上し、ユーザーの混乱を防ぐ
  • 支援技術との互換性が高まり、アクセシビリティ要件を満たす

まとめ

  • フォーカスが特定要素に閉じ込められる状況を防ぐことが目的
  • 特にモーダル・ダイアログ・iframe・カスタムコンポーネントでは要注意
  • 脱出方法(例:Escキー・閉じるリンク)を明示的に設ける
最終更新日:2025年12月01日
一覧に戻る
お問い合わせ

当社では、ウェブサイトの診断や改善方法のご提案を通じて、
すべてのユーザーにとって使いやすいウェブづくりをサポートしています。
ご相談・ご依頼は、こちらからお気軽にお問い合わせください。

お問い合わせフォームへ