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

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

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

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

HTML5

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

JavaScript

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

Q&A

解決済

1回答

641閲覧

ボタンのホバーでcanvasの描画、クリア

Samson818

総合スコア162

canvas

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

HTML5

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

JavaScript

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

0グッド

0クリップ

投稿2018/01/22 03:49

左に日本地図、右に地域名を書いたボタンを配置しました。
1)日本地図の地域にカーソルホバーで、地域名のボタンが反応、
2)地域名のボタンにカーソルホバーで、日本地図の各地域の描画が変更される
という物をjacascriptとcanvasで作成したいです。

1)日本地図の地域にカーソルホバーで、地域名のボタンが反応の部分は以下のコードで出来ました。

【html マップ部分】 <p class="map_wrapper"><canvas width="555" height="532" id="map2"></canvas><img src="images/chief_map.jpg" alt="日本地図" usemap="#japan" id="japan"></p> <map name="japan"><!--ej01はこちらには無し--> <area shape="poly" coords="456,12,456,72,552,144,552,12" href="ej02.html" alt="青森" id="ej02" region="ej02"> <area shape="poly" coords="456,72,456,132,504,204,552,144" href="ej03.html" alt="秋田" id="ej03" region="ej03"> <area shape="poly" coords="456,132,420,204,504,216,502,204" href="ej04.html" alt="山形" id="ej04" region="ej04"> <!--実際にはej10までつづく--> </map>
【Javascript マップ⇒ボタンへの処理】 $(document).ready(function () {   $('#ej02').hover(     function() {       $('#btn_ej02').addClass('hover_pseudo')     },function() {       $('#btn_ej02').removeClass('hover_pseudo')           }   );   $('#ej03').hover(     function() {       $('#btn_ej03').addClass('hover_pseudo')     },function() {       $('#btn_ej03').removeClass('hover_pseudo')           }   );   $('#ej04').hover(     function() {       $('#btn_ej04').addClass('hover_pseudo')     },function() {       $('#btn_ej04').removeClass('hover_pseudo')           }   );

2)地域名のボタンにカーソルホバーで、日本地図の各地域の描画が変更される方がうまくいきません。

【Javascript ボタン⇒マップへの処理】 //ボタンホバーで地図の描画を変更 var canvas = document.getElementById('map2'); var ctx = canvas.getContext('2d'); var img = new Image(); img.src = 'images/map2.jpg';   $('#btn_ej01').hover(     function() { // マスク ctx.beginPath(); ctx.moveTo(456,18); ctx.lineTo(444,254); ctx.lineTo(541,280); ctx.lineTo(553,18); ctx.clip(); // 画像の描画 ctx.drawImage(img, 0, 0); $('#map2').css('z-index','9999')     }, function() { // 画像の描画 ctx.clearRect(0,0,canvas.width, canvas.height); $('#map2').css('z-index','-1')     }   );   $('#btn_ej02').hover(     function() { // マスク ctx.beginPath(); ctx.moveTo(456,12); ctx.lineTo(456,72); ctx.lineTo(552,144); ctx.lineTo(552,12); ctx.clip(); ctx.drawImage(img, 0, 0); $('#map2').css('z-index','9999')     },function() { ctx.clearRect(0,0,canvas.width, canvas.height); $('#map2').css('z-index','-1')     }   );   $('#btn_ej03').hover(     function() { // マスク ctx.beginPath(); ctx.moveTo(456,72); ctx.lineTo(456,132); ctx.lineTo(504,204); ctx.lineTo(552,144); ctx.clip(); ctx.drawImage(img, 0, 0); $('#map2').css('z-index','9999')     },function() { ctx.clearRect(0,0,canvas.width, canvas.height); $('#map2').css('z-index','-1')     }   ); });

下敷きとして置いた<canvas width="555" height="532" id="map2"></canvas>へボタンホバー時の日本地図を描画しctx.beginPath();で区域を限定してmap2を表示するまでは出来ていました。

ホバーを外した際に描画を消す方法が不適切なのではないかと考えております。
確認のために<canvas width="555" height="532" id="map2"></canvas>に色を付けてみると、
最初は#btn_ej01~btn_ej03とも指定した形が描画されているのですが、
2回、3回とボタンを変えホバーを繰り返すと、指定した形に描画されなくなってしまいます。

どう変更したら繰り返し描画/クリアが可能になるでしょうか?

drawImageに対し、clearRectの使用が正しいのか?など検索しております。
ctx.clearRect(456,18,444,254,541,280,553,18);等に変更すると、
その地域だけのmap2が表示が消えるのが確認できたので、

ctx.clearRect(0,0,canvas.width, canvas.height);はパスを消すための処理ではなくて、
画像を消すための処理なのかと次第にわかってきましたが(?)
パスを消すための処理にたどり着けません。

詳しい方、お教えいただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

パスを消す方法はctx.save()/ctx.restore()です。
いったんクリップ設定する前の状態をctx.save()で保持しておき、前回のクリップが必要なくなればctx.restore()でクリアします。
サンプル

投稿2018/01/22 05:11

turbgraphics200

総合スコア4267

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問