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

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

解決済

2回答

1153閲覧

Canvas要素を使った描画でソースコードをDRYにしたい

hibikikudo

総合スコア238

canvas

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

HTML5

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

JavaScript

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

0グッド

0クリップ

投稿2019/05/23 03:41

編集2019/05/23 03:45

前提・実現したいこと

http://www.html5.jp/canvas/how2.html を参考にCanvas要素を使って棒グラフを描画しました。
うまく描画することはできましたが、冗長なコードになってしまったのでこれをDRYに修正したいです。
どのように繰り返しの記述を減らすことができるでしょうか?

該当のソースコード

html

1<canvas id="barChart01" width="400" height="20"></canvas> 2<canvas id="barChart02" width="200" height="20"></canvas> 3<canvas id="barChart03" width="100" height="20"></canvas>

javascript

1onload = function() { 2 draw1(); 3 draw2(); 4 draw3(); 5}; 6function draw1() { 7 var canvas = document.getElementById('barChart01'); 8 if ( ! canvas || ! canvas.getContext ) { return false; } 9 var bar01 = canvas.getContext('2d'); 10 bar01.beginPath(); 11 bar01.fillStyle = '#0f6baf'; 12 bar01.fillRect(0, 0, 400, 20); 13} 14function draw2() { 15 var canvas = document.getElementById('barChart02'); 16 if ( ! canvas || ! canvas.getContext ) { return false; } 17 var bar02 = canvas.getContext('2d'); 18 bar02.beginPath(); 19 bar02.fillStyle = '#0f6baf'; 20 bar02.fillRect(0, 0, 400, 20); 21} 22function draw3() { 23 var canvas = document.getElementById('barChart03'); 24 if ( ! canvas || ! canvas.getContext ) { return false; } 25 var bar03 = canvas.getContext('2d'); 26 bar03.beginPath(); 27 bar03.fillStyle = '#0f6baf'; 28 bar03.fillRect(0, 0, 400, 20); 29}

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

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

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

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

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

guest

回答2

0

ベストアンサー

違うところは呼び出すIDだけですし、変数もその関数でvarで定義しているのでその関数内しかスコープがないので引数でわければ良いのでは。

js

1onload = function() { 2 draw('01'); 3 draw('02'); 4 draw('03'); 5}; 6function draw(num) { 7 var canvas = document.getElementById('barChart'+num); 8 if ( ! canvas || ! canvas.getContext ) { return false; } 9 var bar = canvas.getContext('2d'); 10 bar.beginPath(); 11 bar.fillStyle = '#0f6baf'; 12 bar.fillRect(0, 0, 400, 20); 13}

canvasが増減するのでしたらcanvasをquery​SelectorAll()でcanvasの要素を取得してきてループで要素を丸々引数として渡せばdraw()内で使っているgetElementById()も不要になりそうです。

今後、それぞれのcanvasに別個で何かを指定することがあるのでしたらnumによって分岐させるか、
配列で設定もってそれを呼び出すか、
動的に関数を呼び出すか。

投稿2019/05/23 03:49

編集2019/05/23 03:53
m.ts10806

総合スコア80850

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

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

hibikikudo

2019/05/23 04:14

mts10806さん>まさに私が知りたかった回答でした。的確な助言に感謝申し上げます。
m.ts10806

2019/05/23 04:15

ヒントになったようで何よりです。 数が増減するようでしたら呼び出す回数が増えるので2つ目の案(canvas全取得でループ)に切り替えてください。たぶんそちらのほうがよりDRYです。
guest

0

自分の場合はこんな雰囲気のものを書く

html

1<canvas id="chart"></canvas> 2<div id="a"></div>

javascript

1<script> 2function makeObj(width,height){ 3 var canvas = document.getElementById('chart').cloneNode(true); 4 canvas.style.width = width; 5 canvas.style.neight = height; 6 document.getElementById("a").appendChild(canvas); 7 var canvas2d = canvas.getContext('2d'); 8 return { 9 draw : (function(color, rect){ 10 canvas2d.beginPath(); 11 canvas2d.fillStyle = color; 12 canvas2d.fillRect(rect[0],rect[1],rect[2],rect[3]); 13 }) 14 15} 16} 17var obj = makeObj(100, 100); 18obj.draw('#0f6baf',[0,0,400,10]); 19obj.draw('#0f6baf',[0,0,200,20]); 20obj.draw('#0f6baf',[0,0,100,30]); 21obj.draw('#0f6baf',[0,60,400,10]); 22obj.draw('#0f6baf',[30,60,200,20]); 23obj.draw('#0f6baf',[30,60,100,30]); 24

投稿2019/05/23 04:57

hentaiman

総合スコア6415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問