In today’s blog we will create an amazing drag paper project. With which we can move the paper with the cursor. So let’s start without any delay.
01. HTML –
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<title>CodeJuster</title>
<link rel='stylesheet' href='https://fonts.googleapis.com/css2?family=Short+Stack&family=Homemade+Apple&display=swap'><link rel="stylesheet" href="./style.css">
</head>
<body>
<div class="paper heart">
</div>
<div class="paper image">
<p>or m tera pyaar me</p>
<p>gir gaya 😍 </p>
<img src="images/1.jpeg" />
</div>
<div class="paper image">
<p>mujhse dosti </p>
<p> kroge❤️ </p>
<img src="images/2.jpeg" />
</div>
<div class="paper image">
<p>Tum to mere dog</p>
<p> se bhi jyaada pyaare ho ❤️ </p>
<img src="images/3.jpg" />
</div>
<div class="paper red">
<p class="p1">Kahi jaa rahe to</p>
<p class="p2">khyaal rakhna 😍</p>
</div>
<div class="paper">
<p class="p1">Tum cute ho bey </p>
<p class="p1">Kalin bhaiya <span style="color: red !important;">❤️</span></p>
</div>
<div class="paper">
<p class="p1">Dekh kya raha hai jaldi se hata!</p>
</div>
<!-- partial -->
<script src="./script.js"></script>
</body>
</html>
02. CSS –
@import url('https://fonts.googleapis.com/css2?family=Zeyada&display=swap');
body {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background-size: 1000px;
background-image: url("https://www.psdgraphics.com/wp-content/uploads/2022/01/white-math-paper-texture.jpg");
background-position: center center;
}
.paper {
background-image: url("https://i0.wp.com/textures.world/wp-content/uploads/2018/10/2-Millimeter-Paper-Background-copy.jpg?ssl=1");
background-size: 500px;
background-position: center center;
padding: 20px 100px;
/* min-width: 800px; */
transform: rotateZ(-5deg);
box-shadow: 1px 15px 20px 0px rgba(0,0,0,0.5);
position: absolute;
}
.paper.heart {
position: relative;
width: 200px;
height: 200px;
padding: 0;
border-radius: 50%;
}
.paper.image {
padding: 10px;
}
.paper.image p {
font-size: 30px;
}
img {
max-height: 200px;
width: 100%;
user-select: none;
}
.paper.heart::after {
content: "";
background-image: url('https://cdn.pixabay.com/photo/2016/03/31/19/25/cartoon-1294994__340.png');
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-size: 150px;
background-position: center center;
background-repeat: no-repeat;
opacity: 0.6;
}
p {
font-family: 'Zeyada';
font-size: 50px;
color: rgb(247, 4, 4);
opacity: 0.75;
user-select: none;
}
03. JavaScript > mobile.js –
let highestZ = 1;
class Paper {
holdingPaper = false;
touchStartX = 0;
touchStartY = 0;
touchMoveX = 0;
touchMoveY = 0;
touchEndX = 0;
touchEndY = 0;
prevTouchX = 0;
prevTouchY = 0;
velX = 0;
velY = 0;
rotation = Math.random() * 30 - 15;
currentPaperX = 0;
currentPaperY = 0;
rotating = false;
init(paper) {
paper.addEventListener('touchmove', (e) => {
e.preventDefault();
if(!this.rotating) {
this.touchMoveX = e.touches[0].clientX;
this.touchMoveY = e.touches[0].clientY;
this.velX = this.touchMoveX - this.prevTouchX;
this.velY = this.touchMoveY - this.prevTouchY;
}
const dirX = e.touches[0].clientX - this.touchStartX;
const dirY = e.touches[0].clientY - this.touchStartY;
const dirLength = Math.sqrt(dirX*dirX+dirY*dirY);
const dirNormalizedX = dirX / dirLength;
const dirNormalizedY = dirY / dirLength;
const angle = Math.atan2(dirNormalizedY, dirNormalizedX);
let degrees = 180 * angle / Math.PI;
degrees = (360 + Math.round(degrees)) % 360;
if(this.rotating) {
this.rotation = degrees;
}
if(this.holdingPaper) {
if(!this.rotating) {
this.currentPaperX += this.velX;
this.currentPaperY += this.velY;
}
this.prevTouchX = this.touchMoveX;
this.prevTouchY = this.touchMoveY;
paper.style.transform = `translateX(${this.currentPaperX}px) translateY(${this.currentPaperY}px) rotateZ(${this.rotation}deg)`;
}
})
paper.addEventListener('touchstart', (e) => {
if(this.holdingPaper) return;
this.holdingPaper = true;
paper.style.zIndex = highestZ;
highestZ += 1;
this.touchStartX = e.touches[0].clientX;
this.touchStartY = e.touches[0].clientY;
this.prevTouchX = this.touchStartX;
this.prevTouchY = this.touchStartY;
});
paper.addEventListener('touchend', () => {
this.holdingPaper = false;
this.rotating = false;
});
paper.addEventListener('gesturestart', (e) => {
e.preventDefault();
this.rotating = true;
});
paper.addEventListener('gestureend', () => {
this.rotating = false;
});
}
}
const papers = Array.from(document.querySelectorAll('.paper'));
papers.forEach(paper => {
const p = new Paper();
p.init(paper);
});
03. JavaScript > script.js –
let highestZ = 1;
class Paper {
holdingPaper = false;
mouseTouchX = 0;
mouseTouchY = 0;
mouseX = 0;
mouseY = 0;
prevMouseX = 0;
prevMouseY = 0;
velX = 0;
velY = 0;
rotation = Math.random() * 30 - 15;
currentPaperX = 0;
currentPaperY = 0;
rotating = false;
init(paper) {
document.addEventListener('mousemove', (e) => {
if(!this.rotating) {
this.mouseX = e.clientX;
this.mouseY = e.clientY;
this.velX = this.mouseX - this.prevMouseX;
this.velY = this.mouseY - this.prevMouseY;
}
const dirX = e.clientX - this.mouseTouchX;
const dirY = e.clientY - this.mouseTouchY;
const dirLength = Math.sqrt(dirX*dirX+dirY*dirY);
const dirNormalizedX = dirX / dirLength;
const dirNormalizedY = dirY / dirLength;
const angle = Math.atan2(dirNormalizedY, dirNormalizedX);
let degrees = 180 * angle / Math.PI;
degrees = (360 + Math.round(degrees)) % 360;
if(this.rotating) {
this.rotation = degrees;
}
if(this.holdingPaper) {
if(!this.rotating) {
this.currentPaperX += this.velX;
this.currentPaperY += this.velY;
}
this.prevMouseX = this.mouseX;
this.prevMouseY = this.mouseY;
paper.style.transform = `translateX(${this.currentPaperX}px) translateY(${this.currentPaperY}px) rotateZ(${this.rotation}deg)`;
}
})
paper.addEventListener('mousedown', (e) => {
if(this.holdingPaper) return;
this.holdingPaper = true;
paper.style.zIndex = highestZ;
highestZ += 1;
if(e.button === 0) {
this.mouseTouchX = this.mouseX;
this.mouseTouchY = this.mouseY;
this.prevMouseX = this.mouseX;
this.prevMouseY = this.mouseY;
}
if(e.button === 2) {
this.rotating = true;
}
});
window.addEventListener('mouseup', () => {
this.holdingPaper = false;
this.rotating = false;
});
}
}
const papers = Array.from(document.querySelectorAll('.paper'));
papers.forEach(paper => {
const p = new Paper();
p.init(paper);
});
Result :-
Download Ebooks – Click Me
Download Notes – Click Me