ろぼいんブログ

Popover APIで背景の要素をクリックできないようにする方法

HTMLのPopover APIを使うと、JavaScriptを使わずにHTMLのみでポップオーバーを実装できます。また、CSSの::background疑似要素を利用することでポップオーバーの背景を暗くしたりぼかしをかけたりできます。

しかし、MDNで次のように説明されているとおり、ポップオーバーを表示しているときでもポップオーバー以外の部分はクリック可能な状態になっています。

- モーダルというのは、ポップオーバーが示されている間、ページの残りの部分は、ポップオーバーが何らかのアクションを起こすまで(例えば、重要な選択がなされるまで)、反応しないようにレンダリングされるということです。
- 非モーダルというのは、ポップオーバーが表示されている間も、ページの残りの部分が反応するようにするということです。

ポップオーバー API を使用して作成されたポップオーバーは常に非モーダルです。

——『ポップオーバー API - Web API | MDN

つまり、::background疑似要素をクリックすることでポップオーバーを非表示にできますが、このときに疑似要素の下にある要素にクリックが「貫通」してしまうということです。

広告

これを防ぐには、次のようなCSSを適用します。

body:has([popover]:popover-open) {
pointer-events: none;
}
[popover]:popover-open {
pointer-events: auto;
}

:popover-open疑似要素を活用することで、ポップオーバー要素が表示されているときにのみスタイルを適用できます。

この特性を利用して、ポップオーバーが表示されているときにはbody要素をクリック不可に設定し、ポップオーバー要素内はクリックできるようにします。

また、user-selectプロパティを使うことで、ポップオーバーが表示されているときにテキスト選択を無効にすることもできます。

body:has([popover]:popover-open) {
pointer-events: none;
user-select: none;
}
[popover]:popover-open {
pointer-events: auto;
user-select: text;
}

記事をシェア

Xに共有するBlueskyに共有するMisskeyに共有するLINEに共有するThreadsに共有する

フォローして最新情報を入手

Googleの優先ソースに追加すると、このサイトの記事をGoogleで見つけやすくなります。また、ぜひXやRSSフィードもフォローしてください。

Googleの優先ソースとして追加するGoogleの優先ソースとして追加するXのロゴ
著者のアイコン画像

生まれた時から、母国語よりも先にJavaScriptを使っていました。ネットの海のどこにもいなくてどこにでもいます。

Webフロントエンドプログラマーとして、TypeScriptを用いたWebアプリやブラウザー拡張機能を制作。Xのシャドウバン検知ツール「Shadowban Scanner」やリンクカード復活ツール「Restore Link Card」を公開し、国内外のメディアで紹介されました。iGEM 2023ではJapan-UnitedチームのWikiを制作してGrand Prizeの獲得に貢献。ブログではXやSNSの最新ニュース、不具合の検証と対処法、フロントエンド開発の知見を発信しています。