Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
ポップオーバー API は、他のページコンテンツの上に表示するポップオーバーのコンテンツを表示するための、標準的な、一貫性のある、柔軟な仕組みを開発者に提供します。ポップオーバーのコンテンツは、HTML 属性を用いて宣言的に、または JavaScript を用いて制御することができます。この記事では、この機能のすべてを使用するための詳細なガイドを提供します。
最も単純な形では、ポップオーバーのコンテンツを含む HTML 要素に popover 属性を追加すれば、ポップオーバーが作成されます。また、ポップオーバーとそのコントロールを関連付けるために id が必要です。
メモ: 値なしで popover 属性を追加すると、 popover="auto" を設定するのと同じになります。
この属性を追加すると、display: none をその要素に設定することで、ページ読み込み時に非表示にすることができます。ポップオーバーの表示・非表示を切り替えるには、1 つ以上の制御ボタン(ポップオーバーインボーカーとも呼ばれる)を追加する必要があります。<button>(または <input> の type="button")に popovertarget 属性を、制御するポップオーバーの ID を値として設定することすることにより、ポップオーバー制御ボタンに設定することができます。
既定では、ボタンはトグルボタンになっています。繰り返し押すと、ポップオーバーの表示と非表示が切り替わります。
この動作を変更したい場合は、 popovertargetaction 属性を使用します - これは "hide"、"show"、"toggle" の何れかの値を取ります。例えば、表示ボタンと非表示ボタンを別個に作成するには、次のようにします。
基本的な宣言的ポップオーバーの例(ソース)で、上記のコード片がどのように見えるかを確認できます。
メモ: popovertargetaction 属性が省略されると、制御ボタンで実行される既定のアクションは "toggle" になります。
ポップオーバーが表示されると、display: noneが削除されて最上位レイヤーに配置され、他のすべてのページのコンテンツの上に置かれるようになります。
commandfor 属性と command 属性は、popovertarget および popovertargetaction ととてもよく似た機能を提供しますが、より一般的な設計となっており、ポップオーバーコマンド以外の機能(独自のコマンドを含む)を提供することを目的としています。
前回のコードスニペットは同様に書き換え可能です。
上記のように、ポップオーバー要素に popover または popover="auto" が設定されている場合、その要素は自動状態 (auto state) であると言います。自動状態について注意すべき重要な動作が 2 つあります。
メモ: popover="auto" ポップオーバーは、文書内の他の要素で HTMLDialogElement.showModal() や Element.requestFullscreen() の呼び出しが成功した場合にも閉じます。しかし、これらのメソッドを表示されているポップオーバーに対して呼び出すと失敗することに留意してください。しかし、現在表示されていない popover 属性を持つ要素に対してこれらのメソッドを呼び出すことはできます。
自動状態は、一度に単一のポップオーバーだけを示したい場合に有益な機能です。表示したいチュートリアルの UI メッセージが複数あるが、表示が乱雑になって混乱するのを避けたい場合や、新しい状態が前回の状態を上書きするようなステータスメッセージを表示する場合などに利用できます。
上記のような動作は、複数の自動ポップオーバーの例(ソース)で実際に見ることができます。ポップオーバーを表示した後に簡単に解除してみて、同時に両方を表示しようとしたときにどうなるかを見てみましょう。
ポップオーバーとその制御元(インボーカー)が popovertarget 属性で関連付けられると、API は自動的に環境に対して以下の 2 つの変更を加え、キーボード操作や支援技術 (AT) を利用するユーザーがポップオーバーに作用することができるようにします。
この方法でポップオーバーとそのコントロール間の関係を設定すると、同時に両者の間に暗黙のアンカー参照も作成されます。詳細はポップオーバーのアンカー位置指定を参照してください。
ポップオーバーとインボーカーの関係は、popovertarget 属性を使用する以外にも、他の方法で設定することができます。
自動状態のほかに、手動状態があり、これはポップオーバー要素に popover="manual" を設定することで設定することができます。
この状態では、次のようになります。
この動作は、複数の手動ポップオーバーの例(ソース)で確認することができます。
ポップオーバーの表示または非表示に対しては、beforetoggle および toggle イベントを使用して応答することができます。
これらのイベントはどちらも ToggleEvent イベントオブジェクトを持ちます。このイベントは、デフォルトの Event オブジェクトから継承される機能に加えて、次の機能を備えています。
典型的な使用例は、次のようになります。
詳細情報と例については、前回の参照リンクを参照してください。
JavaScript API を使用してポップオーバーを制御することもできます。
HTMLElement.popover プロパティを使用して、popover 属性を取得したり設定したりすることができます。これを使用して JavaScript でポップオーバーを作成することができ、機能検出にも利用できます。例えばこのようになります。
同様に、
この 3 つを組み合わせると、次のようにポップオーバーとその制御ボタンをプログラム的に設定することができます。
また、表示・非表示を制御するためにいくつかのメソッドがあります。
例えば、ボタンをクリックしたり、キーボードの特定のキーを押したりすることで、ポップオーバーのオン/オフの切り替えを支援する機能を提供したい場合があります。最初のものは宣言的に実現できますが、上に示したように JavaScript を使用して実現することもできます。
2 つ目については、ポップオーバーを開くためのキーと閉じるためのキーの 2 つをプログラムするイベントハンドラーを作成することができます。
この例では、Element.matches() を使用して、ポップオーバーが現在表示されているかどうかをプログラムで調べています。:popover-open 擬似クラスは、現在表示されているポップオーバーだけに一致します。これは、すでに表示されているポップオーバーを表示しようとしたり、すでに非表示になっているポップオーバーを非表示にしようとしたときに発生するエラーを避けるために重要です。
別の方法として、次のように単一のキーでポップオーバーの表示と非表示をプログラムすることができます。
JavaScript のポップオーバーのプロパティ、機能検出、`togglePopover()' メソッドの動作は、トグルヘルプ UI の例(ソース)をご覧ください。
複数のオートポップオーバーを一度に表示しないというルールには、例外があります。互いに入れ子になっている場合です。これらの場合、複数のポップオーバーは、互いの関係から、同時に開くことが許可されます。このパターンは、入れ子式ポップオーバーメニューのような用途に役立ちます。
入れ子のポップオーバーを作成する方法は、3 つあります。
DOM での直接の子孫にする
要素を呼び出し/制御
anchor 属性による
例は、入れ子メニューの例(ソース)を参照してください。マウスやキーボードの操作でサブポップオーバーを適切に表示・非表示を切り替えるため、また、どちらかのオプションが選択されたときに両方のメニューを非表示にするために、いくつかのイベントハンドラーが使用されていることがわかります。SPA や複数ページのウェブサイトでは、新しいコンテンツの読み込みをどのように処理するかによって、これらのうちのいくつかは必要ないかもしれませんが、このデモでは説明のために含めています。
作成できるポップオーバーには 3 つ目の種類として、ヒントポップオーバーがあります。これはポップオーバー要素に popover="hint" を設定することで指定します。hint ポップオーバーは表示時に auto ポップオーバーを閉じませんが、それ以外の hint ポップオーバーは閉じます。簡単に閉じるが可能で、閉じるリクエストにも応答します。
これは、例えばツールバーボタンを押すと UI ポップオーバーを表示できるボタンであると同時に、ボタンにポインターを当てた際に UI ポップオーバーを閉じずにツールチップを表示したい場合などに有用です。
hint ポップオーバーは、非クリック JavaScript イベント(mouseover/mouseout や focus/ blur など)が発生すると、要素は表示・非表示されます。ボタンをクリックして hint ポップオーバーを開くための JavaScript が実行されると、開いている auto ポップオーバーは簡単に解除されるようになります。
以上の動作を正確に再現した例については、ポップオーバーヒントのデモ(ソース)をご覧ください。このデモではボタンバーを採用しています。ボタンを押すと、auto ポップアップサブメニューが表示され、さらに詳細なオプションを選択することが可能になります。ただし、ボタンに当てたまたはフォーカスした際には、各ボタンの機能を示すツールチップ(hint ポップオーバー)も同時に表示されます。このツールチップは、現在表示中のサブメニューを非表示にしません。
下記の節では、コードの重要な部分をすべて追ってみましょう。
メモ: hint ポップオーバーは、manual ポップオーバーと同時に使用できますが、実際にはその必要性はあまりありません。これらは主に auto ポップオーバーの制限を回避するために設計されており、この節で詳細に説明するように用途を拡大することができます。
なお、popover="hint" は未対応ブラウザーでは popover="manual" に代替されます。
メモ: 関連する機能として、インタレストインボーカーがあります。これは JavaScript を必要とせずに、ホバー/フォーカス時のポップオーバー機能を便利かつ一貫して生成するために使用できます。詳細については、インタレストインボーカーの使用方法をご覧ください。
ポップアップサブメニューは、auto ポップオーバーを宣言的に使用する形で生成されます。
まず、制御ボタンです。
そして、ポップオーバー自身です。
サブメニューのポップオーバーは現状でも問題なく動作し、ツールバーボタンを押すと開くためのものとして機能しています。しかし、ボタンにホバー/フォーカスした際に同時にツールチップも表示させるにはどうすればよいでしょうか?まず、HTML 内で hint ポップオーバーを使用してツールチップを作成します。
メモ: このデモではソースコードにおいて、ツールチップはポップオーバーコントロールボタン内に入れ子になっています。これは、CSS アンカー位置指定に対応していないブラウザーにおいて、より優れた代替手段を提供するからです。つまり、hint ポップオーバーは関連付けられたコントロールボタンの隣に表示され、全く異なる場所に表示されることはありません。
表示/非表示を制御するには、JavaScript を使用する必要があります。最初に、hint ポップオーバーと制御ボタンを 2 つの別個の NodeList で取得するために、 Document.querySelectorAll() を使用しています。
次に、関数 addEventListeners() を作成します。これは、4 つのイベントリスナーを(EventTarget.addEventListener() によって)指定された <button> に設定するものです。この <button> は btns NodeList の特定のインデックス値にあるものです。これらの関数は、tooltips NodeList の同じインデックス値にある hint ポップオーバーに対して動作します。これにより、ボタンとツールチップを同期することができるようになり、ボタンが対話された際に正しいツールチップを表示/非表示にできます。
このイベントリスナーは、mouseover および focus 時にポップオーバーを表示し、 mouseout および blur 時にポップオーバーを非表示にします。つまり、ツールチップはマウスとキーボードの両方でアクセス可能であるということです。
最後に、for ループを使用して、btns NodeList 内の <buttons> を反復処理し、それぞれの addEventListeners() 関数を呼び出します。これにより、すべてのボタンに目的のイベントリスナーが設定されます。
この節では、ポップオーバーに関連する CSS の選択と位置指定のテクニックを取り上げます。
単純な属性セレクターで、すべてのポップオーバーの選択が可能です。
あるいは、属性セレクターに値を指定することで、特定のポップオーバーの種類を指定することが可能です。
:popover-open 擬似クラスを使用して、示しているポップオーバーであるポップオーバーのみを選択できます。
::backdrop 擬似要素は、最上位レイヤーにあるポップオーバー要素のすぐ後ろに配置される全画面要素で、必要に応じてポップオーバーの後ろのページコンテンツに効果を追加することができるようにします。例えば、ユーザーの注意をポップオーバーに集中させるために、ポップオーバーの後ろのコンテンツをぼかしたい場合があります。
これがどのように描画されるかという考えについては、ポップオーバーの背景をぼかす例(ソース)を参照してください。
記事の冒頭でリンクされている最初のいくつかの例を見ると、ポップオーバーがビューポートの中央に表示され、コンテンツを囲み、黒い境界線があることに気づいたかもしれません。これはデフォルトのスタイルであり、UA スタイルシート内の以下のルールを用いて実現されています。
独自のサイズを適用し、ポップオーバーを別の位置に配置するには、以上のスタイルを次のように上書きできます。
ポップオーバーの位置指定の例(ソース)で、その独立した例を見ることができます。
ポップオーバー API が提供するもう 1 つの便利な位置指定オプションがあります。ポップオーバーをビューポートや配置された祖先要素ではなく、インボーカーに対して相対的に配置したい場合、ポップオーバーとそのインボーカーが暗黙のアンカー参照を持っているという事実を活用できます。
あらゆる種類のポップオーバーをそのインボーカーに関連付けると、両者の間に暗黙のアンカー参照が生成されます。これによりインボーカーがポップオーバーのアンカー要素となり、CSS アンカー位置指定を使用してポップオーバーを相対的に配置できる、ということになります。
ポップオーバーとインボーカーとの関連付けは暗黙的に行われるため、anchor-name および position-anchor プロパティを用いた明示的な関連付けは必要ありません。ただし、位置指定に関する CSS の指定は依然として必要です。
例えば、インセットプロパティに設定された anchor() 関数の値と、配置プロパティに設定された anchor-center の値を組み合わせて使用することができます。
または position-area プロパティを使用して、
position-area または anchor() を使用してポップオーバーを位置指定する場合、ポップオーバーのデフォルトスタイルが、設定しようとしている位置と競合する可能性があることに注意してください。主な原因は margin と inset のデフォルトスタイルであるため、以上の例のようにそれらをリセットすることをお勧めします。CSS ワーキンググループは、この回避策を要求されることを避ける方法を探しています。
アンカーと位置指定要素の関連付け、および要素をアンカーに対して相対的に位置指定する方法の詳細については、CSS アンカー位置指定の使用を参照してください。
メモ: 例えば、この暗黙の関連付けを使用した例については、ポップオーバーヒントデモ(ソース)を参照してください。CSS のコードを確認すると、anchor-name および position-anchor プロパティを使用して明示的なアンカー関連付けが行われていないことがわかります。
メモ: ポップオーバーがインボーカー要素にアンカーされるのを防ぐには、暗黙のアンカー参照を削除する必要があります。これを行うには、ポップオーバーの position-anchor プロパティを、現在のドキュメント内に存在しないアンカー名(--not-an-anchor-name など)に設定します。詳細はアンカー関連付けの削除も参照してください。
ポップオーバーは最上位レイヤーとアクセシビリティツリーから除去されたり追加されたりするだけでなく、非表示時には display: none;、表示時には display: block; に設定されます。したがって、ポップオーバーをアニメーションさせるには、 display プロパティをアニメーション可能にする必要があります。対応しているブラウザーでは、display を離散アニメーション型の変形でアニメーションさせます。具体的には、ブラウザーはアニメーションの再生時間全体にわたってコンテンツを表示させるように、 none と display の他の値を切り替えます。例えば、次のようになります。
メモ: CSS トランジションを使用してアニメーションを行う場合、上記の動作を有効にするには transition-behavior: allow-discrete を設定する必要があります。 CSS アニメーションでアニメーションさせる場合、既定では上記の動作が利用できます。
CSS のトランジションでポップオーバーをアニメーションさせる場合、以下の機能が必要です。
@starting-style アットルールポップオーバーが最初に表示されたときにトランジションさせたい、ポップオーバーに設定するプロパティの開始値のセットを提供します。これは予期しない動作を避けるために必要です。既定では、 CSS のトランジションは可視要素でプロパティがある値から別の値に変更されたときのみ発生します。要素の最初のスタイル更新時や display 型が none から別の型に変更されたときには発生しません。
display プロパティトランジションのリストに display を追加して、ポップオーバーがトランジションの再生時間の間、display: block (または他の表示可能な display 値)として残り、他のトランジションが確実に表示されるようにします。
overlay プロパティトランジションのリストに overlay を記述して、最上位レイヤーからのポップオーバーの除去をトランジションが完全に完了するまで確実に延期し、トランジションが確実に表示されるようにします。
transition-behavior プロパティtransition-behavior:allow-discrete を display と overlay のトランジション(または一括指定の transition)に設定し、既定ではアニメーション不可能なこれら 2 つのプロパティの離散トランジションを有効にします。
この例がどのように見えるものか、見ていきましょう。
この HTML では、 <div> 要素がポップオーバーになるよう、グローバル属性の popover で宣言されており、 <button> 要素をポップオーバーの表示コントロールとして指定されています。
トランジションさせたいポップオーバーのプロパティは、 opacity と transform の 2 つです。ポップオーバーが水平方向に拡大または縮小しながらフェードインまたはフェードアウトするようにします。これを実現するために、これらのプロパティの開始状態をポップオーバー要素の非表示状態([popover] 属性セレクターで選択)に設定し、終了状態をポップオーバーの表示状態(:popover-open 擬似クラスで選択)に設定します。また、transition プロパティを使用して、ポップオーバーが表示されたり非表示になったりするときにアニメーションするプロパティとアニメーションの再生時間を定義します。
前に説明したとおり、次のことを行う必要があります。
また、開くためのポップオーバーの背後に現れる ::backdrop にトランジションを記述子、暗くなるアニメーションを指定していることに注意してください。
このコードは次のように表示されます。
メモ: ポップオーバーは表示されるたびに display: none から display: block に変わるので、項目がトランジションするたびに @starting-style スタイルから [popover]:popover-open スタイルにトランジションします。ポップオーバーが閉じられたとき、 [popover]:popover-open 状態から既定の [popover] 状態にトランジションします。
このような場合、出現時と消滅時のスタイル設定を異なる形にすることが可能です。このことの証明については、開始スタイルを使用する場合のデモの例を参照してください。
CSSキーフレームアニメーションでポップオーバーをアニメーションさせる場合、いくつか注意すべき違いがあります。
例を参照してください。
HTML には、ポップオーバーとして宣言された <div> 要素と、ポップオーバーの表示コントロールとして指定された <button> 要素があります。
必要な出現アニメーションと消滅アニメーションを指定するキーフレームを定義し、背景は出現アニメーションのみを定義します。背景がフェードアウトするアニメーションは不可能であることに注意してください - 背景はポップオーバーが閉じられたときに DOM から即座に除去されるため、アニメーションするものはありません。
このコードは次のように表示されます。
This page was last modified on 2025年12月25日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.