.hover-area {
padding: 20px;
background-color: #4CAF50;
color: white;
border-radius: 8px;
cursor: pointer;
position: relative;
}
.smoke-effect {
position: absolute;
pointer-events: none;
animation: rise-up 3s ease-out forwards;
}
@keyframes rise-up {
0% {
transform: translate(0, 0) scale(1);
opacity: 1;
}
50% {
transform: translate(var(--offset-x, 0px), -50px) scale(1.2);
opacity: 0.8;
}
100% {
transform: translate(var(--offset-x, 0px), -100px) scale(0.8);
opacity: 0;
}
}
img {
width: 20px;
height: 20px;
}
Hover over this area
const hoverArea = document.querySelector('.hover-area');
let smokeInterval = null;
let cursorX = 0;
let cursorY = 0;
hoverArea.addEventListener('mouseenter', () => {
// Start the smoke creation interval
smokeInterval = setInterval(() => {
createSmokeEffect(cursorX, cursorY);
}, 200);
});
hoverArea.addEventListener('mousemove', (event) => {
// Update cursor position
cursorX = event.pageX;
cursorY = event.pageY;
});
hoverArea.addEventListener('mouseleave', () => {
// Stop the smoke creation interval
clearInterval(smokeInterval);
smokeInterval = null;
});
function createSmokeEffect(x, y) {
const smokeImage = document.createElement('img');
smokeImage.src = 'https://noqx.io/wp-content/uploads/2024/12/💜.png'; // Replace with your own image
smokeImage.classList.add('smoke-effect');
// Add random horizontal offset for spreading effect
const offsetX = Math.random() * 40 - 20; // Random offset between -20px and +20px
smokeImage.style.setProperty('--offset-x', `${offsetX}px`);
smokeImage.style.left = `${x}px`;
smokeImage.style.top = `${y}px`;
smokeImage.style.position = 'absolute';
document.body.appendChild(smokeImage);
// Remove the smoke effect after the animation ends
smokeImage.addEventListener('animationend', () => {
smokeImage.remove();
});
}