マルチセレクター
component決まった選択肢から複数を選ぶ、折りたたみ式の入力欄です。見た目は セレクター と同じ枠のボタンで、押すとパネルが開き、中の チェックボックス で選びます。選んだ値はボタンに要約して表示します。パネルの中は普通のチェックボックスなので、Tab で移動・Space で切り替えでき、フォームの送信にもそのまま乗ります。
size × state
valid
isInvalid=true
bg negative/50 · border 2px negative/500(ボタンに multi-selector-error、真下に field-error-text)
基本
ボタンを押すとパネルが開き、チェックボックスで選ぶ。選んだその場でボタンの表示(名前を「、」でつなぐ)に反映する。ほぼ全部を選ぶことが多いなら先頭に「すべて」(一部だけ選ぶと一部選択の表示)
<span class="label-control-text" id="cols-label">表示する列</span> <div class="multi-selector multi-selector-md"> <button type="button" class="multi-selector-trigger" aria-labelledby="cols-label cols-value" aria-haspopup="dialog" aria-expanded="false" popovertarget="cols-panel"> <span class="multi-selector-value" id="cols-value" data-placeholder="選択してください">振込日、振込先、金額</span> </button> <div class="multi-selector-panel" id="cols-panel" popover role="dialog" aria-labelledby="cols-label"> <label class="checkbox-label multi-selector-option multi-selector-all"><input type="checkbox" class="checkbox" data-select-all />すべて</label> <label class="checkbox-label multi-selector-option"><input type="checkbox" class="checkbox" name="cols" value="date" checked />振込日</label> … </div> </div>
グループ・件数の表示
選択肢に種類があるなら fieldset + legend.multi-selector-group-title で分ける。ツールバーなど幅が狭い場所は data-summary="count" で「3 件選択」と出す
機能
このコンポーネントの用途
決まった選択肢(数個〜15 個ほど)から複数を選ぶフォームの入力欄。選択肢を常に並べる場所が無いときに折りたたむ。
場所があるなら checkbox を並べる(一覧性が高い)。1 つだけ選ぶなら selector / select、自由に入力した値を集めるなら tag-input。
一覧を今すぐ絞り込むトグルは filter-chip、表の見出し行の絞り込みは data-table-filter-panel。
使用法
推奨される使い方と、やりがちな NG パターン
OK
- ✓選択肢が数個〜15 個ほどで、画面に checkbox を並べる場所が無いときに使う(表の「表示する列」、フォームの「対象部署」等)。
- ✓ボタンには選んだ値の名前を「、」でつないで出す(幅が狭い場所は data-summary="count" で「3 件選択」)。未選択なら placeholder。
- ✓選択肢は選んだその場でボタンの表示に反映する(パネルを閉じる操作や「適用」を要求しない)。
- ✓ほぼ全部を選ぶことが多いなら先頭に「すべて」(data-select-all)を置く。一部だけ選んでいると indeterminate にする。
- ✓選択肢に種類があるなら fieldset + legend(multi-selector-group-title)でグループに分ける。
NG
- ✕1 つだけ選ぶ入力に使わない → selector / select。
- ✕選択肢が 15 個を超えるなら使わない → 一覧から探しにくい。パネルに入力のたびに絞る検索も置かない (入力のたびに内容を変えない。search-input の規則)。自由入力で集めるなら tag-input。
- ✕場所があるのに折りたたまない → checkbox を並べる方が、何を選べるか・何を選んだかが一目で分かる。
- ✕パネルの中を矢印キーで動く独自の一覧(listbox)にしない → 普通の checkbox のまま(Tab / Space)。
- ✕ボタンに独自の枠・色を付けない → selector と同じ見た目(multi-selector-{sm,md,lg})。
- ✕一覧を今すぐ絞り込むトグルに使わない → filter-chip / 表の見出し行の絞り込み。
場所があるならチェックボックスを並べる
一覧性フォームに場所があり、選択肢が少ないなら並べる。何を選べるか・何を選んだかが一目で分かる。
3 つしかない選択肢を折りたたむと、押すまで何を選べるか分からない。マルチセレクターは場所が無いときに使う。
1 つだけ選ぶならセレクター
用途の使い分けチェックボックスで 1 つだけ選ばせると、複数選べるように見えて迷う。
マルチセレクターのアクセシビリティ
パネルの中は普通のチェックボックスです。矢印キーで動く独自の一覧(listbox)にしないので、特別なキー操作を覚えなくても Tab と Space で選べ、スクリーンリーダーでも「チェックボックス、チェックあり」と標準どおりに読まれます。WCAG 2.2 全基準は アクセシビリティ ページを参照。
期待される配慮
Presentation / Adaptability / Interaction / Assistive Technology
ボタンに選んだ値の名前(または件数)を出し、パネルを開かなくても何を選んでいるか分かる。
パネルは最大 320px で縦にスクロールし、画面の端では内側に収まる。
ボタンで開くと最初のチェックボックスへフォーカス。Tab で移動・Space で切り替え、Esc で閉じてボタンへ戻る。Tab でパネルの外へ出ても閉じる。
ボタンは「表示する列、振込日、振込先、金額、ボタン、折りたたみ」のように項目名と選んだ値が読まれる。パネルは項目名のダイアログ、中は標準のチェックボックス。
DS が担保する機能
追加実装なしで満たされる
- ✓ボタンはセレクターと同じ枠・高さ・フォーカスリング(info/600)。未選択の placeholder は data-placeholder の文字を CSS で出す
- ✓選択肢の行全体が押せる(label で包んだ checkbox)。hover で地が付く
- ✓強制カラーモードでは矢印を system color で描き直し、パネルの輪郭線を出す
実装時の必須対応
プロダクト側で担保する
- !ボタンに
aria-labelledby(項目名 + 選んだ値)、aria-haspopup="dialog"、aria-expanded(開閉で更新) - !パネルは
role="dialog"とaria-labelledby。グループはfieldset+legend - !開いたら最初のチェックボックスへフォーカス、閉じたらボタンへ戻す。Tab でパネルの外へ出たら閉じる
- !選ぶたびにボタンの要約を更新し、「すべて」は一部だけ選ぶと indeterminate にする
テスト方法
スクリーンリーダー / キーボード / 自動チェック
- SRボタンで項目名と選んだ値が読まれ、開いたパネルで各チェックボックスの状態が読まれる
- キーEnter / Space で開き、Tab と Space だけで選べる。Esc で閉じるとボタンにフォーカスが戻る
- 自動axe / Lighthouse でボタンの名前・チェックボックスのラベル・コントラストを確認