Ваш код не работает, потому что вы рисуете новую очень короткую линию на каждом перемещении мыши, от предыдущей позиции мыши до текущей.
Вам нужно как минимум два слоя, каждый со своим холстом.
В нижнем слое вы, наконец, рисуете каждую линию. Верхний слой пуст.
При наведении курсора вы устанавливаете флажок вниз и сохраняете координаты мыши в точках x1 и y1. На этом шаге ничего не рисуйте.
При перемещении мыши, если установлен флаг downflag, вы сохраняете координаты мыши в x2 и y2, очищаете верхний слой и рисуете линию от (x1, y1) до (x2, y2) на верхнем слое.
При наведении курсора мыши вы убираете флажок вниз, очищаете верхний слой и рисуете линию от (x1, y1) до (x2, y2) на нижнем слое.
Редактировать : Пример кода (требуется jQuery). Смотрите это в действии на https://codepen.io/locoluis/pen/JVerqO
HTML
<div id="arena">
<canvas id="bg"></canvas>
<canvas id="fg"></canvas>
</div>
CSS
* {
box-sizing: border-box;
}
html, body {
width: 100%;
height: 100%;
margin: 0;
padding: 5px;
}
#arena {
position: relative;
width: 100%;
height: 100%;
border: solid 1px black;
background: white;
}
#bg, #fg {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
width: 100%;
height: 100%;
}
#bg {
z-index: 1;
}
#fg {
z-index: 2;
cursor: crosshair;
}
JS
var x1, y1, x2, y2, downflag = false;
var fg, bg, ctxFg, ctxBg;
function pendown(e)
{
x1 = e.offsetX;
y1 = e.offsetY;
downflag = true;
}
function penmove(e)
{
if(!downflag) {
return;
}
ctxFg.clearRect(0, 0, fg.width, fg.height);
x2 = e.offsetX;
y2 = e.offsetY;
ctxFg.beginPath();
ctxFg.moveTo(x1, y1);
ctxFg.lineTo(x2, y2);
ctxFg.stroke();
}
function penup(e)
{
if(!downflag) {
return;
}
downflag = false;
ctxFg.clearRect(0, 0, fg.width, fg.height);
x2 = e.offsetX;
y2 = e.offsetY;
ctxBg.beginPath();
ctxBg.moveTo(x1, y1);
ctxBg.lineTo(x2, y2);
ctxBg.stroke();
}
function init()
{
fg = document.getElementById('fg');
bg = document.getElementById('bg');
bg.width = fg.width = jQuery(fg).width();
bg.height = fg.height = jQuery(bg).height();
ctxFg = fg.getContext('2d');
ctxFg.strokeStyle = "red";
ctxBg = bg.getContext('2d');
ctxBg.strokeStyle = "black";
jQuery(fg).on('mousedown', pendown);
jQuery(fg).on('mousemove', penmove);
jQuery(fg).on('mouseup', penup);
}
window.addEventListener('load', init, false);