**カスタマイズ可能なドロップダウンを乱用する**

2026/03/19 3:23

**カスタマイズ可能なドロップダウンを乱用する**

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

この記事は、最近のChromiumベースブラウザが開発者にJavaScriptを一切使わずにインタラクティブで完全にスタイラブルな

<select>
要素を作成できる方法を説明しています。任意のHTMLを
<option>
タグ内に埋め込み、
::picker()
sibling-index()
などの新しいCSS機能を使用することで、デザイナーはデフォルトのドロップダウンをカスタムアニメーション、画像、カードスタイルレイアウトに置き換えつつ、ネイティブアクセシビリティを保持できます。

主なテクニックは次のとおりです:

  • ピッカーアイコンを隠す (
    select::picker-icon{display:none;}
    ) し、
    <select>
    を直接スタイル付けする(背景グラデーション、影など)。
  • ::picker(select){background:transparent;border:none;overflow:visible;}
    を設定して、オプションが従来のリストではなくフロートするようにする。
  • カスタムチェックマーク (
    option::checkmark{content:"●";color:#222;}
    ) や絵文字アイコンを
    option::before
    で追加する。
  • 「曲がったフォルダの山」デモでオプションを回転させるために
    sibling-index()
    を使用して漸進的な回転オフセットを計算し、開いたときにその回転を
    @starting-style
    でアニメートする。
  • <select>
    内に空の
    <button>
    を挿入(デフォルト選択内容を上書き)し、
    position-area:center center; inset:0;
    で中央配置、その後各カードを
    sibling-index()
    sibling-count()
    から派生した変換で位置決めすることで、ファン状のカードデッキを作成。
  • 「放射状絵文字ピッカー」でオプションを円形にレイアウトするには、
    sibling-index()
    sibling-count()
    から計算された角度に対して三角関数(cos, sin)を使用。

すべてのデモは、これらカスタマイズ可能なセレクトが優雅に退化することを示しています。古いブラウザは埋め込まれたHTMLを無視しプレーンテキストを表示しますが、新しいエンジンではリッチなスタイリング付きのフルHTMLコンテンツがレンダリングされます。記事は、こうしたネイティブサポートがさらに進化し(より多くの疑似要素やCSS変数を追加)複雑なUIパターンを簡素化し、開発者のJavaScriptオーバーヘッドを削減できると結論付けています。

本文

ウェブブラウザは常に新機能を導入していますが、その機能で「ばかげた」楽しいことが作れないと何の意味がありますでしょう?

この記事では、カスタマイズ可能な

<select>
を使って実装した数例を紹介し、それぞれの実装手順やテクニックを丁寧に解説します。
自分だけでなく、皆さんがより役立つアイデアを思いつくこともあるでしょう。私自身は少し大げさな発想を試すことで学びを深めています。

まず、ブラウザ互換性について一言。この記事のデモは、現在カスタマイズ可能な

<select>
が実装されている最新の Chromium 系ブラウザでのみ動作します。ただし、この機能は「非対応ブラウザを壊さない」設計になっており、未対応の場合は通常の
<select>
とオプションが表示されます。つまり、デモ自体は進化した見た目になるかどうかだけで、基本的な動作は保証されています。


1. 曲げられたフォルダスタック

最初に紹介するデモは、選択肢を「フォルダの山」にして、クリックすると曲がるように見えるものです。

HTML

<select>
  <option value="documents"><span>Documents</span></option>
  <option value="photos"><span>Photos</span></option>
  <option value="music"><span>Music</span></option>
  <option value="videos"><span>Videos</span></option>
  <option value="downloads"><span>Downloads</span></option>
  <option value="desktop"><span>Desktop</span></option>
  <option value="projects"><span>Projects</span></option>
  <option value="backups"><span>Backups</span></option>
  <option value="trash"><span>Trash</span></option>
</select>

フォルダ名は

<span>
で包み、後でスタイルを付けやすくしています。古いブラウザでは余計な要素が無視され、テキストだけが表示されます。

基本スタイリング

/* カスタマイズを有効化 */
select,
::picker(select) {
  appearance: base-select;
}

/* デフォルトのピッカーアイコンを隠す */
select::picker-icon { display: none; }

/* ボタン風に見せる */
select {
  background: linear-gradient(
    135deg,
    rgba(40,40,50,.4) 0%,
    rgba(60,60,70,.25) 50%,
    rgba(50,50,60,.35) 100%
  );
  backdrop-filter: blur(12px) saturate(180%);
  box-shadow:
    0 8px 32px rgba(0,0,0,.2),
    inset 0 1px 1px rgba(255,255,255,.15),
    inset 0 -1px 1px rgba(0,0,0,.1);
  border: 1px solid rgba(255,255,255,.2);
  color: white;
  min-inline-size: 12rem;
}

ドロップダウン部分

/* 背景を透明にしてオーバーフロー許可 */
::picker(select) {
  background: transparent;
  border: none;
  box-shadow: none;
  overflow: visible;
}

/* チェックマークをディスクアイコンに差し替え */
option::checkmark { content: "●"; color: #222; }

/* 各オプションの前にフォルダ絵文字を追加 */
option::before {
  content: "📁";
  margin-right: .5em;
}

スタックを曲げる

/* 隣接する兄弟要素のインデックスで回転角を決める */
option {
  --rotation-offset: -4deg;
  rotate: calc(sibling-index() * var(--rotation-offset));
  transform-origin: right calc(sibling-index() * -1.5rem);
}

/* セレクトが開いたときに回転をアニメーション化 */
option { rotate: 0deg; transition: rotate .3s cubic-bezier(.34,1.56,.64,1); }
select:open option { rotate: calc(sibling-index() * -1 * var(--rotation-offset)); }

/* 表示時にトランジションが走るように */
@starting-style {
  select:open option { rotate: 0deg; }
}

/* アニメーションを遅延させて段階的に表示 */
option { transition-delay: calc((sibling-index() - 1) * .01s); }

結果として、ボタンをクリックするとアニメーションで曲がったフォルダの山が現れます。


2. フラットなカードデッキ

次に紹介するのは、カードゲーム風に「開くと広がる」デッキです。

HTML

<select>
  <button></button> <!-- デフォルトの selectedcontent を抑制 -->
  <option class="red" value="QH">
    <span class="rank">Q</span>
    <span class="suit">♥</span>
  </option>
  <!-- 他のカードも同様に追加… -->
</select>

空の

<button>
を入れることで、ブラウザが自動で挿入する
<selectedcontent>
を防ぎ、デッキの裏面を静的に保ちます。

基本スタイリング

select {
  background:
    repeating-linear-gradient(45deg,
      transparent, transparent 1vmin,
      rgba(255,255,255,.05) 1vmin,
      rgba(255,255,255,.05) 2vmin),
    repeating-linear-gradient(-45deg,
      transparent, transparent 1vmin,
      rgba(255,255,255,.05) 1vmin,
      rgba(255,255,255,.05) 2vmin),
    linear-gradient(135deg,#8b0000 0%,#dc143c 50%,#8b0000 100%);
}

ドロップダウンの位置決め

::picker(select) {
  position-area: center center;
  inset: 0; /* 利用可能な全領域を使う */
}

select:open::picker(select) { display: flex; }

カードのファン回転・平行移動

option {
  --card-fan-rotation: 7deg;
  --card-fan-spread: -11vmin;
  --option-index: calc(sibling-index() - 1);
  --center: calc(sibling-count() / 2);
  --offset-from-center: calc(var(--option-index) - var(--center));

  rotate: calc(var(--offset-from-center) * var(--card-fan-rotation));
  translate: calc(var(--offset-from-center) * var(--card-fan-spread)) 0;
  transform-origin: center 75vmin;
}

アニメーション

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

@starting-style { select:open option { --card-fan-rotation: 0deg; } }

option { transition: --card-fan-rotation .2s ease-out; }
select:open option { --card-fan-rotation: initial; }

<select>
を開くと、カードが滑らかに広がっていきます。


3. 放射状絵文字ピッカー

最後に紹介するのは、円形に並ぶ絵文字を選択できるデモです。

ドロップダウンを円の中に配置

::picker(select) {
  top: calc(anchor(top) - var(--radius));
  left: calc(anchor(left) - var(--radius));
  width: calc(var(--radius)*2 + var(--option-size));
  height: calc(var(--radius)*2 + var(--option-size));
}

オプションを円周上に配置

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>
のサンプルです。
要素自体はまだ
<select>
そのままで、非対応ブラウザでも通常のセレクトボックスとして機能します。そのため「段階的拡張」(progressive enhancement) として非常に安全かつ強力な手法と言えるでしょう。

ぜひ自身で色々試し、楽しい UI を作ってみてください。 Happy coding!

同じ日のほかのニュース

一覧に戻る →

2026/03/24 7:52

Windows 3.1 用 タイル背景 .bmp アーカイブ

## Japanese Translation: GitHubは、コード作成・ワークフロー自動化・セキュリティ・コミュニティ協働を向上させるAI搭載の開発者ツールとエンタープライズサービスの包括的なスイートを提供します。 - **AI コード生成**:Copilot、Spark、および Models は開発者がコードを自動で生成・改善するのに役立ちます。 - **開発者ワークフロー**:Actions、Codespaces、Issues、Plan、Code Review が、コーディングからデプロイまでの開発パイプライン全体を統括します。 - **セキュリティ**:GitHub Advanced Security は脆弱性を検出しシークレットを保護します;エンタープライズグレードのセキュリティは Copilot for Business にバンドルされています。 - **エンタープライズプラットフォーム**:AI 搭載の開発環境とプレミアムサポートにより、大規模チームがスケールで高度なツールを採用できるようになります。 - **ユースケースの幅広さ**:このスタックは、医療・金融・製造・政府などの業界で App Modernization、DevSecOps、および CI/CD をサポートします。 - **マーケットプレイスとコミュニティ**:Advanced Security のようなアドオンは Marketplace で入手可能です;Sponsors、Security Lab、Maintainer Community、Accelerator、Stars、Archive Program といったイニシアチブがオープンコラボレーションを促進します。 - **ドキュメントとサポート**:GitHub は包括的なドキュメント、ブログ、変更ログ、およびユーザー向け専用サポートチャネルを提供しています。 今後の展望として、GitHub は AI 統合を深化させ、エンタープライズ機能を拡充し、業界固有のサポートを拡大することを計画しており、デジタルトランスフォーメーションの加速、コード品質基準の向上、および組織全体でのセキュリティ強化に寄与すると期待されています。

2026/03/24 3:40

既存の研究アイデアに対する自己主導型調査

## Japanese Translation: 研究は、検索空間とサンドボックス制約が厳密に定義された場合、LLM駆動エージェントが機械学習トレーニングパイプラインを自律的に改善できることを示しています。エージェントは制限付きループで動作します:仮説 → `train.py`/`program.md` を編集(メモリ用にスクラッチパッド使用)→ トレーニング(RTX 4090 で約800ステップ ≈ 3 分)→ 平均順位を評価し、コミットまたはロールバック。各実行はノイズ過剰適合を防ぐために約5 分の壁時計時間で制限されます。 トレーニングは医療用X線データセットから始まり、その後 Ukiyo‑eVG(≈11 K 日本の木版画)へ切り替えました。フレーズ注釈はガウスヒートマップに変換され、追加の「視線」入力として使用されました。CLIPバックボーンは ViT‑Small (22 M) + DistilBERT (66 M) + HeatmapProcessor (~90 M パラメータ) で構成され、ホールドアウト1 Kテストセットで評価しました(ベースライン平均順位 344.68、R@1 img→txt 17.2%、txt→img 16.5%)。 1日間にわたりエージェントは42実験を実行し、そのうち13がコミットされ29がロールバックされました。平均順位は344.68から157.43へ(54 %減少)しました。主な向上は温度制限修正(-113点)と Optuna++ ハイパーパラメータ調整(-30点)によるもので、他のアーキテクチャ変更はほぼ影響がありませんでした。フェーズ 4/5では成功率が低下し、多くの「スパゲッティ」仮説が失敗しました;サンドボックス違反は、エージェントが未承認の bash 呼び出しを試みたりループを早期に停止した際に発生しました。 実験は、LLM エージェントが明確に定義された検索空間内で機械学習研究を自律的に推進できることを示していますが、予期せぬ(「未知の未知」)挙動には苦戦し、厳格なサンドボックス化が必要です。将来の作業では計画段階やサブエージェントを導入して、1実験あたりの単一変更制限を克服し、ハイパーパラメータのより深い探索と成功率の向上を可能にすることが考えられます。

2026/03/22 0:07

**朱祁:磁器修復の技術**

## Japanese Translation: **概要:** ジュチ(锔瓷)は、宋代(960‑1279)に遡る中国の破損した磁器を修復する工芸です。13世紀の絵画に作業員が壊れた陶器を修理している様子が描かれており、ユネスコはジュチを無形文化遺産として認定しています。この技術では、職人が**脆弱な磁器に穴を開け、慎重に手作業で製造した金属のスタープレート(銅、鉄、または貴金属)を挿入し、裂け目を覆いながら物体の機能と美的整合性を保ちます**。ジュチは「不完全さの美」を称える哲学を具現化しており、日本の金継ぎ(壊れた陶器を漆で修復し、金箔で縫い合わせる)と類似しています。両方の伝統において、裂け目は再生されたアイデンティティへ変容し、人生に伴う傷や回復力を象徴します

**カスタマイズ可能なドロップダウンを乱用する** | そっか~ニュース