拡張ライブラリがない場合、同じキャンバス要素に複数のレイヤーを含めることはできますか?
それで、トップレイヤーでclearRectを実行しても、ボトムレイヤーは消去されませんか?
ありがとう。
拡張ライブラリがない場合、同じキャンバス要素に複数のレイヤーを含めることはできますか?
それで、トップレイヤーでclearRectを実行しても、ボトムレイヤーは消去されませんか?
ありがとう。
回答:
ただし、複数の<canvas>
要素を互いに重ねて、同様のことを行うことはできます。
<div style="position: relative;">
<canvas id="layer1" width="100" height="100"
style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="layer2" width="100" height="100"
style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
</div>
layer1
キャンバスに最初のレイヤーを描画し、キャンバスに2番目のレイヤーを描画しますlayer2
。次にclearRect
、上のレイヤーに移動すると、下のキャンバスにあるものが透けて見えます。
display: none;
。または、レイヤーを表示する必要があるときに再度描画するのにそれほど費用がかからない場合は、キャンバスをクリアします。
これに関連:
キャンバス上に何かがあり、その後ろに何かを描画したい場合-context.globalCompositeOperation設定を「destination-over」に変更してそれを行うことができ、その後、「source-over」に戻すことができます。やり直した。
var context = document.getElementById('cvs').getContext('2d');
// Draw a red square
context.fillStyle = 'red';
context.fillRect(50,50,100,100);
// Change the globalCompositeOperation to destination-over so that anything
// that is drawn on to the canvas from this point on is drawn at the back
// of what's already on the canvas
context.globalCompositeOperation = 'destination-over';
// Draw a big yellow rectangle
context.fillStyle = 'yellow';
context.fillRect(0,0,600,250);
// Now return the globalCompositeOperation to source-over and draw a
// blue rectangle
context.globalCompositeOperation = 'source-over';
// Draw a blue rectangle
context.fillStyle = 'blue';
context.fillRect(75,75,100,100);
<canvas id="cvs" />
canvas
ドキュメントに追加せずに複数の要素を作成できます。これらはあなたのレイヤーになります:
次に、それらを使用して好きなことを行い、最後にdrawImage
on を使用して宛先のキャンバスでコンテンツを適切な順序でレンダリングしますcontext
。
例:
/* using canvas from DOM */
var domCanvas = document.getElementById('some-canvas');
var domContext = domCanvas.getContext('2d');
domContext.fillRect(50,50,150,50);
/* virtual canvase 1 - not appended to the DOM */
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
ctx.fillStyle = 'blue';
ctx.fillRect(50,50,150,150);
/* virtual canvase 2 - not appended to the DOM */
var canvas2 = document.createElement('canvas')
var ctx2 = canvas2.getContext('2d');
ctx2.fillStyle = 'yellow';
ctx2.fillRect(50,50,100,50)
/* render virtual canvases on DOM canvas */
domContext.drawImage(canvas, 0, 0, 200, 200);
domContext.drawImage(canvas2, 0, 0, 200, 200);
そして、ここにいくつかのコードペンがあります:https ://codepen.io/anon/pen/mQWMMW
私も同じ問題を抱えていましたが、position:absoluteを持つ複数のcanvas要素が機能しますが、出力を画像に保存したい場合は機能しません。
そこで、私は先に進んで、各レイヤーに独自のコードがあるかのようにコーディングする単純なレイヤー化「システム」を実行しましたが、すべてが同じ要素にレンダリングされます。
https://github.com/federicojacobi/layeredCanvas
機能を追加するつもりですが、今のところは追加します。
複数の関数を実行してそれらを呼び出し、レイヤーを「偽造」することができます。
http://www.concretejs.comをチェックアウトすることもできます。これは、ヒットの検出、階層化、および他の多くの周辺機能を可能にする、モダンで軽量なHtml5キャンバスフレームワークです。次のようなことができます:
var wrapper = new Concrete.Wrapper({
width: 500,
height: 300,
container: el
});
var layer1 = new Concrete.Layer();
var layer2 = new Concrete.Layer();
wrapper.add(layer1).add(layer2);
// draw stuff
layer1.sceneCanvas.context.fillStyle = 'red';
layer1.sceneCanvas.context.fillRect(0, 0, 100, 100);
// reorder layers
layer1.moveUp();
// destroy a layer
layer1.destroy();
Qがライブラリを使用したくないことを理解していますが、Google検索から来た他の人に提供します。@EricRowellは優れたプラグインについて言及しましたが、試してみることができる別のプラグインhtml2canvasもあります。
私たちのケースではz-index
、「製品ビルダー」ウィジェットとして、レイヤー化された透明なPNGを使用しています。Html2canvasは、画像をプッシュしたり、複雑さ、回避策、および「応答しない」キャンバス自体を使用したりせずに、スタックを煮詰めるために見事に機能しました。バニラキャンバス+ JSでは、これをスムーズに行うことはできませんでした。
最初z-index
に絶対divで使用して、相対的に配置されたラッパー内に階層化コンテンツを生成します。次に、ラッパーをhtml2canvasにパイプして、レンダリングされたキャンバスを取得します。これはそのままにするか、クライアントが保存できるように画像として出力します。
しかし、レイヤー02はレイヤー01のすべての図面をカバーします。これを使用して、両方のレイヤーの図面を示しました。(background-color:transparent;)をスタイルで使用します。
<div style="position: relative;">
<canvas id="lay01" width="500" height="500" style="position: absolute; left: 0; top: 0; z-index: 0; background-color: transparent;">
</canvas>
<canvas id="lay02" width="500" height="500" style="position: absolute; left: 0; top: 0; z-index: 1; background-color: transparent;">
</canvas>
</div>