clearRect function doesn't clear the canvas
Asked Answered
D

5

53

I'm using this script on the body onmousemove function:

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();
}

It's supposed to clear the canvas each time I move the mouse around, and draw a new line, but it isn't working properly. I'm trying to solve it without using jQuery, mouse listeners or similar.

Here is a demo: https://jsfiddle.net/0y4wf31k/

Dextroglucose answered 17/11, 2012 at 23:46 Comment(0)
L
107

You should use "beginPath()". That is it.

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();
}
Lidialidice answered 16/4, 2013 at 11:12 Comment(4)
Would like to add that this goes for draw methods such as rect and arc as well.Staples
It's old but... closePath is useless and misleading here, it's just a lineTo(previousStartingPointOfThePath) so for a single line, it won't do anything, and it doesn't tell at all that you finished your path declaration.Ginzburg
Thanks @kaiido, I edited the question. I think the edit is in the spirit of the answer. Hope you don't mind aviomaksimGalenism
Thank you! that is crazy, why does the clear fail unless you do a beginPath? it makes no sense.Skinflint
H
8

Be advised that ctx.clearRect() does not work properly on Google Chrome. I spent hours trying to solve a related problem, only to find that on Chrome, instead of filling the rectangle with rgba(0, 0, 0, 0), it actually fills the rectangle with rgba(0, 0, 0, 1) instead!

Consequently, in order to have the rectangle filled properly with the required transparent black pixels, you need, on Chrome, to do this instead:

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

This should, of course, work on all browsers providing proper support for the HTML5 Canvas object.

Hamadryad answered 22/2, 2019 at 16:0 Comment(0)
R
4

And beginPath() and stroke() we need to use. This code works same as clearRect(...)

ctx.beginPath();
ctx.fillStyle = "rgba(0, 0, 0, 255)";
ctx.fillRect(0, 0, canvas.width, canvas.height);    
ctx.stroke();
Rheumatic answered 22/12, 2020 at 1:33 Comment(1)
why do we need this? what if one has a colored background?Frizette
A
0

If you're getting a blacked out screen using this method

ctx.beginPath()
ctx.fillStyle = "rgba(0, 0, 0, 255)"
ctx.fillRect(0, 0, canvas.width, canvas.height)    
ctx.stroke();

then switch all the 0's in rgba to 255

ctx.beginPath();
ctx.fillStyle = "rgba(255, 255, 255, 255)";
ctx.fillRect(0, 0, canvas.width, canvas.height);    
ctx.stroke();
Adala answered 14/2, 2023 at 19:13 Comment(0)
C
-4

Try with 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();
}

Demo HERE

Catchfly answered 17/11, 2012 at 23:54 Comment(1)
or simply myCanvas.width = myCanvas.width;.Exercise

© 2022 - 2024 — McMap. All rights reserved.