46

我在 bodyonmousemove函数上使用这个脚本:

function lineDraw() {
    // Get the context and the canvas:
    var canvas = document.getElementById("myCanvas");
    var context = canvas.getContext("2d");
    // Clear the last canvas
    context.clearRect(0, 0, canvas.width, canvas.height);
    // Draw the line:
    context.moveTo(0, 0);
    context.lineTo(event.clientX, event.clientY);
    context.stroke();
}

每次我移动鼠标并画一条新线时,它都应该清除画布,但它不能正常工作。我试图在不使用 jQuery、鼠标侦听器或类似的情况下解决它。

这是一个演示:https ://jsfiddle.net/0y4wf31k/

4

4 回答 4

93

您应该使用“ beginPath() ”。这就对了。

function lineDraw() {   
    var canvas=document.getElementById("myCanvas");
    var context=canvas.getContext("2d");
    context.clearRect(0, 0, context.width,context.height);
    context.beginPath();//ADD THIS LINE!<<<<<<<<<<<<<
    context.moveTo(0,0);
    context.lineTo(event.clientX,event.clientY);
    context.stroke();
}
于 2013-04-16T11:12:02.990 回答
7

请注意,ctx.clearRect()在 Google Chrome 上无法正常工作。我花了几个小时试图解决一个相关的问题,却发现在 Chrome 上,它不是用 rgba(0, 0, 0, 0) 填充矩形,而是rgba(0, 0, 0, 1) 填充矩形反而!

因此,为了用所需的透明黑色像素正确填充矩形,您需要在 Chrome 上执行此操作:

ctx.fillStyle = "rgba(0, 0, 0, 0)";
ctx.fillRect(left, top, width, height);

当然,这应该适用于为 HTML5 Canvas 对象提供适当支持的所有浏览器。

于 2019-02-22T16:00:09.000 回答
3

还有我们需要用到的 beginPath() 和 stroke()。此代码与 clearRect(...) 相同

ctx.beginPath();
ctx.fillStyle = "rgba(0, 0, 0, 255)";
ctx.fillRect(0, 0, canvas.width, canvas.height);    
ctx.stroke();
于 2020-12-22T01:33:19.497 回答
-4

尝试context.canvas.width = context.canvas.width

function lineDraw() {   
    var canvas=document.getElementById("myCanvas");
    var context=canvas.getContext("2d");
    //context.clearRect(0, 0, context.width,context.height);
    context.canvas.width = context.canvas.width;
    context.moveTo(0,0);
    context.lineTo(event.clientX,event.clientY);
    context.stroke();
}

在这里演示

于 2012-11-17T23:54:33.167 回答