ネイティブポップオーバー(popover)

popover popovertarget showPopover() hidePopover()

このページでは、HTML popover 属性を使ったJSなしのポップオーバー実装を確認できます。ツールチップ・ドロップダウン・手動制御トーストの3パターンをインタラクティブなデモで紹介します。

デモ1:基本ポップオーバー(JSなし)

popover 属性と popovertarget 属性を組み合わせるだけで、JavaScriptなしでドロップダウンメニューを実装できます。 外側をクリックまたはEscキーで自動的に閉じます。

メニュー


popover="auto" は外側クリック・Escキーで自動的に閉じます。popovertarget 属性だけで、JSなしで開閉が動作します。

デモ2:popover="hint"(ホバーで表示)

popover="hint" はツールチップ向けの軽量ポップオーバーです。Chrome 129以降で対応。 このデモでは showPopover() / hidePopover() でホバー連動を実装しています。

popover="hint" を使ったツールチップです。

Chrome 129以降で対応。

状態:closed
⚠️ popover="hint" は Chrome 129 以降の機能です。 このデモでは showPopover() /hidePopover() で同様の動作を実装しています。

popover="hint" はツールチップ向けの軽量ポップオーバーです。auto と異なり、 他の auto ポップオーバーを閉じません。

デモ3:popover="manual"(JS手動制御)

popover="manual" は外側クリックやEscキーで自動的に閉じません。showPopover()/ hidePopover() で完全に制御します。トーストやスナックバーに最適です。

popover="manual" は自動で閉じません。showPopover()/hidePopover()で完全に制御します。トーストやスナックバーに適しています。

保存しました(3秒で消えます)

HTML

html
<!-- ✅ デモ1: 基本ポップオーバー(JSなし) -->
<button popovertarget="my-popover">メニューを開く</button>

<div id="my-popover" popover>
  <p>ポップオーバーの内容です。</p>
  <button popovertarget="my-popover" popovertargetaction="hide">閉じる</button>
</div>

<!-- ✅ デモ2: popover="hint"(Chrome 129以降) -->
<button id="hint-trigger">ホバーで表示</button>
<div id="hint-popover" popover="hint">
  ツールチップのテキスト
</div>

<!-- ✅ デモ3: popover="manual"(JS制御) -->
<div id="toast" popover="manual">
  ✅ 保存しました
</div>

JavaScript

js
// ✅ デモ2: popover="hint" をホバーで制御
const trigger = document.querySelector('#hint-trigger');
const hint = document.querySelector('#hint-popover');

trigger.addEventListener('mouseenter', () => hint.showPopover());
trigger.addEventListener('mouseleave', () => hint.hidePopover());
trigger.addEventListener('focus', () => hint.showPopover());
trigger.addEventListener('blur', () => hint.hidePopover());

// ✅ デモ3: popover="manual" を JS で手動制御
const toast = document.querySelector('#toast');

function showToast() {
  toast.showPopover();
  setTimeout(() => toast.hidePopover(), 3000); // 3秒後に自動で閉じる
}

// ✅ popover のイベント
toast.addEventListener('toggle', (e) => {
  console.log('新しい状態:', e.newState); // "open" または "closed"
});

// ✅ CSS: ポップオーバーのスタイリング
/*
  [popover] {
    border: none;
    border-radius: 8px;
    padding: 12px 16px;
    box-shadow: 0 4px 12px rgba(0,0,0,0.15);
  }

  [popover]::backdrop {
    background: transparent; // auto の場合はバックドロップが出る
  }
*/

比較:popover の種類

種類閉じるトリガー他の auto を閉じるか用途
auto外側クリック・Esc✅ 閉じるドロップダウン・メニュー
hint外側クリック・Esc❌ 閉じないツールチップ(Chrome 129+)
manualJS のみ❌ 閉じないトースト・スナックバー

ライブラリを使ったポップオーバー・ツールチップの実装

アニメーション・配置制御・アクセシビリティが必要な場合はUIライブラリのコンポーネントが便利です。

🤖 AIプロンプトテンプレート

以下の要件を満たすTypeScript + Reactコンポーネントを作成してください。

- HTML の popover 属性を使ったネイティブポップオーバーを実装する
- popover="auto" + popovertarget でボタンとパネルを紐付け、JSなしで開閉できるようにする
- popover="manual" を使い、showPopover() / hidePopover() で手動制御するトーストUIを実装する
- toggle イベントを使って open/closed 状態の変化を検知する
- ポップオーバーのCSSスタイリング(border, shadow, animation)を含める
- コメントは日本語で記述する

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。