Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Drawing on canva while creating a custom cursor

Code

I want to make a board on which I can draw using random stroke sizes and random colors. I have achieved that but when I add a custom cursor function on line 9 of my code the mouseup function triggers while I’m drawing and I didn’t lift my finger from the mouse button.

I don’t have much experience with HTML canvas and custom cursors. Can anyone tell me why this is happening?

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

const cursor = document.querySelector(".cursor");
const moveCursor = (e) => {
  const mouseY = e.clientY;
  const mouseX = e.clientX;
  cursor.style.transform = `translate3d(${mouseX}px, ${mouseY}px, 0)`;
  cursor.style.transform = `translate3d(${mouseX}px, ${mouseY}px, 0)`;
};

window.addEventListener("mousemove", moveCursor);

var color = $(".selected").css("background-color");
var canvas = $("canvas");
var ctx = canvas[0].getContext("2d");
var lastEvent;
var mouseDown = false;

const colors = ["red", "green", "blue", "purple", "yellow"];
const strokes = [30, 60, 100, 150, 200, 300, 400, 500];

//When clicking on control list items
$(".controls").on("click", "li", function () {
  //Deselect sibling elements
  $(this).siblings().removeClass("selected");
  //Select clicked element
  $(this).addClass("selected");
  //cache current color
  color = $(this).css("background-color");
});

const drawLine = (e) => {
  ctx.beginPath();
  ctx.moveTo(lastEvent.offsetX, lastEvent.offsetY);
  ctx.lineWidth = stroke;
  ctx.lineTo(e.offsetX, e.offsetY);
  ctx.strokeStyle = color;
  ctx.lineCap = "round";
  ctx.stroke();
  lastEvent = e;
};

//On mouse events on the canvas
canvas
  .mousedown(function (e) {
    // ctx.globalCompositeOperation = "destination-over";
    lastEvent = e;
    mouseDown = true;
    color = colors[Math.floor(Math.random() * colors.length)];
    stroke = strokes[Math.floor(Math.random() * strokes.length)];

    drawLine(e);
  })
  .mousemove(function (e) {
    //Draw lines
    if (mouseDown) {
      drawLine(e);
    }
  })
  .mouseup(function () {
    mouseDown = false;
    console.log("lifted");
  })
  .mouseleave(function () {
    canvas.mouseup();
    // console.log("left")
  });
body {
  margin: 0;
  width: 100vw;
  height: 100vh;
  overflow: hidden;
}

body {
  background: #384047;
  font-family: sans-serif;
  cursor: none;
}

canvas {
  background: #fff;
  display: block;
}

.cursor {
  --size: 28px;
  --color: green;
  position: absolute;
  inset: 0;
  display: grid;
  place-content: center;
  width: var(--size);
  height: var(--size);
  background-color: var(--color);
  border-radius: 50%;
}

.cursor::after {
  content: "";
  display: block;
  width: 4px;
  height: 4px;
  background-color: black;
  border-radius: 50%;
  z-index: 1;
}
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <canvas width="1920" height="929"></canvas>
    <div class="cursor"></div>

    <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
    <script src="script.js"></script>
  </body>
</html>

>Solution :

the mouseup function triggers while I’m drawing

It is probably rather the mouseleave that triggers here, I suppose, when the cursor "comes between" your canvas and the actual mouse cursor. (You are calling your mouseup handler function from in there.)

Put pointer-events: none; on the cursor element, to make it not react to the mouse pointer in any way.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading