チェックボックス
component複数の選択肢から、当てはまるものをいくつでも選べる入力パーツです。
body × state
size = medium · isInvalid=false
isInvalid=true
境界線 / 塗りつぶしが negative 系
size
small (16) / medium (24)
small
medium
standalone checkbox
周りに他のチェックボックスは存在せず、視覚的に独立した専用のコンテナ内に配置される。
checkbox list
checkbox list では、それぞれのチェックボックスは独立して機能する。
nested checkbox
親チェックボックスの一部の子が選択されていれば、親チェックボックスは「不確定」状態になり、ハイフンで表示される。
機能
このコンポーネントの用途
複数選択や ON/OFF 設定に使うフォーム部品。
排他的な単一選択は radio、絞り込みのトグルは filter-chip。
使用法
推奨される使い方と、やりがちな NG パターン
OK
- ✓input と文言を checkbox-label で囲み、ラベル全体を押せるようにする(キーボード・スクリーンリーダー対応もほぼ自動で得られる)。
- ✓中間状態は JS で el.indeterminate = true。
- ✓グループが複数あるときは fieldset/legend や Label Control の見出しで区切る。
NG
- ✕排他的な単一選択に使わない → radio。
- ✕形状を独自シェイプに変えない → □ が「複数選択可」の手がかり(guidelines 参照)。
- ✕ラベルを否定形で書かない(「メール通知を受け取らない」等) → チェックで二重否定になる。肯定形で書き、チェック=有効に揃える。
- ✕チェックした瞬間に送信・保存を実行しない → 確定ボタンを挟む。
ラベルは checkbox-label で内包
クリック領域とアクセシブルネーム
<label class="checkbox-label"> でテキストごと包む。文字クリックでも切替でき、名前も自動で結び付く。
<label class="checkbox-label"> <input type="checkbox" class="checkbox" />利用規約に同意する </label>
input とテキストを別要素で並べない。文字クリックで切替できず、名前も結び付かない。
<input type="checkbox" class="checkbox" /> <span>利用規約に同意する</span>
NG パターン
チェックボックスのレイアウト原則チェックボックスは縦並びで配置する。1 視線で全選択肢を上から下へ走査でき、選択肢が増えても自然に拡張できる。
<div class="flex flex-col gap-2"> <label class="checkbox-label">…</label> </div>
チェックボックスを横並びで使用することは避けてください。視線が左右に飛び、選択肢同士のグルーピングが弱くなる上、選択肢の追加・改行で崩れやすくなります。
<div class="flex flex-wrap gap-6"> <label class="checkbox-label">…</label> </div>
関連ガイドライン
Don't / Good パターン集
チェックボックスのアクセシビリティ
ネイティブ <input type="checkbox"> を土台に、DS が役割・状態・フォーカスを担保します。WCAG 2.2 全基準のチェックリストは アクセシビリティ ページを参照してください。
期待される配慮
Presentation / Adaptability / Interaction / Assistive Technology
選択状態(チェック / 不確定 / 未選択)を形で示し、エラーは色だけでなく境界色+テキストで伝える。選択肢は縦並びで走査しやすくする。
サイズは rem / トークンで文字拡大に追従。md は 24px でターゲットを確保し、リフローで縦積みに崩れても機能を失わない。
Tab で到達し Space で切替。ラベルのテキストクリックでも切り替わり、フォーカスリングで位置が分かる。
ネイティブ input により role=checkbox と checked / mixed 状態が自動で伝わる。ラベルの関連付けが前提。
DS が担保する機能
追加実装なしで満たされる
- ✓ネイティブ
<input type="checkbox">ベース — 役割・名前・状態が標準で確立 - ✓フォーカスリング
--shadow-focus-ring(:focus) - ✓
checkbox-labelがクリック領域を広げ、ラベルを名前に結び付ける - ✓エラーは
checkbox-errorの境界色で表現(色+テキスト併用を前提) - ✓
mdは 24px でターゲット最小(WCAG 2.5.8)を満たす
実装時の必須対応
プロダクト側で担保する
- !各チェックボックスに必ずラベル(
checkbox-labelで内包 かaria-labelledby) - !選択肢グループには見出し(
<fieldset>+<legend>かlabel-control) - !不確定は属性でなく JS プロパティ
el.indeterminate = true - !エラー時は
aria-invalid="true"+aria-describedbyでメッセージを関連付け - !
sm(16px)はラベル併用でタッチ領域 24px 以上を確保
テスト方法
キーボード / スクリーンリーダー / 自動チェック
| キー | 動作 |
|---|---|
| Tab / Shift+Tab | 各チェックボックスへ移動する |
| Space | フォーカス中の項目を切り替える |
- SR「チェックボックス、チェック済 / 未チェック / 一部選択」とラベルが読まれる
- 操作ラベルのテキストをクリックして切り替えられる
- 自動axe / Lighthouse でラベル関連付け・コントラスト・
aria-invalidを確認
エラーは色だけに頼らない
達成基準:WCAG 1.4.1 色の使用 / 3.3.1 エラーの特定同意が必要です
境界色に加えエラーテキストを aria-describedby で関連付ける。色を認識できなくても理由が伝わる。
<label class="checkbox-label"> <input class="checkbox checkbox-error" aria-invalid="true" aria-describedby="err" />同意する </label> <p id="err">同意が必要です</p>
赤い境界線だけでは、色を区別できない人にエラーだと伝わらない。
<label class="checkbox-label"> <input class="checkbox checkbox-error" />同意する </label>
グループには見出し(fieldset / legend)
達成基準:WCAG 1.3.1 情報及び関係性
fieldset + legend でグループ名を与えると、SR が各項目を「通知の受け取り方」の一部として読む。
<fieldset> <legend>通知の受け取り方</legend> <label class="checkbox-label">…メール</label> <label class="checkbox-label">…SMS</label> </fieldset>
通知の受け取り方
見出しを <p> で置くだけでは、SR 上でグループとして関連付かない。
<p>通知の受け取り方</p> <label class="checkbox-label">…メール</label> <label class="checkbox-label">…SMS</label>