2012-07-24 14 views
9

既存のキャンバスの中にキャンバスを置くことはできますか?できれば、html5でやってください。html5キャンバスのキャンバス

+0

は、あなたが実際に達成しようとしているものについての詳細を記入してください:だから、ちょうどrobertcが言ったことを行います。 – Phrogz

答えて

12

質問を解釈する方法は2つあります。

<canvas id="outer"> 
    <canvas id="inner"></canvas> 
</canvas> 

これは法的(validator.nuによる)が、無意味である:一つは、あなたが実際に巣このようなcanvas要素自体を、に意味ということです。 canvas要素内のコンテンツはフォールバック用です。 canvas要素内のコンテンツが使用される唯一の方法は、ブラウザがcanvasをサポートしていない場合です。この場合、内部のcanvas要素は表示されません。

質問を解釈するもう1つの方法は、別のキャンバスに表示された画像を別のキャンバスに表示することです。これは非常に簡単で、context.drawImage()の最初のパラメータとしてcanvas要素を使用できます。あなたは2つのcanvasの要素がある場合:

<canvas id="c1" width="200" height="200"></canvas> 
<canvas id="c2" width="200" height="200"></canvas> 

を次にthis script (using jQuery)は最初canvas上に描画した後、第2 canvasへの画像の4倍という追加します。

var c1 = $('#c1'); 
var ctx1 = c1[0].getContext('2d'); 

ctx1.fillRect(50,50,100,100); 

var c2 = $('#c2'); 
var ctx2 = c2[0].getContext('2d'); 

ctx2.drawImage(c1[0],0,0,100,100); 
ctx2.drawImage(c1[0],100,0,100,100); 
ctx2.drawImage(c1[0],0,100,100,100); 
ctx2.drawImage(c1[0],100,100,100,100); 

しかし、再び、なぜでしょうか?あなたはjust using one上述した第2 canvasの画像を複製することができます。

var c1 = $('#c1'); 
var ctx1 = c1[0].getContext('2d'); 

ctx1.fillRect(25,25,50,50); 
ctx1.fillRect(125,25,50,50); 
ctx1.fillRect(25,125,50,50); 
ctx1.fillRect(125,125,50,50); 

だから、要約すると:はい、それは可能だが、それは簡単な使用には本当に必要はありません。

+2

2番目のキャンバスを使用する理由は(ほとんど認められませんが)ほとんどありません。たとえば、グラフを別のオフスクリーンキャンバスにコピーし、メインキャンバスを消去して、オフスクリーンキャンバスを1ピクセル分左にオフセットしてコピーし、欠落した列に新しいデータを描画することで、移動グラフを描画するのが最も簡単です。 (これは、グラフの背景が透明である場合にのみ必要です。) – Phrogz

+0

@Phrogzはい、さまざまな画像処理も可能です。しかし、私は "私は本当に単純な使い方では必要ではない"と考えています。私はそのようなものはこの質問やこの答えには関係しないと思います。 – robertc

+3

おそらくそうではありませんが、初心者はあなたの言い回しが過度であることを意味するかもしれません。何かを達成するためにしばしばもっときれいで最適な方法です。静的な要素(例えばゲーム)を持つキャンバスが変化している場合、この手法には大きなパフォーマンス上の利点があります。ビットマップ/ベクトルをキャンバスに一度描画してから、更新するときにメインのものに描画するだけです。しかし、良い答えです。 – MickMalone1983

0

キャンバスを別のキャンバスの内側にネストすることは絶対に無意味です。ブラウザがcanvasをサポートしていない場合、ページにはcanvasタグ内の内容しか表示されません。
<canvas id="background">fallbacks/polyfills go in here...</canvas> <canvas id="foreground">.. or here, but not other canvases.</canvas>