基本的には、ボックスの中心にある点とマウスカーソルの点の間のベクトルを見つけてから、角度を計算して度に変換する必要があります。次に、CSSを介して角度を適用します。
let box = document.querySelector(".box");
let boxBoundingRect = box.getBoundingClientRect();
let boxCenter= {
x: boxBoundingRect.left + boxBoundingRect.width/2,
y: boxBoundingRect.top + boxBoundingRect.height/2
};
document.addEventListener("mousemove", e => {
let angle = Math.atan2(e.pageX - boxCenter.x, - (e.pageY - boxCenter.y) )*(180 / Math.PI);
box.style.transform = `rotate(${angle}deg)`;
})
待って、何?
さて、これを分解しましょう。これは私たちが持っているものです:
ベクトルABは、ボックスの中心とマウスの位置の間にあります。X軸とABの間の角度であるΘ(シータ)を計算しました。
X軸に接触するまでBからY軸に平行に下がる線を想像してみてください。その線、AB、およびX軸を使用して、三角形を取得します。つまり、Arctan関数を使用してシータを計算できます。より正確には、y> 0の場合は正の角度、y<0の場合は負の角度を与えるArctan2の便利な関数を使用します。
atan2は度をラジアンで返し、CSSは度で動作するため、を使用して2つの間で変換し180/Math.PI
ます。(ラジアンは、円の中心角を描画したときに、長さが円の半径の長さに等しい円弧を横切る角度の尺度です。-ここから取得)
最後の注意点-ブラウザではY軸が反転しているため(つまり、ページを下に行くほどY値が高くなります)、Y軸を反転する必要がありました。マイナス記号を追加してこれを行いました。 Y項:
- (e.pageY - boxCenter[1])
これがいくつかのことをクリアするのに役立つことを願っています...
これが分離されたjsfiddleの例です
ところで、あなたのゲームは難しいです!:)