トリガーボタンに追従するドロップダウンメニュー

position-area: bottom-start と position-try-fallbacks を使って、トリガーボタン直下に開くドロップダウンメニューを構築。

UI Patterns

詳細な説明

セットアップ

ドロップダウンはアンカーポジショニングの典型的なユースケースです:上にトリガーボタン、メニューパネルがその左下角から開きます。

.menu-trigger {
  anchor-name: --menu-1;
}

.menu-panel {
  position: absolute;
  position-anchor: --menu-1;
  position-area: bottom-start;
  margin-top: 4px;
  min-width: anchor-size(width); /* トリガー幅にマッチ */

  /* ビューポート端でグレースフルに回復 */
  position-try-fallbacks:
    flip-block,            /* 上向きを試す */
    flip-inline,           /* 右向きを試す */
    flip-block flip-inline; /* 上 AND 右を試す */
}

anchor-size(width)

anchor-size() 関数はアンカー要素のサイズを返します。min-width: anchor-size(width) を指定すると、ドロップダウンパネルがトリガーと同じ幅以上になります — select 風ドロップダウンの定番動作です。anchor-size(height) でアンカーの高さに合わせることもできます。

position-area: bottom-start のセマンティクス

bottom は「アンカーの下」、start は「インライン軸の始端に揃える」(LTRなら左、RTLなら右)を意味します。つまり bottom-start はメニューの左上角をアンカーの左下角に合わせます。比較:

  • bottom-end — メニューの右上角をアンカーの右下角に(右揃えドロップダウン)
  • bottom — アンカーの下に水平方向の中央揃え(メニューでは稀)

フォールバックの順序が重要

ブラウザはフォールバックを 順番に 試して、はみ出さずに収まる最初のものを採用します。上の順序(flip-blockflip-inline → 両方)は垂直方向の反転を優先します(下に入らないメニューはサイドではなく上に開くべき)。サイドバーメニューでは順序を逆にして水平反転を優先するのが自然です。

4px のギャップ

margin-top: 4px でトリガーとメニューの間に小さな視覚的隙間を作ります。0だとホバー状態が引っかかる感じになるので避けてください。

ユースケース

アプリバーのオーバーフローメニュー、プロフィール/アカウントメニュー、オートコンプリート候補(サブメニューなし)、言語ピッカー、ソート/フィルターのドロップダウン、ボタントリガーから開くコンテキスト風メニュー。

試してみるCSS アンカーポジショニング ジェネレーター

フルツールを開く