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

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

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

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

Q&A

解決済

1回答

1088閲覧

JavaScript マウス座標を記録して再生しオブジェクトを移動

pppo

総合スコア3

JavaScript

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

0グッド

0クリップ

投稿2021/06/05 18:47

前提・実現したいこと

JavaScript初心者です やろうとしてることがうまくいきません

div内でマウスを動かし、その座標を記録、再生しオブジェクトを移動するといったものです

下記ソースコードを実行すると一見動いてるように見えるのですが、

一瞬style.topとstyle.leftが0のような状態になり、オブジェクトに座標にちらつきが発生します

このちらつきはなぜ発生するのでしょうか?

原因がわかる方いましたら回答お願いいたします

該当のソースコード

<div id="field" style="position:relative;width:550px;height:550px;background:yellow"> <font id="xy" style="width:50px;height:50px;position:absolute"></font></div> <script> function p() { //座標を配列に入れる x.push(event.offsetX); y.push(event.offsetY); } var x=[]; var y=[]; var j=0; function rec(){ if(j<1){//1秒間のみの座標を記録 setTimeout("rec()",1000); j++; }else{ //1秒たったらply()で再生 j=0; ply(); rec(); } } var i=0; function ply(){ //読み込んだ座標へObjectを移動させる if(x.length>i){ xy.style.left=x[i]+'px'; xy.style.top=y[i]+'px'; setTimeout("ply()",1); xy.innerText="X:"+x[i]+" Y:"+y[i]; i++; } } window.onload=function(){ xy.style.transition = "all 0.001s"; field.addEventListener('mousemove', p); rec(); } </script>

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

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

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

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

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

guest

回答1

0

ベストアンサー

チラつきの原因は、座標を表示しているxyオブジェクトの上にマウスが重なると、小さい座標を拾ってしまうので、左上に移動してしまうようです。

pointer-events:noneを入れることでマウスイベントを拾わなくなります。

<font id="xy" style="width:50px;height:50px;position:absolute;pointer-events:none"></font>

また、1ミリ秒での更新をされていますが、ブラウザのFPSは高くないため、17ミリ秒(FPSが約60)くらいで十分かと思います。
ご参考になりましたら幸いです。

投稿2021/06/05 20:19

gas.engine

総合スコア608

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

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

pppo

2021/06/06 00:46

回答ありがとうございます 無事変な動きがなくなりました! >1ミリ秒での更新をされていますが、ブラウザのFPSは高くないため、17ミリ秒 こういうことでしょうか? setTimeout("ply()",17); あと、こういう変な動きをした場合どうやって原因を特定したんでしょうか? コンソールにもエラーログとして出ていないので特定が困難でした
gas.engine

2021/06/06 04:15

特定したこと自体は経験と推測です。 突然、座標が(0,0)近いところに移動したので、しばらく試したのち要素が重なっていて別の要素を拾ったのではと考えました。
gas.engine

2021/06/06 04:18

>setTimeout("ply()",17); >xy.style.transition = "all 0.017s"; これでも十分スムーズに移動するのと無駄に負荷がかからないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問