0Pricing
CSS Academy · レッスン

ドロップダウンとポップオーバーのパターン

CSSの配置機能とPopover APIを使って、アクセシブルなドロップダウンメニューとポップオーバーを作成します。

「ドロップダウンとポップオーバーのパターン」はCoddyKit上の無料CSS Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCSS Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 CSS Academyコースには全4レッスンが含まれています。

Popover API

HTML の Popover API(Chrome 114 以降、広くサポートされています)は、宣言的な表示・非表示の動作を提供します。対象要素に popover 属性を、トリガーボタンに popovertarget を指定します。基本的な開閉に JavaScript は必要ありません。ライトディスミス(外側をクリックして閉じる)や Escape キーの処理も含まれます。

ポップオーバーのスタイル設定

[popover] または :popover-open を使ってポップオーバー要素を対象にします。背景を暗くするために ::backdrop 疑似要素も利用できます。ポップオーバーは dialog と同様に top layer に描画されるため、z-index の重なり順に関する問題は発生しません。

Anchor Positioning によるドロップダウンの配置

CSS Anchor Positioning(Chrome 125 以降)を使うと、JavaScript なしでポップオーバーをトリガーに対して相対的に配置できます。トリガーに anchor-name: --btn を、ポップオーバーに position-anchor: --btn を指定し、top: anchor(bottom); left: anchor(left) でトリガーの下に揃えます。

position: absolute のフォールバック

Anchor Positioning を使えない場合は、位置指定された親ラッパーを使います。コンテナに position: relative を、ドロップダウンに position: absolute; top: 100%; left: 0 を指定します。これはブラウザーを問わず動作しますが、位置指定されたコンテナ内でトリガーとドロップダウンを兄弟要素にする必要があります。

ドロップダウンメニューの CSS

ドロップダウンリストには position: absolute; background: var(--color-surface); box-shadow: var(--shadow-md); border-radius: var(--radius-md); padding: var(--spacing-1) 0; min-width: 200px を指定します。メニュー項目にはパディング、ホバー時の背景色、全幅表示を設定します。

アニメーション

@starting-style で表示時のアニメーションを、transition-behavior: allow-discrete で display プロパティの変更をアニメーションさせます。これにより、ポップオーバーの開閉状態に連動した表示・終了アニメーションを CSS だけで実現できます。

キーボードアクセシビリティ

ドロップダウンメニューはキーボード操作に対応する必要があります。矢印キーでメニュー項目間を移動し、Enter/Space でフォーカス中の項目を実行し、Escape でメニューを閉じてトリガーにフォーカスを戻します。Popover API は Escape を自動的に処理しますが、矢印キーによる移動には JavaScript のイベント処理が必要です。

カスタムドロップダウンの ARIA

Popover API を使わないカスタムドロップダウンでは、トリガーに aria-haspopup="listbox" と aria-expanded を、リストに role="listbox" を、各項目に role="option" と aria-selected を追加します。スクリーンリーダーは、展開状態と項目数を読み上げます。

オーバーフローとビューポートとの衝突

トリガーの下に配置したドロップダウンは、画面下部でビューポートからはみ出すことがあります。IntersectionObserver または getBoundingClientRect でこれを検出し、ドロップダウンをトリガーの上に反転させます。CSS Anchor Positioning では position-try-fallbacks を使って処理できます。

多階層ドロップダウン

ネストされたドロップダウン(サブメニュー)を追加すると、処理が複雑になります。サブメニューは親項目の右側に配置します。mouseout 時に CSS の transition-delay または JS の timeout を使って非表示までに遅延を設けると、マウスが斜めに移動したときにサブメニューが閉じるのを防げます。

タッチデバイスに関する考慮事項

ホバーをトリガーにしたドロップダウンは、ホバー状態がないタッチデバイスでは機能しません。どのデバイスでもクリックまたはタップをトリガーに使います。ポップオーバー API のライトディスミス、または開いているドロップダウンを閉じる document の click リスナーを使うと、外側をタップして閉じる動作を実現できます。

理解度チェック

Popover API は、以前はカスタム JavaScript が必要だったどのような処理を自動的に提供しますか?

まとめ

Popover API と CSS Anchor Positioning を組み合わせると、宣言的で JavaScript をほとんど使わないドロップダウンおよびポップオーバーのパターンを実現できます。より広いブラウザー対応が必要な場合は、位置指定されたコンテナのパターンが安定して機能します。キーボードアクセシビリティ、ARIA 属性、ビューポートとの衝突処理、タッチデバイスへの対応を加えることで、実運用に適したドロップダウンコンポーネントが完成します。

よくある質問

「ドロップダウンとポップオーバーのパターン」レッスンは無料ですか?

はい。「ドロップダウンとポップオーバーのパターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、CSS Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 CSS Academyコースには全4レッスンが含まれています。

「ドロップダウンとポップオーバーのパターン」で何を学びますか?

CSSの配置機能とPopover APIを使って、アクセシブルなドロップダウンメニューとポップオーバーを作成します。 ブラウザで直接実行するハンズオンコードでCSS Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

CSS Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCSS Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「ドロップダウンとポップオーバーのパターン」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCSS Academyレッスンでコードを書いて実行できますか?

はい。すべてのCSS Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. CSSカスタムプロパティによるカードコンポーネント
  2. モーダルとダイアログのスタイリング
  3. ドロップダウンとポップオーバーのパターン
  4. タブコンポーネント: :checkedハックとJSの比較
← CSS Academyに戻る