画布Html5:清除多个画布并清除其中一个似乎也清除了另一画布

Sam*_*Sam 3 javascript html5-canvas

我试图绘制不同的画布元素并独立清除它们。但是,我的2种不同的上下文似乎同时影响了画布元素,并且没有作为单独的图层起作用。我希望能够独立更改不同的画布元素以创建背景和前景。

相关HTML:

<canvas id="canvas" style="position: abosloute; top:0px; left: 0px; z-index: 0;" width="500" height="300"></canvas>
<canvas id="canvas2" style="position: abosloute; top:0px; left: 0px;z-index: 1;" width="500" height="300"></canvas>
Run Code Online (Sandbox Code Playgroud)

相关JavaScript(用于创建上下文对象):

var canvas = document.getElementById( "canvas" );
var canvas2 = document.getElementById( "canvas2" );
var ctx = canvas.getContext( "2d" );
var ctx2 = canvas.getContext( "2d" );
Run Code Online (Sandbox Code Playgroud)

相关的JavaScript调用:

ctx.clearRect( 0, 0, canvas.width, canvas.height );
Run Code Online (Sandbox Code Playgroud)

似乎同时清除了ctxctx2。我不懂为什么。

这是jsfiddle上完整代码的链接:

http://jsfiddle.net/BvMdx/3/

Mat*_*iko 5

您正在从同一画布对象加载上下文:

var ctx = canvas.getContext( "2d" );
var ctx2 = canvas.getContext( "2d" );
Run Code Online (Sandbox Code Playgroud)

使用此代替:

var ctx = canvas.getContext( "2d" );
var ctx2 = canvas2.getContext( "2d" );
Run Code Online (Sandbox Code Playgroud)

现在唯一想知道的是,为什么要使用两个画布而不是一个?看起来您要覆盖它们,但是如果添加边框,您会发现一个在底部,另一个在顶部。

您真正想要做的是在绘制对象之一之前保存状态,然后还原到先前的状态。

我创建了一个新的小提琴,并提供了使用一个上下文的示例(无requestAnimationFrame):

http://jsfiddle.net/z5vtL/1/

代码的另一个问题是您使用的是setInterval而不是window.requestAnimationFrame。您可以在以下位置找到更多信息:

https://developer.mozilla.org/zh-CN/docs/Web/API/window.requestAnimationFrame

恩,怎么了,更新了JSFiddle以使用requestAnimationFrame:

http://jsfiddle.net/z5vtL/3/(注意每个对象的speed属性)