popover属性で作るJavaScriptなしのポップアップ

popover 属性を使うと、JavaScriptを書かずに簡易なポップアップを実装できます。

しばらくコーディングから離れていましたが、HTMLもどんどん進化していきますね。四苦八苦しながらHTMLを勉強していた当時は、まさかHTMLだけでポップアップが出せる時代がくるとは思ってもいなかったです。

この記事では基本的な使い方と、似た機能を持つ <dialog> 要素との違いについてまとめます。


<dialog> 要素との比較

dialog要素もモーダルを表現するために使用されます。見た目や振る舞いがよく似ているため、違いを整理しておきます。

共通点

  • どちらもトップレイヤーに描画される(z-index や DOM の階層に影響されない)
  • ::backdrop で背面のスタイルを指定できる
  • JavaScriptから表示・非表示を切り替えられる

相違点

<dialog>popover
背面の操作不可(モーダル)可能
HTMLのみでの制御不可可能

背面の操作を許容するため、popover はモーダルよりもツールチップや通知バナーのような非ブロッキングなポップアップに向いています。


基本的な使い方(HTML のみ)

<button type="button" popovertarget="tip" popovertargetaction="toggle">
  ポップアップを表示
</button>

<div id="tip" popover>
  こんにちは
</div>

ポップアップ本体の属性

基本的には popover 属性を付与するのみ。
自動で閉じる機能を無効化したいとき(JavaScriptから明示的にとじたい時)は popover=”manual” を指定します。

属性説明
popoverポップアップとして機能させる
popover="manual"自動で閉じる動作を無効化し、JavaScript から明示的に制御する

コントローラー(ボタン)の属性

属性説明
popovertarget制御するポップアップ要素の id を指定
popovertargetactionクリック時のアクションを指定(省略可)

popovertargetaction に指定できる値:

  • toggle(デフォルト):表示・非表示を切り替え
  • show:表示のみ
  • hide:非表示のみ

表示位置について(CSS)

popover 属性はトップレイヤーに描画されるため、ほとんどのモダンブラウザでは以下のスタイルがデフォルトで適用されます。

[popover] {
  position: fixed;
  inset: 0;
  margin: auto;
}

何も指定しなければ画面中央に表示されます。ツールチップなど位置を指定したい場合は、position: absolute などで明示的に上書きすることが望ましいです。


JavaScript での操作

const popup = document.getElementById('tip');

popup.showPopover(); // 表示
popup.hidePopover(); // 非表示

注意: 古い記事では showPopup() / hidePopup() と記載されているものがありますが、現在の仕様では showPopover() / hidePopover() が正しいメソッド名です。

popover を持つ要素は複数を同時に表示することができます。

ツールチップなどでは問題ないでしょうが、「表示するのは常に1つだけ」といった制御が必要な場合は、JavaScript から操作するのがよいでしょう。


サンプルコード

実際に書いてみたコードはこちら。

🔗 CodePen で確認する

階層に左右されずトップレイヤーに表示されること、背面レイヤーも操作可能であること、popovertargetction属性の違いによる振る舞いの違いが確認できます。

タイトルとURLをコピーしました