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

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

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

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

JavaScript

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

Q&A

解決済

1回答

1214閲覧

javascriptでマウスカーソルの位置に応じた文字の移動

Karna554

総合スコア10

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

JavaScript

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

0グッド

0クリップ

投稿2020/05/16 00:49

前提・実現したいこと

https://groxi.jp/

こちらのサイトのトップ部分のマウスカーソル位置に応じて文字が動く部分をcanvasを用いて実装しようとしています。

発生している問題・エラーメッセージ

文字を動かすことまではできたのですが、思うように右・左と思うように動かすことができません。

該当のソース

javascript

1const brown_text_name = ['brown_a_1', 'brown_a_2', 'brown_c', 'brown_H', 'brown_i', 'brown_M', 'brown_p', 2'brown_P_1', 'brown_P_2', 'brown_s_1', 'brown_s_2', 'brown_T', 'brown_v']; 3 4var brown_text = { 5 6// 描画する文字の各座標・角度・フォント(サイズ・種類)・色・値 7 8 'brown_a_1' : {'pointX': 1144, 'pointY': 333, 'angle': 20, 'font_size': '200px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'a'}, 9 'brown_a_2' : {'pointX': 823, 'pointY': 427, 'angle': -20, 'font_size': '120px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'a'}, 10 'brown_c' : {'pointX': 1097, 'pointY': 605, 'angle': 20, 'font_size': '120px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'c'}, 11 'brown_H' : {'pointX': -118, 'pointY': 290, 'angle': 340, 'font_size': '330px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'H'}, 12 'brown_i' : {'pointX': 1269, 'pointY': 714, 'angle': 20, 'font_size': '230px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'i'}, 13 'brown_M' : {'pointX': 430, 'pointY': 12, 'angle': 20, 'font_size': '240px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'M'}, 14 'brown_p' : {'pointX': 1321, 'pointY': 656, 'angle': -10, 'font_size': '200px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'p'}, 15 'brown_P_1' : {'pointX': 669, 'pointY': 0, 'angle': -25, 'font_size': '350px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'P'}, 16 'brown_P_2' : {'pointX': 1074, 'pointY': 113, 'angle': -25, 'font_size': '230px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'P'}, 17 'brown_s_1' : {'pointX': 414, 'pointY': 496, 'angle': -30, 'font_size': '270px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 's'}, 18 'brown_s_2' : {'pointX': 342, 'pointY': 656, 'angle': -20, 'font_size': '120px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 's'}, 19 'brown_T' : {'pointX': 209, 'pointY': 178, 'angle': -20, 'font_size': '150px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'T'}, 20 'brown_v' : {'pointX': 927, 'pointY': 311, 'angle': -20, 'font_size': '150px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'v'}, 21 22}; 23 24$(document).ready(function() { 25 draw_canvas(); 26}); 27 28function draw_canvas() { 29// TOP部分の描画コンテキスト取得 30var canvas = document.getElementById('top_canvas'); 31 32// 描画範囲設定 33canvas.width = window.innerWidth; 34canvas.height = 1900; 35 36// コンテキスト取得 37if (canvas.getContext) { 38 var context_brown = canvas.getContext('2d'); // 茶色文字用コンテキスト 39} 40 41// 茶色文字描画 42for (let i = 0; i <= brown_text_name.length - 1; i++) { 43 context_brown.save(); 44 45 var x = brown_text[brown_text_name[i]]['pointX']; 46 var y = brown_text[brown_text_name[i]]['pointY']; 47 context_brown.font = brown_text[brown_text_name[i]]['font_size']; 48 context_brown.fillStyle = brown_text[brown_text_name[i]]['color']; 49 50 context_brown.translate(x, y); 51 context_brown.rotate((brown_text[brown_text_name[i]]['angle'] ) * Math.PI / 180); 52 context_brown.translate(-x, -y); 53 context_brown.fillText(brown_text[brown_text_name[i]]['value'], x, y); 54 55 context_brown.restore(); 56 57} 58 59} 60 61window.onload=function(){ 62 //マウス移動時のイベントをBODYタグに登録する 63 document.body.addEventListener("mousemove", function(e){ 64 65 //座標を取得する 66 var mX = e.pageX; //X座標 67 var mY = e.pageY; //Y座標 68 69 //座標を表示する 70 document.getElementById("txtX").value = mX; // 確認用 71 document.getElementById("txtY").value = mY; // 確認用 72 brown_text['brown_a_1']['pointX'] += (mX - window.innerWidth) / 10; 73 brown_text['brown_a_1']['pointY'] = mY; 74 75 console.log(brown_text['brown_a_1']['pointX'], brown_text['brown_a_1']['pointY']); 76 draw_canvas(); 77 }); 78} 79

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

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

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

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

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

guest

回答1

0

ベストアンサー

e.pageXはページ内の絶対座標で、マウスカーソルの移動量ではありません。
mousemoveごとに絶対座標値-ウィンドウサイズをひたすら加算していくので左へぶっとんでいきます。

前回のmousemoveイベント発生前の座標を記憶しておき、今回イベント座標との差を求めることで目的の動作ができるのではないでしょうか。

javascript

1// x座標だけのサンプル 2var preX = 0 //前回イベント発生時座標 3 4window.onload=function(){ 5 //マウス移動時のイベントをBODYタグに登録する 6 document.body.addEventListener("mousemove", function(e){ 7 8 //座標を取得する 9 var cX = e.pageX; //X座標 10 //前回座標との差 11 var mX = cX - preX 12 //洗い替え 13 preX = cX 14 15 brown_text['brown_a_1']['pointX'] += mX / 10 //移動距離の1/10を加算 16

投稿2020/05/16 01:35

hope_mucci

総合スコア4447

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

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

Karna554

2020/05/16 02:09

ありがとうございます。 絶対座標だから左や右に吹っ飛んでいったんですね.....
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問