Paint Project with HTML CSS and Java Script with source code updated

index.html
<!DOCTYPE HTML>
<html>
<body>
<div id='colors'>
<button id='black' onclick='changeColor("black")' ontouchstart='changeColor("black")'></button>
<button id='red' onclick='changeColor("red")' ontouchstart='changeColor("red")'></button>
<button id='green' onclick='changeColor("green")' ontouchstart='changeColor("green")'></button>
<button id='blue' onclick='changeColor("blue")' ontouchstart='changeColor("blue")'></button>
<button id='orange' onclick='changeColor("orange")' ontouchstart='changeColor("orange")'></button>
<button id='pink' onclick='changeColor("pink")' ontouchstart='changeColor("pink")'></button>
</div>
<canvas id='canvas' width='300' height='200'></canvas>
<div>
<button onclick='clearCanvas()'>Clear</button>
</div>
</body>
</html>
style.css
#canvas
{
border: 1px solid black;
margin: 10px 0 10px 0;
cursor: pointer;
}
#colors button
{
width: 40px;
height: 40px;
border-radius: 100%;
margin-top: 0px;
}
#black
{
background: black;
}
#pink
{
background: pink;
}
#red
{
background: red;
}
#green
{
background: green;
}
#blue
{
background: blue;
}
#orange
{
background: orange;
}
script.js
var arr_touches = [];
var canvas;
var ctx;
var down = false; //mouse is pressed
var color = 'black'; //default drawing color
var width = 5; // drawing width
//calling window.onload to make sure the HTML is loaded
window.onload = function() {
canvas = document.getElementById('canvas');
ctx = canvas.getContext('2d');
ctx.lineWidth = width;
//handling mouse click and move events
canvas.addEventListener('mousemove', handleMove);
canvas.addEventListener('mousedown', handleDown);
canvas.addEventListener('mouseup', handleUp);
//handling mobile touch events
canvas.addEventListener("touchstart", handleStart, false);
canvas.addEventListener("touchend", handleEnd, false);
canvas.addEventListener("touchcancel", handleCancel, false);
canvas.addEventListener("touchleave", handleEnd, false);
canvas.addEventListener("touchmove", handleTouchMove, false);
};
function handleMove(e)
{
xPos = e.clientX-canvas.offsetLeft;
yPos = e.clientY-canvas.offsetTop;
if(down == true)
{
ctx.lineTo(xPos,yPos); //create a line from old point to new one
ctx.strokeStyle = color;
ctx.stroke();
}
}
function handleDown()
{
down = true;
ctx.beginPath();
ctx.moveTo(xPos, yPos);
}
function handleUp()
{
down = false;
}
function handleStart(evt)
{
var touches = evt.changedTouches;
for(var i = 0; i < touches.length; i++)
{
if(isValidTouch(touches[i]))
{
evt.preventDefault();
arr_touches.push(copyTouch(touches[i]));
ctx.beginPath();
ctx.fillStyle = color;
ctx.fill();
}
}
}
function handleTouchMove(evt)
{
var touches = evt.changedTouches;
var offset = findPos(canvas);
for (var i = 0; i < touches.length; i++)
{
if(isValidTouch(touches[i]))
{
evt.preventDefault();
var idx = ongoingTouchIndexById(touches[i].identifier);
if (idx >= 0)
{
ctx.beginPath();
ctx.moveTo(arr_touches[idx].clientX-offset.x, arr_touches[idx].clientY-offset.y);
ctx.lineTo(touches[i].clientX-offset.x, touches[i].clientY-offset.y);
ctx.strokeStyle = color;
ctx.stroke();
arr_touches.splice(idx, 1, copyTouch(touches[i]));
}
}
}
}
function handleEnd(evt)
{
var touches = evt.changedTouches;
var offset = findPos(canvas);
for (var i = 0; i < touches.length; i++)
{
if(isValidTouch(touches[i]))
{
evt.preventDefault();
var idx = ongoingTouchIndexById(touches[i].identifier);
if (idx >= 0)
{
ctx.lineWidth = 4;
ctx.fillStyle = color;
ctx.beginPath();
ctx.moveTo(arr_touches[idx].clientX-offset.x, arr_touches[idx].clientY-offset.y);
ctx.lineTo(touches[i].clientX-offset.x, touches[i].clientY-offset.y);
arr_touches.splice(i, 1);
}
}
}
}
function handleCancel(evt)
{
evt.preventDefault();
var touches = evt.changedTouches;
for (var i = 0; i < touches.length; i++) {
arr_touches.splice(i, 1);
}
}
function copyTouch(touch)
{
return {identifier: touch.identifier,clientX: touch.clientX,clientY: touch.clientY};
}
function ongoingTouchIndexById(idToFind)
{
for (var i = 0; i < arr_touches.length; i++) {
var id = arr_touches[i].identifier;
if (id == idToFind) {
return i;
}
}
return -1;
}
function changeColor(new_color)
{
color = new_color;
}
function clearCanvas()
{
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
function isValidTouch(touch)
{
var curleft = 0, curtop = 0;
var offset = 0;
if (canvas.offsetParent) {
do {
curleft += canvas.offsetLeft;
curtop += canvas.offsetTop;
} while (touch == canvas.offsetParent);
offset = { x: curleft-document.body.scrollLeft, y: curtop-document.body.scrollTop };
}
if(touch.clientX-offset.x > 0 &&
touch.clientX-offset.x < parseFloat(canvas.width) &&
touch.clientY-offset.y >0 &&
touch.clientY-offset.y < parseFloat(canvas.height)) {
return true;
}
else
{
return false;
}
}
function findPos(obj)
{
var curleft = 0, curtop = 0;
if (obj.offsetParent)
{
do {
curleft += obj.offsetLeft;
curtop += obj.offsetTop;
} while (obj == obj.offsetParent);
return { x: curleft-document.body.scrollLeft, y: curtop-document.body.scrollTop };
}
}
Types of Sorting Algorithms:
Additional Reading
- SEO Practices Everyone Should Follow SEO Rules
- Complete Top SEO Checklist
- Yoast Seo Premium 15.2 Nulled – WordPress SEO Plugin
- Top 50+ SEO Interview Questions
- What is a Backlink? How to Get More Backlinks
READ MORE
If you found this post useful, don’t forget to share this with your friends, and if you have any query feel free to comment it in the comment section.
Thank you 😊 Keep Learning !