CSSでここまでできる!カスタマイズ可能なselect要素で作る革新的UIデザイン3選

CSSでここまでできる!カスタマイズ可能なselect要素で作る革新的UIデザイン3選

CSSでここまでできる!カスタマイズ可能なselect要素で作る革新的UIデザイン3選

HTMLのselect要素は、長年にわたりWeb制作者にとってスタイリングが最も困難なパーツの一つであった。ブラウザごとに異なるデフォルトの見た目を持ち、ドロップダウン部分に至ってはCSSでの制御がほぼ不可能だったからだ。

しかし現在、Chromium系ブラウザを中心に「カスタマイズ可能なselect要素(Customizable Select)」という新機能の実装が進んでいる。この機能により、開発者はJavaScriptで独自のコンポーネントを自作することなく、標準のselect要素に対して自由なデザインを適用できるようになった。

本記事では、CSS-Tricksで紹介された先進的なデモを基に、この新機能がもたらす可能性と具体的な実装手法を解説する。従来の常識を覆すような、扇形や円形のセレクトメニューがどのように構築されているのか、その核心に迫る。

1. appearance: base-select によるスタイリングの解禁

カスタマイズ可能なselect機能を利用するための第一歩は、新しいCSSプロパティの値を適用することだ。元記事の著者であるPatrick Brosset氏は、この機能を有効化することで、select要素全体(ボタン、ドロップダウン、オプション)のフルカスタマイズが可能になると指摘している。

制御を可能にする「base-select」の宣言

まず、select要素とそのドロップダウン部分(ピッカー)に対して、`appearance: base-select` を指定する。これにより、ブラウザの標準的なスタイルがリセットされ、開発者が自由にスタイルを定義できる土台が整う。ピッカー部分は `::picker(select)` という新しい擬似要素で指定する仕組みだ。

/* カスタマイズ機能を有効化する基本設定 */
select,
::picker(select) {
  appearance: base-select;
}

この宣言がない場合、select要素は従来通りの制限されたスタイルしか適用できない。この「オプトイン(明示的な有効化)」方式により、既存のWebサイトのデザインを壊すことなく新機能を提供できる設計となっている。

擬似要素による構成パーツの個別操作

新機能では、これまでアクセスできなかったパーツも擬似要素として操作できる。例えば、右側に表示される矢印アイコンは `::picker-icon`、選択状態を示すチェックマークは `::checkmark` という擬似要素で制御可能だ。

著者のBrosset氏は、デモにおいて `::picker-icon` を `display: none` で非表示にし、代わりに独自のアイコンや装飾を施している。また、これまではoption要素の中にテキストしか入れられなかったが、新しい仕様ではspanやimgといったHTMLタグを混在させることも可能になった。これはUIデザインの幅を大きく広げる重要な変更だ。

2. フォルダが扇状に広がるUIの構築

最初のデモとして紹介されているのは、フォルダのリストが扇状に展開されるユニークなセレクトメニューだ。このUIを実現するために、最新のCSS関数が効果的に活用されている。

sibling-index() による動的な回転制御

各フォルダ(option要素)を少しずつ異なる角度で回転させるために、`sibling-index()` という関数が使われている。これは、兄弟要素の中での自身のインデックス番号を返す関数だ。例えば、1番目の要素なら1、2番目なら2を返す。

記事によれば、このインデックス番号に一定の角度(例:-4度)を掛け合わせることで、リストの下に行くほど回転角が大きくなる「扇状」のレイアウトを数行のコードで実現している。これは従来、JavaScriptでループ処理を行ってインラインスタイルを付与していた作業だ。

option {
  --rotation-offset: -4deg;
  /* インデックス番号に応じて回転角を計算 */
  rotate: calc(sibling-index() * var(--rotation-offset));
  /* 右側を支点にして回転させる */
  transform-origin: right calc(sibling-index() * -1.5rem);
}
Folder 1 (Index 1)
Folder 2 (Index 2)
Folder 3 (Index 3)

このデモは、sibling-index()を利用して要素ごとに異なる角度を適用するイメージを示している。

@starting-style で実現する登場アニメーション

メニューが開いた瞬間にアニメーションさせる際、課題となるのが「要素が表示された瞬間の初期状態」の定義だ。通常、displayプロパティが none から block に変わる瞬間はトランジションが効かない。

そこで著者は `@starting-style` という新しいアットルールを使用している。これは要素がレンダリングを開始する直前のスタイルを指定できるもので、これにより「閉じた状態(回転0度)」から「開いた状態(扇状)」への滑らかなアニメーションが可能になる。

3. トランプのデッキを再現するカードピッカー

二つ目のデモは、トランプのカードを扇形に並べたカードピッカーだ。ここでは、配置の自由度を極限まで高めるためのテクニックが紹介されている。

アンカーポジショニングによる配置の自由化

デフォルトのselect要素は、ボタンの真下にリストが表示される。しかし、カスタマイズ可能なselectでは「アンカーポジショニング(Anchor Positioning)」という技術が組み込まれており、リストの表示位置を自由に制御できる。

著者の手法では、`position-area: center center` を使用して、ドロップダウンをボタンの中央に重ねて表示させている。さらに `inset: 0` を指定することで、ピッカーが画面全体のスペースを利用できるように設定している。これにより、ボタンの枠に縛られないダイナミックなレイアウトが可能になる。

@property を活用したカスタムプロパティのアニメーション

カードが広がるアニメーションをより精密に制御するため、`@property` を使って独自のCSS変数を定義している。CSS変数は通常、単なる文字列として扱われるため数値的な補間(アニメーション)ができないが、`@property` で型(この場合は “)を指定することで、ブラウザが変数そのものをアニメーションさせることが可能になる。

@property --card-fan-rotation {
  syntax: '<angle>';
  inherits: false;
  initial-value: 7deg;
}

option {
  /* 変数自体をアニメーション対象にする */
  transition: --card-fan-rotation 0.2s ease-out;
}

この手法により、カードの広がり具合を一つの変数で管理し、CSSのみで滑らかな動きを実現している。JavaScriptによる座標計算は一切不要だという点は、パフォーマンスの観点からも非常に優れている。

4. 三角関数を用いた円形絵文字ピッカー

最後のデモは、ボタンを中心に絵文字が円形に並ぶ「ラジアルメニュー(放射状メニュー)」だ。近年のCSSに追加された数学関数の威力が発揮されている。

sin() と cos() による座標計算

要素を円形に配置するには、角度からX座標とY座標を導き出す必要がある。以前はSassの関数やJavaScriptで行っていた計算だが、現在のCSSでは `sin()`(正弦)と `cos()`(余弦)が直接使用できる。

記事によれば、`sibling-index()` で得たインデックス番号を基に角度(–angle)を算出し、それを `translate` プロパティの中で三角関数に渡している。これにより、各option要素が中心から一定の半径(–radius)の位置に自動的に配置される仕組みだ。

option {
  position: absolute;
  --angle: calc((sibling-index() - 2) * (360deg / (sibling-count() - 1)) - 90deg);
  top: 50%;
  left: 50%;
  /* 三角関数で円周上の座標を決定 */
  translate:
    calc(-50% + cos(var(--angle)) * var(--radius)) 
    calc(-50% + sin(var(--angle)) * var(--radius));
}
😊
🚀
🔥
💡

三角関数を利用して、中心のボタンの周囲に要素を円形配置するレイアウトのデモ。

アクセシビリティの継承

これほどまでに見た目が変化しても、ベースは標準のselect要素である。著者は、マウス操作だけでなくキーボードによる選択や、スクリーンリーダーによる読み上げといったブラウザ標準のアクセシビリティ機能がそのまま維持される点を強調している。

独自にUIコンポーネントを自作する場合、これらのアクセシビリティ対応をゼロから実装するのは非常に困難でミスが起きやすい。標準要素を拡張するこのアプローチは、堅牢なWebサイト制作において極めて合理的な選択と言える。

5. 実務での導入とプログレッシブ・エンハンスメント

非常に魅力的な新機能だが、現時点での導入には注意も必要だ。著者のPatrick Brosset氏も述べている通り、この機能はまだChromium系ブラウザの最新バージョンに限定された実装である。

ブラウザ互換性とフォールバック戦略

未対応のブラウザ(SafariやFirefoxなど)では、`appearance: base-select` が無視される。その結果、ユーザーには「標準的な、見慣れたセレクトボックス」が表示されることになる。

これは「プログレッシブ・エンハンスメント(段階的向上)」の考え方に合致する。最新ブラウザを使うユーザーにはリッチな体験を提供し、そうでないユーザーにも基本機能を損なうことなくコンテンツを届けることができる。著者は、デモの中で `@supports` を使って未対応ブラウザ向けのメッセージを表示する工夫も凝らしている。

Web制作における今後の展望

カスタマイズ可能なselect要素が一般化すれば、重い外部ライブラリに頼ることなく、ブランドイメージに合わせたUIが構築可能になる。特に、フォームのデザイン性を重視するキャンペーンサイトや、複雑なオプション選択が必要なECサイトにおいて、その価値は計り知れない。

今後の課題は、他のブラウザエンジン(WebKit, Gecko)での実装状況だ。クロスブラウザでの対応が進めば、Web制作のワークフローにおいて「セレクトボックスのカスタマイズ」はもはや悩みの種ではなく、クリエイティビティを発揮する場へと変わるだろう。

この記事のポイント

  • appearance: base-select を宣言することで、select要素の全パーツをCSSで制御可能になる。
  • sibling-index() や sibling-count() を使うと、要素の順序に基づいた動的なレイアウトがノーコードで実現できる。
  • Anchor Positioning により、ドロップダウンメニューをボタンの周囲の好きな場所に配置できる。
  • 三角関数(sin, cos) を活用すれば、円形などの複雑な配置もCSSのみで完結する。
  • 未対応ブラウザでは標準のselectとして動作するため、プログレッシブ・エンハンスメントとして導入しやすい。

出典

  • CSS-Tricks「Abusing Customizable Selects」(2026年3月11日)
海田 洋祐

・ 複数業界における17年間のデジタルビジネス開発経験 ・ ウェブサイト開発のためのHTML、PHP、CSS、Java等の実用的知識 ・ 15ヶ国語対応の多言語SaaSの開発経験 ・ 17年間にも及ぶ、Eコマース長期運営経験 ・ 幅広い業界でのSEO最適化の豊富な経験

メッセージを残す