🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

3回答

3210閲覧

canvasで描画した文字に変数を付与したい

itzuakniami123

総合スコア74

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2021/03/08 08:11

編集2021/03/08 09:01

前提・実現したいこと

1, XMLファイルのデータをJavaScriptで取得し、取得した文字データをcanvas上に表示させる
2, マウスオーバーするとテキストが表示される

1まではできているのですが、canvasで描画した文字に対して変数は付与できるのでしょうか?

マウスオーバーの処理は変数を取得しないことには実装ができないので…
Googleで自分なりに調べたのですが、どれもcanvasに文字を描画する方法までしか書かれておらず困っています…
(もしかしたら検索キーワードが悪いのかもしれませんが…)

イメージ画像は下記の通りです
イメージ説明

わかりやすいように色分けしています。

XMLファイルに座標データが入っており

ctx.fillText(任意のテキスト,XMLファイルで取得したX座標,XMLファイルで取得したy座標);

というような形で描画しています。
これに対して、変数を付与し、CSSやJavascriptでマウスオーバーしたときの処理を書きたいというわけです。

どなたかご教授いただければ幸いです。よろしくお願いいたします。

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

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

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

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

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

yambejp

2021/03/08 08:15 編集

手書きでいいので具体的に図示できますか? SVGは想定外ですか?
kairi003

2021/03/08 08:22

変数を付与というのがよく分からないのですが、canvas上に描画された文字にonMouseのようなイベントリスナをかけたいということでしょうか
itzuakniami123

2021/03/08 08:31

kairi003様 そうですね、canvas上に描画された文字に対してonMouseといったイベントを設けたいと考えています。 そのために変数を作りたいのです… テキストはいくつか存在するので、CSSでいうクラス、「.(変数)」を作りたいというわけです。
itzuakniami123

2021/03/08 08:32

yambejp様 イメージ画像追加しました!これでつかめたでしょうか…? SVGは想定外ですね…
kairi003

2021/03/08 08:54

ちょっと勘違いしていたかもしれないんですが「canvasを」マウスオーバーするとテキストが表示されるでいいのですか? 「canvas上のテキスト」をマウスオーバーしたら、だと思っていたのですが
yambejp

2021/03/08 08:55

特定の座標位置(範囲?)にマウスが乗るとテキストが表示するということですかね?
itzuakniami123

2021/03/08 08:58

kairi003様 「canvas上のテキスト」をマウスオーバーしたらという認識で合っています!
itzuakniami123

2021/03/08 09:02

yambejp様 その認識で合っています!
guest

回答3

0

多分こんな感じではないでしょうか。
How do I check if a mouse click is inside a rotated text on the HTML5 Canvas in JavaScript?HTML Canvas Hover Textを参考にしました。

実装が面倒で質問の本質ではないと思ったので、以下の例ではマウスがテキスト上で移動するとコンソールにテキストを表示するようにしています。開発者ツールで確認してください。

canvasは結局の所ペイントみたいな上書き仕様なので、canvas内に新たなテキストなどを表示・非表示をしたい場合、「上書き→すべて消す→下のものを再描画」という手順を踏むか、canvasの上に別のcanvasを重ねておき、吹き出しなどはそちらに描画するようにする、などの方法を取る必要があります。

また今回はわかりやすさ重視でなるべく単純な感じに書いてますが、理解ができるならクラス(HTMLではなくjsの)を用いた設計をするといい感じになると思います。

html

1<canvas id="canvas" width=300 height=300></canvas> 2<script src="script.js"></script>

js

1function getTextRectPath(ctx, text, textX, textY) { 2 // テキスト描画時の範囲情報TextMatrixから、テキスト背景の矩形パスを生成して返す 3 const tm = ctx.measureText(text); 4 const x = textX - tm.actualBoundingBoxLeft; 5 const y = textY - tm.actualBoundingBoxAscent; 6 const width = tm.width; 7 const height = tm.actualBoundingBoxAscent + tm.actualBoundingBoxDescent; 8 const path = new Path2D(); 9 path.rect(x, y, width, height); 10 return path; 11} 12 13const canvas = document.getElementById('canvas'); 14const ctx = canvas.getContext('2d'); 15ctx.textAlign = "center"; 16ctx.textBaseline = "middle"; 17ctx.font = "60px Arial"; 18 19const textList = [ 20 //各テキストの情報をまとめたオブジェクトの配列 21 {text: 'text1', x: 100, y: 200, path: null}, 22 {text: 'text2', x: 200, y: 100, path: null} 23]; 24 25for (const t of textList) { 26 // テキスト背景の矩形パスを得てpathに代入 27 t.path = getTextRectPath(ctx, t.text, t.x, t.y); 28 // わかりやすさのため矩形を塗りつぶす(やらなくてもいい) 29 ctx.fillStyle = 'red'; 30 ctx.fill(t.path); 31 // テキストを描画する 32 ctx.fillStyle = 'black'; 33 ctx.fillText(t.text, t.x, t.y); 34} 35 36canvas.addEventListener('mousemove', e => { 37 // canvas上でマウスが動くと呼び出される関数 38 const canvas = e.currentTarget; 39 // canvasの左辺・上辺を得る 40 const rect = canvas.getBoundingClientRect(); 41 const offsetX = rect.left; 42 const offsetY = rect.top; 43 // ページ全体上の座標(clienet~)↑からcanvas上のマウス座標を得る 44 const x = e.clientX - offsetX; 45 const y = e.clientY - offsetY; 46 for (const t of textList) { 47 // textListの各テキストについて、矩形パス上にマウスがあるか確認する 48 if (ctx.isPointInStroke(t.path, x, y)) { 49 console.log(t.text); 50 } 51 } 52});

投稿2021/03/08 10:55

編集2021/03/08 11:01
kairi003

総合スコア1332

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

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

0

ベストアンサー

canvasで描画した文字に対して変数は付与できるのでしょうか?

できません。描画した後はただの画像なので。

各テキストに対して、fillText() するときに measureText() も呼んで TextMetrics オブジェクトとマウスホバー時に表示したいテキストをリストに保存しておき、Canvas の mousemove イベント内でCanvas内でのマウス座標が入る TextMetrics をリストから見つけて、それに対応するテキストを表示、という感じで実装はできそうです。


私ならCanvasに文字を描画しないで、HTMLの要素を手前に重ねますね。

投稿2021/03/08 08:51

編集2021/03/08 08:58
int32_t

総合スコア21679

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

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

itzuakniami123

2021/03/08 08:57

ご回答ありがとうございます。 canvasを使わないでやるとなると、どういった形になるでしょうか?
guest

0

javascript

1<canvas id="myCanvas" width="100" height="100"></canvas> 2<script> 3const canvas=document.getElementById('myCanvas'); 4const ctx = canvas.getContext('2d'); 5canvas.addEventListener('mouseover', ()=>{ 6 ctx.font = "12px serif"; 7 ctx.fillText("TEST TEXT", 10, 50); 8}, false); 9canvas.addEventListener('mouseout', ()=>ctx.clearRect(0, 0, canvas.width, canvas.height), false); 10</script> 11

投稿2021/03/08 08:42

yambejp

総合スコア116661

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

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

itzuakniami123

2021/03/08 08:55

コードありがとうございます。 これだと、何回かマウスオーバーを繰り返すと下にあった画像が消えてしまいました…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問