本文へスキップ

ラジオボタン

選択肢をカード状に並べたラジオグループ。ネイティブの input を使うので矢印キーで移動でき、選んだカードだけ枠と丸が色づく。

プレビュー

クリック

操作クリック/タップで動きます。

仕様書

向く場面
  • 支払い方法など説明付きの選択肢を1つ選ぶ入力
  • 選択肢をカードで大きく押しやすくしたいフォーム
  • ネイティブの矢印キー操作をそのまま使いたい画面
避ける場面
  • 選択肢が6つを超える(セレクト)
  • 複数選べる項目(チェックボックス)
構成要素
  • グループ見出し(legend)
  • カード
  • ラジオ印
  • タイトル
  • 説明文
持っている状態
  • 通常
  • ホバー
  • フォーカス
  • 押下中
キーボード

Tab でグループへ入り、↑↓←→ で選択を移動(即座に選ばれる)、Space で選択

支援技術

fieldset/legend でグループ名。中身はネイティブ input[type=radio] で role・checked は自動。装飾丸は aria-hidden。リングは :has(:focus-visible) でカードに描く

動き

内側の丸 180ms cubic-bezier(0.34,1.36,0.64,1) のバウンスで選択を強調、枠・背景 180ms。reduced-motion で無効

デザインの要点

  • 中身はネイティブの input[type=radio] を隠して使う。矢印キーの移動・グループ化・フォームの値が自前実装なしで手に入る
  • カード全体を label にして押せる範囲を広げる。丸だけが標的だと、スマホでは外す
  • 選択は枠色+背景+内側の丸の3つで示す。丸のバウンス 180ms は「入った」手応えで、装飾ではない
  • 説明文は1行に収める。長い説明が要る選択肢はカードでなく、別画面で比較させる
実装メモ

見た目はカードですが中身はネイティブの <input type="radio"> なので、同名グループの矢印キー移動やフォーカスがそのまま効きます。選択状態は :has(:checked) で親カードに反映し、フォーカスリングも :has(:focus-visible) で描いています。

コード(コピーして使えます)

<form class="rg-form" novalidate>
  <fieldset class="rg-fieldset">
    <legend class="rg-legend">お支払い方法</legend>

    <label class="rg-card">
      <input class="rg-radio" type="radio" name="pay" value="card" checked />
      <span class="rg-mark" aria-hidden="true"></span>
      <span class="rg-body">
        <span class="rg-title">クレジットカード</span>
        <span class="rg-desc">Visa / Master / JCB に対応</span>
      </span>
    </label>

    <label class="rg-card">
      <input class="rg-radio" type="radio" name="pay" value="bank" />
      <span class="rg-mark" aria-hidden="true"></span>
      <span class="rg-body">
        <span class="rg-title">銀行振込</span>
        <span class="rg-desc">入金確認後の発送になります</span>
      </span>
    </label>

    <label class="rg-card">
      <input class="rg-radio" type="radio" name="pay" value="cod" />
      <span class="rg-mark" aria-hidden="true"></span>
      <span class="rg-body">
        <span class="rg-title">代金引換</span>
        <span class="rg-desc">別途手数料 330円</span>
      </span>
    </label>
  </fieldset>
</form>

タグ

同じカテゴリ「フォーム入力」のほかのパーツ

関連パーツ