Picker

検索して、候補から値を選びます。

複数人を選べます。

担当者を選択してください。

使いどころ

  • 担当者や確認する人のように、候補が多く、名前で探して選ぶ時に使います。multiple で複数を選べます。
  • 候補が少なく探す必要が無い時は Select、候補に無い値も入力させる時は Suggestion を使います。
  • 自由な語を付け足していく時は TagInput を使います。

使い方

送信する値は、見えない標準の select が name で送ります。上の検索欄は候補を探すためだけのもので、送信しません。options の value が空白だけの候補と、重なった値の二つ目以降は出しません。

検索欄に移ると候補の一覧を開きます。打った文字で候補の名前を絞り込み、全角と半角、大文字と小文字は区別しません。選べる候補が一つも無い時は「一致する候補はありません。」と出します。候補を選ぶと検索欄を空にして一覧を閉じ、検索欄へフォーカスを戻します。

候補の一覧は検索欄のすぐ下に、選んだ値と補足の上へ重ねて開く白いパネル(1px #bbbbbb の枠、角丸5px、柔らかい影)で、12pxの候補の行を隙間なく並べます。ホバーした候補とキーボードで移った候補は、角の無い淡い青(#ddeefe)に黒い文字で塗ります。ピルで囲みません。選び済みの候補は太字、選べない候補は灰色の文字にします。

選んだ候補は、検索欄の下に解除の操作付きの Tag で並べます。一つを選ぶ時は、別の候補を選ぶと置き換え、選び済みの候補を選び直しても変更として扱いません。multiple では選ぶたびに加え、同じ候補をもう一度選ぶと外します。どちらも Tag の解除の操作で外せます。

required で未選択のまま送信すると、検索欄へフォーカスを移して「候補を選択してください。」と出します。フォームのリセットでは標準の select の初期値に戻し、表示も合わせます。

ComboboxController を combobox、PickerController を picker として登録します。選択を変えると picker:change を出し、標準の select でも input・change を発火します。Tag の見た目に components/tag.css、候補の一覧に components/field.css も読み込みます。

候補を取得し直した時は、PickerController の replaceOptions(options) へ新しい候補を渡します。新しい候補にも残る選択は保ち、選択が変わった時は標準の select で input・change を発火します。候補の取得と通信は利用側が行います。

JavaScriptが無い時は、検索欄を出さず、標準の select をそのまま使います。一つを選ぶ時は先頭に「選択してください」の空の選択肢を置きます。

キーボード

Pickerのキーボード操作
キー動作
↓ / ↑一覧を開き、次・前の候補へ移ります。
Home / End(一覧が開いている時)最初・最後の候補へ移ります。
Enter(一覧が開いている時)移った候補を選びます。multiple で選び済みの候補なら外します。
Escape(一覧が開いている時)一覧を閉じます。
Tab検索欄の次に、選んだ Tag の解除の操作へ移ります。

アクセシビリティ

  • controllerが動くと、ラベルの for を標準の select から検索欄へ移します。検索欄は role="combobox" と aria-autocomplete="list" で、aria-expanded と aria-activedescendant で開閉と移った候補を伝えます。
  • 候補の一覧は「(label)の候補」、選んだ値の並びは「選択中」、Tag の解除の操作は「(候補の名前)を解除」という読み上げ名にします。
  • 候補が無い時や未選択の時の知らせは role="status" の領域で読み上げます。
  • help・error は標準の select と検索欄の両方へ説明として関連付け、error がある時は両方を aria-invalid にします。

イベント

Pickerが発火するイベント
イベント内容
picker:change選択を変えた後に出します。detailは selected(選んでいる値の配列)・value(標準の select の値)です。取り消せません。
combobox:beforechange候補を選ぶ前に出します。取り消すとその候補を選びません。detailは value(押した候補の値)・selected(選んだ後の値の配列。一つを選ぶ時は押した候補だけ)・previousSelected(選ぶ前の値の配列)・reason です。選んだ結果は picker:change で受け取ります。

API

Picker

選択値は標準selectが送信し、検索欄は選択のためだけに使う。

Pickerのprops
名前型既定値説明
idstringidの元。省略すると生成する。標準selectは<id>-native、検索欄は<id>-searchになる。
label必須string欄の名前。
name必須string標準selectのname。選んだ値をこの名前で送信する。
options必須readonly PickerOption[]選べる候補。取得後に入れ替える時はPickerController.replaceOptions()を使う。
valuestring | readonly string[]最初に選んでおく値。multipleの時は配列で渡す。
multiplebooleanfalsetrueで複数を選べる。選ぶたびに加え、同じ候補をもう一度選ぶか、Tagの解除で外す。
requiredboolean標準selectのrequired。未選択で送信すると検索欄へフォーカスが移り、「候補を選択してください。」と出す。
disabledboolean標準selectと検索欄を使えなくする。
helpstring欄の下に出す灰色の小さな補足。説明として読み上げる。
errorstring直す所を書くエラー文。欄をaria-invalidにし、説明として読み上げる。
placeholderstring"候補を検索"検索欄のplaceholder。
formstring標準selectのform属性。フォームの外に置く時に、送信するformのidを渡す。

登録するcontroller:combobox(ComboboxController)、picker(PickerController)

読み込むCSS:layers.css、reset.css、tokens.css、base.css、layout.css、components/button.css、components/field.css、components/icon.css、components/picker.css、components/tag.css

PickerOption

PickerOption
名前型既定値説明
value必須string送信する値。空白だけの値と、重なった値の二つ目以降は出さない。
label必須string候補に出す名前。検索はこの名前で絞り込む。
disabledboolean一覧に出すが選べなくする。

コード

HTML
Hono JSX