💬

JavaScriptなしで使える!Popover APIの基本的な使い方

に公開

はじめに

どうもどうも。
最近めっきり寒くなりましたねぇ。
さて、今回はPopover API(ポップオーバー API)について書いていきたいと思います。

Webサイトでツールチップやドロップダウンメニューを実装する時は、JavaScriptライブラリに頼ることが多かったと思います。

現在全ての主要ブラウザでサポートされているPopover APIを使えば、Javascriptを書くことなくHTMLとCSSだけでツールチップやドロップダウンメニューを実装することができるようになりました。

Popover APIについて

Popover APIとは

Popover APIは、他のコンテンツの上にポップオーバーコンテンツを表示するためのWeb標準APIです。
HTMLの属性やJavaScriptで制御する事ができます。

これまでの課題

これまでポップオーバーを実装する際には課題がありました。

  • z-indexの管理がカオス
  • フォーカスの制御がカオス
  • 外側クリックでの閉じる処理を実装する必要がある
  • JavaScriptライブラリへの依存

Popover APIが提供する機能

Popover APIを使用すると、ブラウザが自動的に以下を処理してくれます。
z-indexを気にしなくて良いというのが最高に良いですね!!!!

  • トップレイヤーへの自動的な配置 : z-indexを気にしなくてOK!
  • ライトディスミス機能 : 外側をクリックすると自動で閉じる
  • フォーカス管理 : ポップオーバーを開くとポップオーバーにフォーカスされる
  • キーボードバインディング : Escキーで閉じる

ブラウザサポート

基本的な機能は、主要なブラウザでサポートされています。
https://developer.mozilla.org/ja/docs/Web/API/Popover_API#ブラウザーの互換性

基本的な使い方

以下のように使用します。

<button popovertarget="popover1">ポップオーバーを開く</button>

<div id="popover1" popover>
  <p>ポップオーバーコンテンツ</p>
</div>

popovertarget属性でポップオーバーさせたい要素のIDを指定し、ポップオーバーさせたい要素にはpopover属性を指定します。
これだけで、以下の機能が動作します。

  • ボタンをクリックするとポップオーバーが表示される
  • 外側をクリックすると閉じる
  • Escキーで閉じる
  • フォーカス管理が自動的に行われる

具体的な挙動は以下で確認してください。

popover属性の値

popover属性にはauto | manual | hint3つの値を指定できます。

特徴 その他
auto
(初期値)
・ライトディスミス(外側クリックで閉じる)が有効
・他のautoポップオーバーを自動的に閉じる
一般的な使用ケースと思われます
manual ・ライトディスミスが無効
・他のポップオーバーを閉じない
・明示的に閉じるボタンが必要
トースト表示やドロップダウンのメニューに良さそう
hint
(初期値)
・ライトディスミスが有効
・他のポップオーバーを閉じない(hintは閉じる)
ツールチップに良さそう

挙動は以下から確認してください。
ただし、hintに関しては2025年10月現在、仕様通りの挙動とならないため注意が必要です。

popovertargetaction属性

ポップオーバーのトリガーとなる要素にpopovertargetaction属性属性を仕様してポップオーバーに対するアクションを指定できます。

popovertargetaction属性にはtoggle | show | hide3つの値を指定できます。

特徴
toggle
(初期値)
ポップオーバーの表示・非表示が切り替える
show ポップオーバーを表示するのみ
hide ポップオーバーを非表示にするのみ

挙動は以下から確認してください。

スタイリングによる位置調整

ポップオーバーの背景色などは通常の要素と同様に可能です。
ただし、ポップオーバーの表示位置に関しては、デフォルトでは画面の中央に配置されてしまいます。
かつ、要素との相対の位置指定ができないため、ツールチップのように特定の要素の相対位置に表示したい場合はCSS Anchor Positioningと組み合わせて対応しましょう。

基本的な使い方

anchor-nameposition-anchorで要素同士を関連付けて、position-areaで位置調整を行います。

HTML

<button id="menu-button" popovertarget="menu">メニュー</button>

<div id="menu" popover>
  <p>メニューコンテンツ</p>
</div>

CSS

/* ボタンをアンカーとして設定 */
#menu-button {
    anchor-name: --menu-anchor;
}

/* ポップオーバーをアンカーに紐付け */
#menu {
    position: absolute;
    position-anchor: --menu-anchor;
    
    /* ボタンの下・中央に配置 */
    position-area: bottom center;
    
    margin: 0;
    inset: unset;
}

挙動は以下から確認してください。

暗黙的なアンカー

popovertargetを使って、紐付けられたボタンは自動的にアンカーになるため、anchor-nameposition-anchorは不要です。便利ですね。

HTML

<button popovertarget="tooltip">ヘルプ</button>
<div id="tooltip" popover>ヘルプテキスト</div>

CSS

#tooltip {
    position: absolute;
    /* ボタンが暗黙的にアンカーになる */
    position-area: top center;
    margin: 0;
}

まとめ

Popover APIは、これまでJavaScriptライブラリに頼っていたポップオーバー実装を、Web標準として提供してくれるAPIです。

  • シンプル : HTMLだけで基本的な実装が可能
  • 高機能 : フォーカス管理、ライトディスミス、アクセシビリティが組み込み
  • 軽量 : 外部ライブラリ不要
  • 標準化 : 主要ブラウザでサポート

hintなど今後のブラウザ対応でどんどん便利になっていくので、今後も定期的に情報チェックが必要ですね。

それではみなさま、またいつか〜。

株式会社ソニックムーブ

Discussion