• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マウスの入って来た方向を検出するホバーエフェクト)

マウスの入って来た方向を検出するホバーエフェクト

このQ&Aのポイント
  • マウスの入って来た方向を検出するホバーエフェクトの作り方と特徴
  • マウスの方向を検出する関数の解説と使用する三角関数の役割
  • jQueryを使用してマウスの方向を検出してホバーエフェクトを実装する方法

質問者が選んだベストアンサー

  • ベストアンサー
  • usami33
  • ベストアンサー率36% (808/2210)
回答No.1

まずは x = (event.pageX - offset.left - w / 2) * ((w > h)? h / w: 1), 置き換えると x = (マウスの位置 - 要素の座標 - 要素サイズの半分) * ((w > h)? h / w: 1), x = (要素の中心からの距離) * ((w > h)? h / w: 1), x = (要素の中心からの距離) * 要素の縦横比(アスペクト比), x = アスペクト比を考慮した円周上の点    ※縦横が同じ比なら真円、異なれば楕円上の座標 つぎは direction = Math.round((Math.atan2(y, x) * (180 / Math.PI) + 180) / 90 + 3) % 4; direction = Math.round((Math.atan2(y, x) * (180 / 円周率) + 180) / 90 + 3) % 4; direction = Math.round(ラジアン * (180 / 円周率) + 180) / 90 + 3) % 4; direction = Math.round(角度 + 180) / 90 + 3) % 4; この段階で、中心からの角度となりますが、負の値も含むので、180度足して正の値の角度にします direction = Math.round(角度 ) / 90 + 3) % 4; で/ 90で4方向に分け、+3で端数切り上げ roundで四捨五入して% 4でふたたび4等分 ※ここの計算はかなりくどいですね、なんでもっと簡単な式にしないのだろうか?

tmctmc
質問者

お礼

ご説明本当にありがとうございます。m(_ _)m 全く分からなかったのでこれでどのような仕組みか何となく分かりました。m(_ _)m アスペクト比をかけるのはどういったような意味があるのでしょうか。 試しにアスペクト比を無くしても機能しました。 また、最後の+3で端数切り上げという事ですが、これをする事で0が3になり、1が0になり、2が1になり、3が2になりますが、 これをする事で、switchに返る数を調整しているという事でよろしいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • マウスを避けるムービークリップ

    マウスが近づくと逃げるMCを制作しようとしているのですが、 思うようにいかず悩んでいます。 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z という風に並んだそれぞれのアルファベットのMCに マウスが近づくとある一定の範囲の距離を取り、離れると元の場所に戻る… というふうな動きにしたいのです。 今は、 a_mc.onEnterFrame = function () { X=70;//_rootのAのx座標 Y=211;//_rootのAのy座標 var dx = _root._xmouse-this._x; var dy = _root._ymouse-this._y; var kyori = Math.sqrt(dx * dx+dy * dy); var kakudo = Math.atan2(this._y-_root._ymouse,this._x-_root._xmouse); if(kyori<100){ this._x += kyori * Math.cos(kakudo) * 0.05; this._y += kyori * Math.sin(kakudo) * 0.05; this._x = (this._x * 5+X)/6; this._y = (this._y * 5+Y)/6; } }; と記述してマウスと反対方向の動きをさせていますが、 マウスから離れるという動きではないのです…。 分かりづらい説明ですみませんが、ヒントかなにかあれば教えてください。 制作環境は、CS4で、AS2です。

    • ベストアンサー
    • Flash
  • シリアルマウス

     壊れたシリアルのマウスを分解してみたら、X軸とY軸のロータリーエンコーダがフォトインタラプタ各1個しかはいっていませんでした。(つまり、ひとつの軸に円盤が一つと、フォトインタラプタが一つ)  で、不思議に思ったのですが回転方向ってどうやって検出しているのでしょうか?

  • JavaScriptでマウス位置をリアルタイムで取得

    ウィンドウを開いたら、マウス位置をリアルタイムで取得し、ウィンドウ上に表示ということをしたいのですが、まったくわかりません。 function mousecursor(evt){ //関数の定義 X = event.x; //イベント発生場所のX座標取得 Y = event.y; //イベント発生場所のY座標取得 window.status = X + "," + Y;} //ステータスバーに表示 document.onmousemove = mousecursor; //マウスカーソルが動いたら、関数を呼び出す。(bodyタグで呼び出しも可) というようなソースを手に入れたのでやってみたら、できることはできたんですが、なんとなくしか意味がわかってません。 HTMLやPerl、VBAなどはできるんですが、どうしてもJavaScriptがあんまり理解できないんです…。 リアルタイムで取得し、表示、ということではなくても、自分の任意したように出力させたいんです。 (たとえばどこかをクリックしたらアラート表示など) よろしくお願いします。

  • マウスのポインタをうろうろする画像を追加する

    以下のようなマウスのポインタをうろうろする画像をひとつ作ったのですが、画像の数を増やして、さらにそれぞれにちがう動き(random)をさせるにはどうしたらよいのでしょうか?画像増やすだけでもいいです。 <html> <head> <script language="JavaScript"> <!-- i=0; function setIMG() { i-=1; myChar.style.left=event.x+Math.sin(i/10)*50; myChar.style.top=event.y+Math.cos(i/10)*50; } //--> </script> </head> <body bgcolor="#000000" onmousemove="setIMG()"> <img src="no.gif" name="myChar" style="position:absolute"> </body> </html>

  • マウスーオーバーすると逃げるようにしたい!

    マウスオーバーするとランダムにアイコンが逃げるようにしたい。 触ろうとするとすっと逃げるようなアクションをしたいです。 一定の方向ではなくて、右へ左へはたまた上へという感じです。 on(rollOver) { angle = this._rotation-10; radian = (angle/180)*Math.PI; for (a=0; a<10; a++) { this._x -= 2*Math.cos(radian); this._y -= 2*Math.sin(radian); } } on (rollOut) { angle = this._rotation-10; radian = (angle/180)*Math.PI; for (a=0; a<20; a++) { this._x -= 1*Math.cos(radian); this._y -= 1*Math.sin(radian); } } 上記の場合だと一定の方向にマウスオーバーから逃げるのですが… これを色々な方向に生かせればなと思っております。 何卒よろしくお願いいたします。

  • removeEventListenerの必要性

    参考にしているJavaScriptのソースで下記のような部分があったのですが、 (画面に描画をするプログラムの一部です。動きとしてはマウスの動きに合わせて模様が描かれて残像が残って消えていきます。) j(b)関数の中の一行目でdocument.removeEventListener("mousemove", j, !1); としてmousemoveのイベントリスナーを削除しているのが何故なのか解らず困っています。 メモリリークが発生するとかそういう問題なのでしょうか? ----------------------------------------------------------------------- <script type="text/javascript"> (function() { function j(b) { document.removeEventListener("mousemove", j, !1); document.removeEventListener("touchstart", j, !1); y(b); var g = l - p * 0.5, f = m - q * 0.5, a = Math.sqrt(g * g + f * f), b = l + g / a * 150, a = m + f / a * 150, g = Math.atan2(f, g); g += Math.PI * (0.5 + Math.random() * 0.5) * (Math.random() > 0.5 ? 1 : -1); for (f = 0; f < z; f++) { for (var e = A[f].f, c = 0; c < r; c++) { var d = e[c], h = Math.PI * 0.15 / r * c + g, k = Math.cos(h) * (r - c) * 2, h = Math.sin(h) * (r - c) * 2; d.x = b; d.y = a; d.d = k; d.e = h } j = !1 } document.addEventListener("mousemove", y, !1); document.addEventListener("touchmove", y, !1); document.addEventListener("touchstart", K, !1); setInterval(L, 1E3 / 30) } ------------------------------------------------------------------------- 同じソースの中で window.onload = function(){ ・・・   document.addEventListener("mousemove", j, !1); というようにイベントリスナーに登録しているところは見つかったので、これを削除しているのかとは思うのですが、 何分未熟なもので、それがどういう意図によるものなのか理解できません。 どなたか、知恵を貸して頂けないでしょうか?

  • インラインフレーム内の変数を親ページから呼び出す

    インラインフレーム内のマウス位置を↓のjavascriptコードで取得しているのですが、親ページのjavascriptの関数で使用したいです。どのようにインラインフレーム内の変数を親ページから呼び出して、利用すればよいのでしょうか? var x, y; window.addEventListener("DOMContentLoaded", function(){ window.document.onmousemove = function(e){ x = getMousePosition(e).x; } },false); function getMousePosition(e) { var obj = new Object(); if(e) { obj.x = e.pageX; obj.y = e.pageY; } else { obj.x = event.x + document.body.scrollLeft; obj.y = event.y + document.body.scrollTop; } return obj; }

  • 「リンクにマウスオーバーするとポップアップで説明が表示される」ができません

    はじめまして。 Javascriptは初心者でわからないことがありましたので、どなたかお答えいただけないでしょうか? MdNから出版されている、プロとして恥ずかしくないJavascriptの大原則の中で紹介されている「リンクにマウスオーバーするとポップアップで説明が表示される」を入力したのですが、まったく再現できません。 <link href="css/design.css" rel="stylesheet" type="text/css" media="all"> <style type="text/css" media="all"><!-- .Help{ font-size:x-small; background-color:#eee8aa; color:#6666ff; position:absolute; left:0px; top:0px; padding:3px; border-color:#003399; border:solid; border:1px; } //--></style> <script type="text/javascript"><!-- function OnScreenHelp(x,y){ if(document.all){ document.getElementByld(strID).style.left = event.x + document.body.scrollLeft + 15; document.getElementByld(strID).style.top = event.y + document.body.scrollTop + 0; }else{ document.getElementByld(strID).style.left = x + 15; document.getElementByld(strID).style.top = y + 0; } document.getElementByld(strID).style.display ="; } function OffScreenHelp(){ document.getElementByld(strID).style.display='none'; strlD="; } //--></script> </head> <body> <span class="Help" style="display:none; z-index:1000" id="About">会社概要をご紹介します</span> <span class="Help" style="display:none; z-index:1000" id="products">最新情報を紹介します<img src="img/up.gif"></span> <h1> <a href="index.html" onMouseOver="strID='About'; OnScreenHelp(event.pageX,event.pageY);" onMouseOut="OffScreenHelp()">About</a> </h1> <h1> <a href="index.html" onMouseOver="strID='Products'; OnScreenHelp(event.pageX.event.pageY);" onMouseOut="OffScreenHelp()">Products</a> </h1> </body> この様に記述したのですがどこが間違っているのかわかりません。 仕事で使わなければならず非常に困っています。 宜しくお願いします。

  • IEのイベントでのウインドウ位置の取得

    以前に、MdNの「リンクにマウスオーバーするとポップアップで説明が表示される」というサンプルの記述がうまく動作しないという質問で、FairefoxやSafariではその回答でうまく動作するようなのですが、IEの動作がまだ駄目なようなのです。 IEのイベントが発生した時のマウス座標の取得は、Javascriptで、 function OnScreenHelp(x,y){ if(document.all) { /* IEでの処理 */ document.getElementById(strID).style.left = event.x + document.body.scrollLeft + 15; document.getElementById(strID).style.top = event.y + document.body.scrollTop + 0; }else{             /* IE以外の処理 */ document.getElementById(strID).style.left = x + 15 + "px"; document.getElementById(strID).style.top = y + 0 + "px"; } } のような記述になっているのですが、関数OnScreenHelp(x,y)のx,yがbodyの本文内で、event.pageX、event.pageYのようにNN系の記述になっているため、IEではこのx,yの値は使えないので上記のような記述になっているようなのです。上記の記述ではうまくポップアップしてくれないので、 event.xやevent.yの所の記述がまずいのかな?と思って、ちょっと調べてみて、window.event.offsetXやwindow.event.offsetYに変更してやってみたのですが、うまくいきません。ここの所の、IEの記述としては、どのように記述したらよいか分かりかねています。ご経験のある方、ご教示願えたらと思います。 よろしくお願い致します。

  • ActionScript3.0について…

    ある課題で下記の条件を満たしたものを制作するというものがありまして、 制作してみたんですが、回答例と異なっていました。 私が制作したものでは、なにか間違っているのか分かりませんので質問させていただきました。よろしくお願いいたします。 ☆☆☆ 条件 ☆☆☆ ★ _mcの移動幅を5~10もしくは-10~-5の範囲になるようにします。 ★ 縦方向、横方向ともにステージの端まで移動したら反転するようにします。 ※ステージ幅は400px、高さは300pxとします。 ※条件ではありませんが、この問題を解くヒントとして、 「移動幅は2分の1の確率で-1を掛ける」と 「2分の1を表す条件式の例としては[ Math.random < 0.5 ]が考えられます。」とあります。 ☆☆☆ 回答例 ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; if (Math.random() < 0.5){ stepX *= -1; } if (Math.random() < 0.5){ stepY *= -1; } _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if (_mc.x >= 400 || _mc.x <= 0){ stepX *= -1; } if (_mc.y >= 300 || _mc.y <= 0){ stepY *= -1; } } ☆☆☆ 私が書いたもの ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if(_mc.x > 400 || _mc.x < 0){ stepX *= -1; } if(_mc.y > 300 || _mc.y < 0){ stepY *= -1; } } あくまでもヒントでしたので、私が書く際にはヒントを見ずに書きました。

    • ベストアンサー
    • Flash