コンテンツにスキップ

セレクト

hc-select はネイティブの <select> 要素をスタイルします。土台の 要素はネイティブの挙動をすべて保ちます — キーボードナビゲーション、 フォーム送信、モバイルでの OS ネイティブピッカー、スクリーンリーダーの セマンティクス — 閉じた状態だけが、HC フォームコントロールファミリーに 合わせて完全に再スタイルされます。

別名: セレクトボックス、ドロップダウン、プルダウン。

<select> をサポートするすべてのブラウザ(つまりすべてのブラウザ)で 動きます。展開されたドロップダウンはブラウザネイティブのままなので、 体験はユーザーのプラットフォームと一貫します。

モダンな後続 — appearance: base-select — により、いずれネイティブ コントロールを手放さずに開いたピッカーもスタイルできるようになり ます。現状とオプトイン方法は下の ネイティブ志向: 開いたピッカーのスタイリングを 参照してください。

セレクトの上に見えるラベルとヘルパーテキストを付けるには hc-field と組み合わせて ください。

data-variant は、デフォルト以外の枠線色として successwarningerror を受け付けます。デフォルト(省略)のバリアントは中立の枠線を 使います。

支援技術にもフィールドが無効だと認識させるため、 data-variant="error" と一緒に aria-invalid="true" を設定して ください。

data-sizesmmd(デフォルト)、lg を受け付けます。サイズは hc-button / hc-input と同じ --hc-control-* スケールに従うため、 data-density="compact" は他のコントロールと一貫して縮めます。

コントロールがまったく操作可能であるべきでないときは、ネイティブの disabled 属性を使います。aria-disabled="true" は、コントロールが タブ順に残らなければならないまれなケース向けの、フォーカス可能な 変種です。

hc-select はネイティブの <select> と同様にフォーム送信へ参加 します。即時フィルタには change を待ち受けます:

<select class="hc-select"
name="status"
data-hx-get="/items"
data-hx-trigger="change"
data-hx-target="#items"
data-hx-include="this">
<option value="">Any status</option>
<option value="open">Open</option>
<option value="closed">Closed</option>
</select>

サーバサイドバリデーションのフィードバックには、 aria-invalid="true" つきのセレクトと、対になる hc-field の メッセージを返してください。

  • セレクトには常にラベルを関連付けてください。最も簡単なパターンは、 <label for> つきの hc-field の中に置くことです。aria-label は 見えるラベルがふさわしくない場合(ツールバー内のセレクトなど)に だけ使います。
  • 最初の option が見えるデフォルトです — 何も事前選択されていない ときは <option value="">Choose…</option> のようなプレースホルダーを 使い、サーバ側で空の値と実際の選択を区別できるようにしてください。
  • ネイティブの <select>Enter / Space / 矢印キーをすでに 処理します。カスタムのキーボードハンドラを足さないでください — ブラウザ組み込みの挙動と衝突するだけです。
  • シェブロンは、hc-checkbox / hc-radio と同じ規約に倣い、 ハードコードされた中立のストローク色の background-image で描かれ ます。純粋に装飾であり、スクリーンリーダーは読み上げません。

component トークン(component.tokens.json):

トークンパス用途
select.height / padding-xサイズ(--hc-control-* 経由で密度を継承)。
select.radius / font-size / bg / fg / border面、テキスト、平常時の枠線。
select.focus-borderフォーカス時の枠線。
select.error-border / success-border / warning-borderバリアントの枠線。
select.disabled-bg無効時の背景。
select.chevron-sizeシェブロンアイコンの寸法。
select.sm.* / lg.*専用の sm / lg 上書き。
生成される CSS 変数を表示
--hc-select-height | -padding-x | -radius | -font-size
--hc-select-bg | -fg | -border
--hc-select-focus-border | -error-border | -success-border | -warning-border
--hc-select-disabled-bg
--hc-select-chevron-size
--hc-select-sm-height | -sm-padding-x | -sm-font-size
--hc-select-lg-height | -lg-padding-x | -lg-font-size
--hc-color-focus-ring (inherited from data-color)

ネイティブ志向: 開いたピッカーのスタイリング

Section titled “ネイティブ志向: 開いたピッカーのスタイリング”

ネイティブの <select> は、キーボードナビゲーション、フォームへの 参加、モバイルの OS ピッカー、スクリーンリーダーのセマンティクスを 無料で与えてくれます — しかし歴史的に、開いたドロップダウンは スタイルできませんでした。 カスタマイズ可能な <select> の取り組みがそれを変えます: 要素を appearance: base-select に オプトインすると、本物のネイティブコントロールを保ったまま、 ピッカー — ::picker(select) 疑似要素と各 <option> を含む — をスタイルできます。ピッカーは (ポップオーバーのように)トップレイヤーに描画され、CSS アンカー ポジショニングで配置できます。全容は Open UI の explainerを 参照してください。

これは完全にプログレッシブです: appearance: base-select を理解 しないブラウザは単に無視し、ネイティブのドロップダウンを保ちます。 サポートするブラウザで今日カスタマイズ可能なパスが欲しければ、 インスタンス単位でオプトインしてください:

<select class="hc-select" name="country" style="appearance: base-select">
<button type="button">
<selectedcontent></selectedcontent>
</button>
<option value="">Choose a country…</option>
<option value="jp">Japan</option>
</select>

今すぐ、どこでも動く完全にスタイルされたドロップダウンが必要? hc-comboboxを使って ください — Light DOM に ARIA リストボックスを描画する JS の逃げ道 です。HC はカスタマイズ可能 <select> の展開を追跡しており、機能が Baseline に達したら hc-select に第一級の宣言的オプトインを追加 します。開いたピッカーのスタイリングだけが hc-combobox に手を 伸ばす理由である場面を、ネイティブパスが置き換えられるように。

  • インプット — 同じコントロールスケールを共有するテキスト / textarea の兄弟。
  • フィールド — ラベル + ヘルパーテキストのラッパー。
  • コンボボックス — 今日、開いたドロップダウンをスタイルする必要があるときの JS 支援リストボックス。
  • チェックボックス / ラジオ — 真偽値 / 単一選択のフォームコントロール。

レシピでの利用: カスケードセレクト