如果没有任何扩展库,是否有可能在同一个画布元素中有多个层?

所以如果我在顶层做一个clearRect,它不会擦除底层吗?

谢谢。


当前回答

我知道Q不想使用库,但我会为其他人提供这来自谷歌搜索。@EricRowell提到了一个很好的插件,但是,还有另一个插件你可以尝试,html2canvas。

在我们的例子中,我们使用带有z-index的分层透明PNG作为“产品构建器”小部件。Html2canvas出色地将堆栈压缩,无需推送图像,也不使用复杂性、变通方法和“无响应”画布本身。我们不能用香草画布+JS顺利/理智地做到这一点。

首先在绝对div上使用z-index在相对定位的包装器中生成分层内容。然后将包装器通过html2canvas管道以获得渲染的画布,您可以保持原样,也可以将其输出为图像以便客户端保存。

其他回答

不,但是,您可以将多个<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画布上绘制第一个图层,在layer2画布上绘制第二个图层。然后当你在顶部图层上清除矩形时,下部画布上的任何内容都会显示出来。

但是图层02,将覆盖图层01中的所有图纸。我用它在两个图层中显示绘图。在样式中使用(background-color: transparent;)

< span style=" font - family:宋体;"> <canvas id="lay01" width="500" height="500" style="位置:绝对;左:0;上图:0;z - index: 0;背景颜色:透明;" > > < /画布 <canvas id="lay02" width="500" height="500" style="位置:绝对;左:0;上图:0;z - index: 1;背景颜色:透明;" > > < /画布 < / div >

与此相关的:

如果你在画布上有一些东西,你想在它的后面画一些东西,你可以通过改变上下文来做到这一点。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" />

你也可以登录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不想使用库,但我会为其他人提供这来自谷歌搜索。@EricRowell提到了一个很好的插件,但是,还有另一个插件你可以尝试,html2canvas。

在我们的例子中,我们使用带有z-index的分层透明PNG作为“产品构建器”小部件。Html2canvas出色地将堆栈压缩,无需推送图像,也不使用复杂性、变通方法和“无响应”画布本身。我们不能用香草画布+JS顺利/理智地做到这一点。

首先在绝对div上使用z-index在相对定位的包装器中生成分层内容。然后将包装器通过html2canvas管道以获得渲染的画布,您可以保持原样,也可以将其输出为图像以便客户端保存。