質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

1976閲覧

[JavaScript] onmousemoveで子要素にバブリングさせない方法はありますか?

NieeeR

総合スコア2

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/10/04 09:04

前提

<div>内にオンマウスでJavaScriptのonmousemoveでイベント発火とマウス座標を取得、<div>の子要素<span>がマウス位置を追随(マウス位置と重なる)、……というところまでは出来ました。

発生している問題

<div>内であっても、子要素の<span>にマウスが入る=<div>から出た、となって、マウスを動かすたびに<span>が初期位置に戻ったり戻らなかったりする。

実現したいこと

追随させたいのでonmouseenterではダメで、<span>がマウスと重なる位置に来る、というところも外せないです。

mouseover → onmouseenter、mouseout → mouseleave のように、onmousemoveで子要素にバブリングさせない方法はありますか?
または同様のことを実現可能な他の手法はありますか?

該当のソースコード

JavaScript

1// なるべく旧ブラウザにも対応の書き方。 2// htmlは<div class='DIVs'><span>*</span></div> 3 4var DIVs = document.querySelectorAll('.DIVs'); 5// 同ページ内に複数あるのでfor 6for (var i = 0; i < DIVs.length; i++) { 7 DIVs[i].onmousemove = function(event){ 8 this.children[0].style.top = event.offsetY -10 + 'px'; 9 this.children[0].style.left = event.offsetX -10 + 'px'; 10 } 11 // <div>からマウスが外れたら<span>は元の位置へ 12 DIVs[i].onmouseleave = function(){ 13 this.children[0].style.top = '0'; 14 this.children[0].style.left = '0'; 15 } 16};

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

<span>を背面に移動させたらどうでしょう。

css

1.DIVs span { 2 3 position: absolute; 4 z-index: -1; 5}

マウスイベントを無効にした方がいいかな。

css

1.DIVs span { 2 3 position: absolute; 4 pointer-events: none; 5}

CSSの設定で回避できましたが、
jsだけでなぜうまくいかないのか、気になったので調べてみました。
イベントのバブリングは、この場合、原因ではないような気がしたので。

原因は、下記に記述のある座標値の原点の問題だと思います。

event.offsetX,Yの罠...どこが原点の座標値なのかを理解する (currentTargetとtarget) - Qiita

この場合,event.offsetX,Yで取得される座標値は,そのイベントハンドラが付与されている要素(boxA)の左上を原点としたものではなく,マウスが載っている要素(boxB)の左上を原点とした座標値になります.

上記には、座標値の変換方法の記載もありますが、かなり面倒なので、CSSで回避するほうがシンプルですね。

投稿2021/10/04 10:37

編集2021/10/04 13:04
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NieeeR

2021/10/04 11:32

なるほど、CSSのほうに解決策があったのですね。 <span>のCSSに{pointer-events:none}で解決しました、ありがとうございます! ならばついでにと、バブリング避けでonmouseleaveにしてた部分もonmouseoutにしてより旧ブラウザ対応をカバー出来て一石二鳥の感謝です。 <div>にも<span>にも背景色付ける予定だったので今回は下敷きは見送りましたが、透明な要素のケースでの技の引き出しとして{z-index:-1}もとても参考になりました。
NieeeR

2021/10/04 21:06

--- 確かに。マウス外れて初期位置に戻すとこはonmouseleaveにしたんだから、そこはバブリングしませんもんね。 試しにmouseleave(out)で初期位置に戻る部分とpointer-eventsを両方消すと、<div>から外れても初期位置に戻らないのに<span>に重なると初期位置に戻ろうとしました。 (厳密には<span>に乗って戻りかけて、<span>が外れて<div>に直乗りになるとまたマウスに寄ってくる、というウロウロした挙動) onmousemoveはバブリングするとの仕様ですが、子要素に乗ると子要素からの座標になってしまうというのが『取得される座標がバブリングしてる』ということでしょうかね……。
NieeeR

2021/10/04 21:19

<span>に重なると初期位置に戻ろうと →初期位置というか、子要素からの座標だと座標値がより初期位置に近い計算になるので、初期位置に戻るのに似た方向へ動く、ということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問