为什么我不能在HTML5画布中绘制两行不同的颜色?

问题描述:

我正在尝试使用HTML5画布在绿线的左侧画一条红线。以下是我的javascript:为什么我不能在HTML5画布中绘制两行不同的颜色?

var canvas = document.createElement('canvas'); 
canvas.height = 150; 
canvas.width = 150; 
var canvasContext = canvas.getContext('2d'); 
canvasContext.beginPath(); 

// Draw the red line. 
canvasContext.strokeStyle = '#f00'; 
canvasContext.moveTo(10, 0); 
canvasContext.lineTo(10, 100); 
canvasContext.stroke(); 

// Draw the green line. 
canvasContext.moveTo(50, 0); 
canvasContext.strokeStyle = '#0f0'; 
canvasContext.lineTo(50, 100); 
canvasContext.stroke(); 

document.body.appendChild(canvas);​ 

但是,在谷歌浏览器中,我在浅绿色线条的左边看到一条深绿色的线条。为什么?我打了两次右击脑卒中?因此,为什么我的第一次中风会影响我的第二次?

Here是一个JSFiddle,阐释了我的意思。

当您开始绘制第二条线时,您未拨打canvasContext.beginPath();

为了使绘图部分更加独立,我加了空格:

var canvas = document.createElement('canvas'); 
canvas.height = 150; 
canvas.width = 150; 

var canvasContext = canvas.getContext('2d'); 

// Draw the red line. 
canvasContext.beginPath(); 
canvasContext.strokeStyle = '#f00'; 
canvasContext.moveTo(10, 0); 
canvasContext.lineTo(10, 100); 
canvasContext.stroke(); 

// Draw the green line. 
canvasContext.beginPath(); 
canvasContext.moveTo(50, 0); 
canvasContext.strokeStyle = '#0f0'; 
canvasContext.lineTo(50, 100); 
canvasContext.stroke(); 

document.body.appendChild(canvas); 

演示:http://jsfiddle.net/AhdJr/2/

+0

谢谢,如果是这样的话,我有第二个问题:为什么左边的线比另一个暗?我没有为任何一行设置不透明度值,那么为什么画布混合了颜色? – dangerChihuahua007 2012-08-10 05:25:18

+0

我真的不知道。查看[documentation](http://dev.w3.org/html5/2dcontext/#dom-context-2d-beginpath),似乎'beginPath()清除子路径,所以可能第二行是(以某种方式)前一个和当前一个的组合。 – Blender 2012-08-10 05:28:22

+0

我认为它是因为你画了两次,如果你删除了初始笔画,它们都是相同的颜色,虽然这仍然很奇怪,但我不认为帧缓冲区被清除,当你多次调用笔画时,或者与默认不透明度有关。 – 2012-08-10 05:32:38

非常有趣的,据我可以告诉WebGL的方式或OpenGL的工作就像一个大型的状态机,这里定义的状态,绘制,更新状态再次战平,等等...

虽然林不知道如果画布遵循相同的原则,即使它只是简单的2D渲染。

我成功地开始了一条新的道路。

var canvas = document.createElement('canvas'); 
canvas.height = 150; 
canvas.width = 150; 
var canvasContext = canvas.getContext('2d'); 
canvasContext.beginPath(); 

// Draw the red line. 

canvasContext.moveTo(10, 0); 
canvasContext.lineTo(10, 100); 
canvasContext.strokeStyle = '#FF0000'; 
canvasContext.stroke(); 

canvasContext.beginPath(); // begin new path 
// Draw the green line. 
canvasContext.moveTo(50, 0); 
canvasContext.strokeStyle = '#00FF00'; 
canvasContext.lineTo(50, 100); 
canvasContext.stroke(); 

document.body.appendChild(canvas);​ 

我对webgl的经验有限,所以如果我错了请纠正我。

+0

我敢肯定,Canvas元素和WebGL是不同的东西。 – Blender 2012-08-10 05:22:21

+0

@Blender是的我认为他们的实现不同我不知道如果画布遵循* gl遵循相同的原则,它只是看起来像从示例代码相比,与opengl,你知道像获取上下文设置颜色等,所以我真的不能太确定,谢谢。 – 2012-08-10 05:27:33