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

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

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

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

HTML5

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

JavaScript

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

Q&A

解決済

1回答

3330閲覧

canvas での描画位置がズレてしまうのを解決したい。

Kiiko1

総合スコア21

canvas

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

HTML5

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

JavaScript

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

0グッド

0クリップ

投稿2022/03/20 06:02

編集2022/03/20 12:41

やりたいこと

Javascript において取得した時間、要素の幅をもとにスタート位置を定め、適当な位置にcanvasで描画したいです。
具体的には、
(現在時刻)/(1日の秒数:86400)* (要素の幅:722px)
という式で、その時刻におけるスタート位置を決めています。
イメージ説明

困っていること

コンソールで確認したところ、時間、要素の幅、スタートポイントは全てあっているのですが、実際に描画される位置は全く違うところになってしまいます。

例えば下の画像はスタートポイントを200に指定した場合です。本来は原点(0のところ)から200pxのところから描画開始してほしいのですが(8と10の間あたり)、かなりズレてしまっています。(16の右上から描画されている)
イメージ説明

Javascript

1var canvas1 = document.getElementById("myCanvas1"); 2var ctx1 = canvas1.getContext("2d"); 3let client_w = document.getElementById("myCanvas1").clientWidth; 4var e = new Date(); 5var time = parseInt(e.getHours()*3600) + parseInt(e.getMinutes()*60) + parseInt(e.getSeconds()); //3600 6var startpoint = (time/86400)*client_w; 7startpoint = 200; 8var cw = client_w/86400*0.5 9 10console.log(client_w); 11console.log(startpoint); 12console.log(time); 13console.log(cw); 14 15 16 $(function (){ 17 18 19 function abc(){ 20 21 22 23 var e = new Date(); 24 time = parseInt(e.getHours()*3600) + parseInt(e.getMinutes()*60) + parseInt(e.getSeconds()); 25 console.log(time); 26 27/* 28 29 if (time == 86399){ 30 console.log("in the if"); 31 startpoint = 0; 32 ctx1.clearRect(0, 30, client_w, 60) 33 } 34*/ 35 36 ctx1.fillRect(startpoint, 30, cw, 60); 37 startpoint = startpoint + cw; 38

HTML

1<div class="row" style="margin-bottom: 20px; margin-top: 5px; margin-right: 5px;"> 2 <div class="col-md-12" style="padding-right: 0px; padding-left: 5px;"> 3 <div class="row" style="padding-right: 5px; padding-left: 10px; margin-left: 5px;"> 4 5 <div class="col-md-12"> 6 <div class="row"> 7 <div class="col-md-2 black_style1"> 8 <div class="container"> 9 <p class="text_style6" id="result1"></p> 10 </div> 11 </div> 12 <div class="col-md-2 black_style1"> 13 <div class="text_style6"> 14 <input type="text" style="width: 50px; height: 15px; margin: -10px;" id="result1" onkeydown="machineOrder('1',event)"> 15 </div> 16 </div> 17 <div class="col-md-2 black_style1"> 18 <div class="text_style6" id="result1"></div> 19 </div> 20 <div class="col-md-2 black_style1"> 21 <div class="text_style6" id="result1"></div> 22 </div> 23 <div class="col-md-2 black_style1"> 24 <div class="text_style6" id="result2"></div> 25 </div> 26 27 </div> 28 <div class="row"> 29 <div class="col-md-12 black_style2"> 30 <div style="width: 100%;" > 31 <div style="height: 30px;" > 32 <div style="height: 10px;" id="chart1"> 33 <canvas class="canvas_style" id="myCanvas1"></canvas> 34 </div> 35 </div> 36 <div style="display:flex;justify-content: space-between;"> 37 <div class="text_style1">0</div> 38 <div class="text_style1">2</div> 39 <div class="text_style1">4</div> 40 <div class="text_style1">6</div> 41 <div class="text_style1">8</div> 42 <div class="text_style1">10</div> 43 <div class="text_style1">12</div> 44 <div class="text_style1">14</div> 45 <div class="text_style1">16</div> 46 <div class="text_style1">18</div> 47 <div class="text_style1">20</div> 48 <div class="text_style1">22</div> 49 <div class="text_style1">24</div> 50 </div> 51 </div> 52 </div> 53 </div> 54 </div> 55 </div> 56 </div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

2点注意して下さい。1点は、スタイルシートで指定するcanvas要素の見た目の横幅とwidthプロパティで指定する描画領域の横幅が違う概念だということです。例えば、スタイルシートで200pxを指定してwidthプロパティで100pxを指定した場合、ちょうど2倍の大きさに図が引き伸ばされます。
Canvas.width - キャンパスの横幅を取得、変更する

もしかしたらこちらが参考になるかもしれません。

投稿2022/03/20 13:07

querykuma

総合スコア777

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問