
Do you like sketching? Did you know that you can sketch on Java Script canvas too?
Demo:
What do you need to do?
To create the JavaScript sketch board you need to have the pencil image(cursor) in the .png/ SVG format and follow the steps below:

- Add HTML
- Add CSS
- Add JavaScript/ jQuery
Step1.
Add HTML
<div id="canvas-wrap">
<div class="sketch-board">
<div class="paper"></div>
</div>
<div class="paperclip"></div>
<canvas id="canvas"></canvas>
<button class="button" id="clear">Clear</button>
<button class="button" id="undo">Undo</button>
<button class="button" id="brushBlack">Black</button>
<button class="button" id="brushYellow">Yellow</button>
<button class="button" id="brushRed">Red</button>
<button class="button" id="brushBlue">Blue</button>
<button class="button" id="brushGreen">Green</button>
</div>
Step2.
Add CSS
Set the colour and the position of the background and elements:
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
#canvas-wrap {
position: relative;
top:-200px;
}
And the canvas with mouse cursor:
canvas {
background-color: #fff;
cursor: url(https://lenadesignorg.files.wordpress.com/2020/06/pencil.png?w=79) 10 60, auto;
z-index:100;
}
Style the sketch board:
.sketch-board {
position: absolute;
width: 600px;
height: 440px;
background-color: #c19875;
z-index:-5;
border-radius: 30px;
left: -80px;
box-shadow:inset 5px -5px 0 #846c5b;
}
.sketch-board:before {
background-color: #fff;
position: absolute;
width: 50px;
height: 170px;
border-radius: 30px;
content:"";
left: 30px;
top: 140px;
box-shadow:inset 5px -5px 0 #846c5b;
}
.paper {
background-color: #e6e3dc;
width: 400px;
height: 320px;
position: absolute;
top: 50px;
left: 140px;
}
.paperclip {
position: absolute;
width: 150px;
height: 40px;
border: 7px solid #c0c0c0;
border-radius: 20px;
left: 180px;
top: 15px;
z-index:999;
}
.paperclip:after {
position: absolute;
content:"";
width: 200px;
height: 30px;
top: -10px;
left:-25px;
background-color: #8b786d;
box-shadow:inset 5px -5px 0 rgba(0,0,0,0.07);
border-radius: 20px;
}

Style buttons:
.button {
position: relative;
background-color: #443742;
border: none;
border-radius:20px;
color: #fff;
padding: 7px 7px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
margin: 2px 2px;
top: 385px;
left:60px;
transition-duration: 0.4s;
}
.button:hover {
background-color: #cea07e;
}

Step3.
Add JavaScript/ jQuery
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
Note: Remember to add jQuery (code above) in the <head> section in your code.
var canvas = document.querySelector('canvas');
canvas.style.position = 'absolute';
canvas.style.top = "80px";
canvas.style.left = "50px";
var ctx = canvas.getContext('2d');
canvas.width = 500;
canvas.height = 350;
var lastX;
var lastY;
var mouseX;
var mouseY;
var canvasOffset = $("#canvas").offset();
var offsetX = canvasOffset.left;
var offsetY = canvasOffset.top;
var isMouseDown = false;
var brushSize = 3;
var brushColor = "#000";
ctx.lineJoin = ctx.lineCap = 'round';
var points = [];
function handleMouseDown(e) {
mouseX = parseInt(e.clientX - offsetX);
mouseY = parseInt(e.clientY - offsetY);
ctx.beginPath();
if (ctx.lineWidth != brushSize) {
ctx.lineWidth = brushSize;
}
if (ctx.strokeStyle != brushColor) {
ctx.strokeStyle = brushColor;
}
ctx.moveTo(mouseX, mouseY);
points.push({
x: mouseX,
y: mouseY,
size: brushSize,
color: brushColor,
mode: "begin"
});
lastX = mouseX;
lastY = mouseY;
isMouseDown = true;
}
function handleMouseUp(e) {
mouseX = parseInt(e.clientX - offsetX);
mouseY = parseInt(e.clientY - offsetY);
isMouseDown = false;
points.push({
x: mouseX,
y: mouseY,
size: brushSize,
color: brushColor,
mode: "end"
});
}
function handleMouseMove(e) {
mouseX = parseInt(e.clientX - offsetX);
mouseY = parseInt(e.clientY - offsetY);
if (isMouseDown) {
ctx.lineTo(mouseX, mouseY);
ctx.stroke();
lastX = mouseX;
lastY = mouseY;
points.push({
x: mouseX,
y: mouseY,
size: brushSize,
color: brushColor,
mode: "draw"
});
}
}
$("#canvas").mousedown(function (e) {
handleMouseDown(e);
});
$("#canvas").mousemove(function (e) {
handleMouseMove(e);
});
$("#canvas").mouseup(function (e) {
handleMouseUp(e);
});
function redrawAll() {
if (points.length == 0) {
return;
}
ctx.clearRect(0, 0, canvas.width, canvas.height);
for (var i = 0; i < points.length; i++) {
var pt = points[i];
var begin = false;
if (ctx.lineWidth != pt.size) {
ctx.lineWidth = pt.size;
begin = true;
}
if (ctx.strokeStyle != pt.color) {
ctx.strokeStyle = pt.color;
begin = true;
}
if (pt.mode == "begin" || begin) {
ctx.beginPath();
ctx.moveTo(pt.x, pt.y);
}
ctx.lineTo(pt.x, pt.y);
if (pt.mode == "end" || (i == points.length - 1)) {
ctx.stroke();
}
}
ctx.stroke();
}
function undoLast() {
points.pop();
redrawAll();
}
$("#brushGreen").click(function () {
brushColor = "#89bd9e";
});
$("#brushYellow").click(function () {
brushColor = "#fde74c";
});
$("#brushRed").click(function () {
brushColor = "#e55934";
});
$("#brushBlue").click(function () {
brushColor = "#5bc0eb";
});
$("#brushBlack").click(function () {
brushColor = "#000";
});
var interval;
$("#undo").mousedown(function () {
interval = setInterval(undoLast, 20);
}).mouseup(function () {
clearInterval(interval);
});
var clear = function(){
ctx.clearRect(0,0,500,350);
};
$('#clear').on("click",clear);
Enjoy coding!
Read also:
Decorate the Christmas tree! (CSS & jQuery/ UI drag and drop)