[JavaScript]親要素の表示領域でクリックしているかを判定する方法
たとえばhtmlの要素が.container
> .box
みたいな構造になっていて、.container
が表示されているところだけをクリック可能にしたいなんてときの話。
子要素の.box
をクリックしたときは.container
に仕込んだイベントを発火しないようにしたい。
通常は.container
に仕込んだイベントリスナーは子要素をクリックしたときにも発火してしまう。
この問題を解決したサンプルコードはこちらです。
See the Pen クリックした要素の情報を得る by Makoto Ohnami (@zohnami) on CodePen.
ポイントは.box
の座標をgetBoundingClientRect
で取得して、その範囲外のときのみクリック時の処理を実行するようにしたところです。
力技感が出ていますが以下のようにクリック時の座標と突き合わせをして判定をしています。
const box = document.querySelector('.box');
const boxRect = box.getBoundingClientRect();
const container = document.querySelector('.container');
container.addEventListener('click', (event) => {
if (event['pageX'] < boxRect.left
|| event['pageX'] > boxRect.right
|| event['pageY'] < boxRect.top
|| event['pageY'] > boxRect.bottom) {
alert('hit !!!!');
}
});
getBoundingClientRect
を使うと、要素の四隅の座標を取得できます。
イベントリスナーで受け取るevent
にはイベントが発生したところの座標が情報として含まれています。
pageX
とpageY
はそのhtmlページ全体(画面に隠れているところも含む)を基準とした絶対座標が格納されています。今回はこちらを使いました。
他にも、以下のリンク先のようにoffset
やclient
、screen
というのがあるようで、その辺は目的に応じて使い分けする感じですね。
そもそも、親要素だけをクリック可能にしたいとかある?って話ですが自分の場合、モーダルを出現させたときにモーダルの背景は半透明のグレーにして、そのグレー領域をタップしたらモーダルを閉じる、みたいなことをやりたくてこの方法にたどり着きました。
もっと良いやり方があるよ、というのがあったら教えてください。
この記事の環境情報
- Google Chrome 108.0.5359.124
- なぜだか眠い
htmlに関する他の記事を読む
- 続・cssの一箇所を変更してテーマ全体を入れ替える
- cssの一箇所を変更してテーマ全体を入れ替えるサンプル
- [CSS]背景色を点滅させるアニメーションサンプル
- クリックしたときにCSSで線を引くサンプル
cssに関する他の記事を読む
- nth-childの疑似要素で3番目以降にスタイルを全適用する
- 続・cssの一箇所を変更してテーマ全体を入れ替える
- cssの一箇所を変更してテーマ全体を入れ替えるサンプル
- [CSS]背景色を点滅させるアニメーションサンプル
最近の記事を読む
- Flutterでcontextを使わずにlocale情報を取得する
- Cloud RunでIAPを有効にしようとしてハマったこと
- slimでtype='application/ld+json'のscriptタグを書く
- タグマネージャーでjsのloadイベントを発火させたいとき
- mysqlコマンドを実行してERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)と言われたら