JSFiddle - React, Tailwind, and code Playground
by m1erickson
HTML
<h4>Drag 1 or more shapes.</h4>
<canvas id="canvas" width=300 height=300></canvas>
CSS
body{ background-color: ivory; }
#canvas{border:1px solid red;}
JavaScript
// get canvas related references
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var BB = canvas.getBoundingClientRect();
var offsetX = BB.left;
var offsetY = BB.top;
var WIDTH = canvas.width;
var HEIGHT = canvas.height;
// drag related variables
var dragok = false;
var startX;
var startY;
// an array of objects that define different rectangles
var rects = [];
rects.push({
x: 75 - 15,
y: 50 - 15,
width: 30,
height: 30,
fill: "#444444",
isDragging: false
});
rects.push({
x: 75 - 25,
y: 50 - 25,
width: 30,
height: 30,
fill: "#ff550d",
isDragging: false
});
rects.push({
x: 75 - 35,
y: 50 - 35,
width: 30,
height: 30,
fill: "#800080",
isDragging: false
});
rects.push({
x: 75 - 45,
y: 50 - 45,
width: 30,
height: 30,
fill: "#0c64e8",
isDragging: false
});
// listen for mouse events
canvas.onmousedown = myDown;
canvas.onmouseup = myUp;
canvas.onmousemove = myMove;
// call to draw the scene
draw();
// draw a single rect
function rect(x, y, w, h) {
ctx.beginPath();
ctx.rect(x, y, w, h);
ctx.closePath();
ctx.fill();
}
// clear the canvas
function clear() {
ctx.clearRect(0, 0, WIDTH, HEIGHT);
}
// redraw the scene
function draw() {
clear();
ctx.fillStyle = "#FAF7F8";
rect(0, 0, WIDTH, HEIGHT);
// redraw each rect in the rects[] array
for (var i = 0; i < rects.length; i++) {
var r = rects[i];
ctx.fillStyle = r.fill;
rect(r.x, r.y, r.width, r.height);
}
}
// handle mousedown events
function myDown(e) {
// tell the browser we're handling this mouse event
e.preventDefault();
e.stopPropagation();
// get the current mouse position
var mx = parseInt(e.clientX - offsetX);
var my = parseInt(e.clientY - offsetY);
// test each rect to see if mouse is inside
dragok = false;
for (var i = 0; i < rects.length; i++) {
var r = rects[i];
...