ネイティブポップオーバー(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以降で対応。
popover="hint" は Chrome 129 以降の機能です。 このデモでは showPopover() /hidePopover() で同様の動作を実装しています。popover="hint" はツールチップ向けの軽量ポップオーバーです。auto と異なり、 他の auto ポップオーバーを閉じません。
デモ3:popover="manual"(JS手動制御)
popover="manual" は外側クリックやEscキーで自動的に閉じません。showPopover()/ hidePopover() で完全に制御します。トーストやスナックバーに最適です。
popover="manual" は自動で閉じません。showPopover()/hidePopover()で完全に制御します。トーストやスナックバーに適しています。
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
// ✅ デモ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+) |
| manual | JS のみ | ❌ 閉じない | トースト・スナックバー |
ライブラリを使ったポップオーバー・ツールチップの実装
アニメーション・配置制御・アクセシビリティが必要な場合はUIライブラリのコンポーネントが便利です。
🤖 AIプロンプトテンプレート
以下の要件を満たすTypeScript + Reactコンポーネントを作成してください。 - HTML の popover 属性を使ったネイティブポップオーバーを実装する - popover="auto" + popovertarget でボタンとパネルを紐付け、JSなしで開閉できるようにする - popover="manual" を使い、showPopover() / hidePopover() で手動制御するトーストUIを実装する - toggle イベントを使って open/closed 状態の変化を検知する - ポップオーバーのCSSスタイリング(border, shadow, animation)を含める - コメントは日本語で記述する
⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。