フォーム・入力

ラジオグループ

解説あり

Radio Group

複数から1つを選ぶ。矢印キー移動と roving tabindex の代表例。

ラジオグループとは?

ラジオボタンは、いくつかの選択肢から1つだけを選ぶ UI です。 支払い方法、サイズ、配送オプションなど「どれか1つに決めたい」場面で使います。 これらをまとめた一式をラジオグループと呼びます。

チェックボックスとの違いは「複数選べる(チェックボックス)」か「1つだけ(ラジオ)」か。 この「1つだけ」というルールと、グループとしての名前を、目で見えない人にも伝えるのがポイントです。

なぜアクセシビリティが大事なの?

最短ルートは同じ name のネイティブラジオを <fieldset> +<legend> でまとめることです。

ライブデモ(推奨実装)

支払い方法を1つ選ぶラジオグループです。マウスを使わずTab でグループに入ってから矢印キーで操作してみてください。

アクセシブルなラジオグループ
お支払い方法

試してみよう:Tab でグループに入る → ↑ ↓ ← → で選択肢を移動(移動=選択)。グループから出るには再度 Tab。

ポイント

ラジオグループでは Tabグループ全体で1回だけ止まります (選択肢ごとには止まらない)。グループ内の移動は矢印キーの役割です。 これは「ロービングタブインデックス」というキーボードの基本パターンで、ネイティブが自動で行います。

キーボード操作

キー動作必須/任意
Tabグループに入る / グループから出る(選択中の項目にフォーカス)必須
/ 次の選択肢へ移動して選択する必須
/ 前の選択肢へ移動して選択する必須
Spaceフォーカス中の選択肢を選択する必須

補足

これらの操作は <input type="radio"> を同じ name でまとめるだけですべて自動的に得られます。自分で矢印キーの処理を書く必要はありません。

必要な WAI-ARIA / ロール

ネイティブ要素なら、ほぼ ARIA を書かずに成立します。

付ける場所属性 / ロール意味
各選択肢<input type="radio"> + 同じ nameradio ロール・「1つだけ選択」・矢印キー操作が自動で付く。
ラベル<label>各選択肢の名前。クリックでも選択できる。
グループ<fieldset> + <legend>選択肢をまとめ、グループ名(質問文)を与える。

補足

どうしても自作する場合は、外側に role="radiogroup"、各項目に role="radio" +aria-checked を付け、ロービングタブインデックス(選択中だけ tabindex="0"、 他は tabindex="-1")と矢印キーの自前実装が必要です。ネイティブを使えば全部不要です。

実装:推奨パターン(Good)

良い例 / 推奨

同じ name のネイティブラジオを <fieldset> + <legend> でまとめるだけです。

マークアップ:

<fieldset>
  <legend>お支払い方法</legend>

  <!-- 同じ name でグループ化。矢印キーで移動&選択がネイティブで動く -->
  <label>
    <input type="radio" name="pay" value="card" checked> クレジットカード
  </label>
  <label>
    <input type="radio" name="pay" value="bank"> 銀行振込
  </label>
  <label>
    <input type="radio" name="pay" value="cod"> 代金引換
  </label>
</fieldset>

スクリプト:

// JS は不要。
// 同じ name でまとめれば「1つだけ選択」「矢印キーで移動&選択」
// 「Tab でグループに入る」がすべてブラウザの標準動作で得られる。

アンチパターン(Bad)

下は <div> で作った「ラジオ風」です。マウスのクリックでは選べますが、キーボードの矢印キーは効かず、Tab でも止まりません。グループ名も「1つだけ選択」という意味も支援技術へ伝わりません。

div で作った壊れたラジオグループ
クレジットカード
銀行振込
代金引換

試してみよう:Tab でフォーカスできず、矢印キーでも切り替わりません。スクリーンリーダーでは選択肢のグループだと認識されません。

<!-- ❌ アンチパターン:div で作った"ラジオ風" -->
<div class="radio-list">
  <!-- role も name もなく、矢印キーでも動かない。グループ名もない -->
  <div class="radio" onclick="select(this)">クレジットカード</div>
  <div class="radio" onclick="select(this)">銀行振込</div>
  <div class="radio" onclick="select(this)">代金引換</div>
</div>

悪い例 / 避ける

この実装の問題点:

  • キーボードで操作できないdiv はフォーカスできず、矢印キーも効かない。
  • グループだと伝わらないrole="radiogroup"<fieldset> もない。
  • 「1つだけ選択」が伝わらないrole="radio" / aria-checked がなく、状態も位置も読み上げられない。
  • チェックボックスをラジオ代わりに使うのも誤り(複数選べてしまい、意味が逆になる)。

実装チェックリスト


原文(英語):Radio Group Pattern — W3C APG(新しいタブで開きます)