santa working
This commit is contained in:
@ -14,4 +14,22 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.santa {
|
||||||
|
position: fixed;
|
||||||
|
width: 100px;
|
||||||
|
height: auto;
|
||||||
|
z-index: 1000;
|
||||||
|
pointer-events: none;
|
||||||
|
transition: transform 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.present {
|
||||||
|
position: fixed;
|
||||||
|
width: 50px;
|
||||||
|
height: auto;
|
||||||
|
z-index: 999;
|
||||||
|
pointer-events: none;
|
||||||
|
transition: top linear, opacity linear;
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
const santa = true; // enable/disable santa
|
const santaIsFlying = true; // enable/disable santa
|
||||||
let snowflakesCount = 500; // count of snowflakes (recommended values: 300-600)
|
let snowflakesCount = 500; // count of snowflakes (recommended values: 300-600)
|
||||||
const snowflakesCountMobile = 250; // count of snowflakes on mobile devices
|
const snowflakesCountMobile = 250; // count of snowflakes on mobile devices
|
||||||
const snowFallSpeed = 3; // speed of snowfall (recommended values: 0-5)
|
const snowFallSpeed = 3; // speed of snowfall (recommended values: 0-5)
|
||||||
@ -31,7 +31,7 @@ function toggleSnowfall() {
|
|||||||
if (!animationFrameId) {
|
if (!animationFrameId) {
|
||||||
initializeCanvas();
|
initializeCanvas();
|
||||||
snowflakes = createSnowflakes(santaContainer);
|
snowflakes = createSnowflakes(santaContainer);
|
||||||
animateSanta();
|
animateAll();
|
||||||
} else {
|
} else {
|
||||||
console.warn('could not initialize santa: animation frame is already running');
|
console.warn('could not initialize santa: animation frame is already running');
|
||||||
}
|
}
|
||||||
@ -59,7 +59,7 @@ function initializeCanvas() {
|
|||||||
console.warn('Canvas already exists.');
|
console.warn('Canvas already exists.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const container = document.querySelector('.santa-container');
|
const container = document.querySelector('.santa-container');
|
||||||
if (!container) {
|
if (!container) {
|
||||||
console.error('Error: No element with class "santa-container" found.');
|
console.error('Error: No element with class "santa-container" found.');
|
||||||
@ -140,15 +140,131 @@ function updateSnowflakes() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const presentImages = [
|
||||||
|
'images/gift1.png',
|
||||||
|
'images/gift2.png',
|
||||||
|
'images/gift3.png',
|
||||||
|
'images/gift4.png',
|
||||||
|
'images/gift5.png',
|
||||||
|
'images/gift6.png',
|
||||||
|
'images/gift7.png',
|
||||||
|
'images/gift8.png',
|
||||||
|
];
|
||||||
|
|
||||||
|
const santaImage = 'images/santa.gif';
|
||||||
|
|
||||||
|
/*
|
||||||
|
const presentImages = [
|
||||||
|
'seasonals/santa_images/gift1.png',
|
||||||
|
'seasonals/santa_images/gift2.png',
|
||||||
|
'seasonals/santa_images/gift3.png',
|
||||||
|
'seasonals/santa_images/gift4.png',
|
||||||
|
'seasonals/santa_images/gift5.png',
|
||||||
|
'seasonals/santa_images/gift6.png',
|
||||||
|
'seasonals/santa_images/gift7.png',
|
||||||
|
'seasonals/santa_images/gift8.png',
|
||||||
|
];
|
||||||
|
|
||||||
|
const santaImage = 'seasonals/santa_images/santa.gif';
|
||||||
|
*/
|
||||||
|
|
||||||
|
function createSantaElement() {
|
||||||
|
const santa = document.createElement('img');
|
||||||
|
santa.src = santaImage;
|
||||||
|
santa.classList.add('santa');
|
||||||
|
const santaContainer = document.querySelector('.santa-container');
|
||||||
|
santaContainer.appendChild(santa);
|
||||||
|
return santa;
|
||||||
|
}
|
||||||
|
|
||||||
|
function dropPresent(santa) {
|
||||||
|
const present = document.createElement('img');
|
||||||
|
present.src = presentImages[Math.floor(Math.random() * presentImages.length)];
|
||||||
|
present.classList.add('present');
|
||||||
|
const santaContainer = document.querySelector('.santa-container');
|
||||||
|
santaContainer.appendChild(present);
|
||||||
|
|
||||||
|
// Position present at Santa's current location
|
||||||
|
const rect = santa.getBoundingClientRect();
|
||||||
|
present.style.left = `${rect.left + rect.width / 2}px`;
|
||||||
|
present.style.top = `${rect.top + rect.height}px`;
|
||||||
|
|
||||||
|
// Calculate fall duration based on Santa's current height with variation
|
||||||
|
const fallDistance = window.innerHeight - rect.top - rect.height;
|
||||||
|
const baseDuration = fallDistance / 100; // 1 second per 100px
|
||||||
|
const variation = Math.random() * 2000 - 1000; // ±1 second
|
||||||
|
const fallDuration = baseDuration * 1000 + variation;
|
||||||
|
|
||||||
|
// Animate present falling
|
||||||
|
present.style.transition = `top ${fallDuration}ms linear, opacity ${fallDuration}ms linear`;
|
||||||
|
present.style.top = `${window.innerHeight}px`;
|
||||||
|
present.style.opacity = '0';
|
||||||
|
|
||||||
|
// Remove present after animation
|
||||||
|
setTimeout(() => {
|
||||||
|
present.remove();
|
||||||
|
}, fallDuration);
|
||||||
|
}
|
||||||
|
|
||||||
function animateSanta() {
|
function animateSanta() {
|
||||||
|
const santa = createSantaElement();
|
||||||
|
const santaContainer = document.querySelector('.santa-container');
|
||||||
|
const screenWidth = window.innerWidth;
|
||||||
|
const screenHeight = window.innerHeight;
|
||||||
|
const fromLeft = Math.random() < 0.5;
|
||||||
|
const startX = fromLeft ? -100 : screenWidth + 100;
|
||||||
|
const endX = fromLeft ? screenWidth + 100 : -100;
|
||||||
|
const startY = Math.random() * (screenHeight / 2);
|
||||||
|
const endY = Math.random() * (screenHeight / 2);
|
||||||
|
const angle = Math.random() * 20 - 10; // -10 to 10 degrees
|
||||||
|
|
||||||
|
santa.style.left = `${startX}px`;
|
||||||
|
santa.style.top = `${startY}px`;
|
||||||
|
santa.style.transform = `rotate(${angle}deg) ${fromLeft ? 'scaleX(-1)' : 'scaleX(1)'}`; // Mirror if not from left
|
||||||
|
|
||||||
|
const duration = 10000; // 10 seconds
|
||||||
|
const deltaX = endX - startX;
|
||||||
|
const deltaY = endY - startY;
|
||||||
|
const startTime = performance.now();
|
||||||
|
|
||||||
|
function move() {
|
||||||
|
const currentTime = performance.now();
|
||||||
|
const elapsed = currentTime - startTime;
|
||||||
|
const progress = Math.min(elapsed / duration, 1);
|
||||||
|
|
||||||
|
santa.style.left = `${startX + deltaX * progress}px`;
|
||||||
|
santa.style.top = `${startY + deltaY * progress - 100 * Math.sin(progress * Math.PI)}px`; // Parabolic path
|
||||||
|
|
||||||
|
if (progress < 1) {
|
||||||
|
requestAnimationFrame(move);
|
||||||
|
} else {
|
||||||
|
santa.remove();
|
||||||
|
const pause = Math.random() * 5000 + 3000; // 3-8 seconds pause
|
||||||
|
setTimeout(animateSanta, pause);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
requestAnimationFrame(move);
|
||||||
|
|
||||||
|
// Drop presents every 2 seconds
|
||||||
|
const dropInterval = setInterval(() => dropPresent(santa), 2000);
|
||||||
|
|
||||||
|
// Clear interval after animation completes
|
||||||
|
setTimeout(() => {
|
||||||
|
clearInterval(dropInterval);
|
||||||
|
}, duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function animateAll() {
|
||||||
drawSnowflakes();
|
drawSnowflakes();
|
||||||
updateSnowflakes();
|
updateSnowflakes();
|
||||||
animationFrameId = requestAnimationFrame(animateSanta);
|
animationFrameId = requestAnimationFrame(animateAll);
|
||||||
}
|
}
|
||||||
|
|
||||||
// initialize santa
|
// initialize santa
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
if (!santa) {
|
if (!santaIsFlying) {
|
||||||
console.warn('Sante is disabled.');
|
console.warn('Sante is disabled.');
|
||||||
return; // exit if santa is disabled
|
return; // exit if santa is disabled
|
||||||
}
|
}
|
||||||
@ -163,6 +279,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
console.log('Santa enabled.');
|
console.log('Santa enabled.');
|
||||||
initializeCanvas();
|
initializeCanvas();
|
||||||
snowflakes = createSnowflakes(container);
|
snowflakes = createSnowflakes(container);
|
||||||
|
animateAll();
|
||||||
animateSanta();
|
animateSanta();
|
||||||
}
|
}
|
||||||
});
|
});
|
Reference in New Issue
Block a user