フォーム・入力
ラジオグループ
解説ありRadio Group
複数から1つを選ぶ。矢印キー移動と roving tabindex の代表例。
ラジオグループとは?
ラジオボタンは、いくつかの選択肢から1つだけを選ぶ UI です。 支払い方法、サイズ、配送オプションなど「どれか1つに決めたい」場面で使います。 これらをまとめた一式をラジオグループと呼びます。
チェックボックスとの違いは「複数選べる(チェックボックス)」か「1つだけ(ラジオ)」か。 この「1つだけ」というルールと、グループとしての名前を、目で見えない人にも伝えるのがポイントです。
なぜアクセシビリティが大事なの?
- キーボードだけで操作する人。ネイティブのラジオは Tab でグループに入り、↑↓←→ で選択肢を移動しながら同時に選択できます。
<div>製だと矢印キーが効かず、操作が成立しません。 - スクリーンリーダーを使う人。「お支払い方法, クレジットカード, ラジオボタン, 選択済み, 3個中1個目」 のようにグループ名・役割・選択状態・位置が読み上げられます。
<div>では、そもそも選択肢のかたまりだと分かりません。
最短ルートは同じ name のネイティブラジオを <fieldset> +<legend> でまとめることです。
ライブデモ(推奨実装)
支払い方法を1つ選ぶラジオグループです。マウスを使わず、Tab でグループに入ってから矢印キーで操作してみてください。
試してみよう:Tab でグループに入る → ↑ ↓ ← → で選択肢を移動(移動=選択)。グループから出るには再度 Tab。
ポイント
ラジオグループでは Tab はグループ全体で1回だけ止まります (選択肢ごとには止まらない)。グループ内の移動は矢印キーの役割です。 これは「ロービングタブインデックス」というキーボードの基本パターンで、ネイティブが自動で行います。
キーボード操作
| キー | 動作 | 必須/任意 |
|---|---|---|
| Tab | グループに入る / グループから出る(選択中の項目にフォーカス) | 必須 |
| ↓ / → | 次の選択肢へ移動して選択する | 必須 |
| ↑ / ← | 前の選択肢へ移動して選択する | 必須 |
| Space | フォーカス中の選択肢を選択する | 必須 |
補足
これらの操作は <input type="radio"> を同じ name でまとめるだけですべて自動的に得られます。自分で矢印キーの処理を書く必要はありません。
必要な WAI-ARIA / ロール
ネイティブ要素なら、ほぼ ARIA を書かずに成立します。
| 付ける場所 | 属性 / ロール | 意味 |
|---|---|---|
| 各選択肢 | <input type="radio"> + 同じ name | radio ロール・「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つだけ選択」という意味も支援技術へ伝わりません。
試してみよう: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がなく、状態も位置も読み上げられない。 - チェックボックスをラジオ代わりに使うのも誤り(複数選べてしまい、意味が逆になる)。
実装チェックリスト
- 各選択肢は
<input type="radio">である - グループ内のラジオは同じ
nameを共有している <label>と関連付いている(内包 orfor/id)<fieldset>+<legend>でグループ名を与えている- Tab でグループに入り、矢印キーで移動&選択できる
- フォーカスが見える(フォーカスリングを消していない)
- 自作する場合のみ
role="radiogroup"/role="radio"/aria-checked/ロービングタブインデックスを実装