tarot / scripts.js
wadim's picture
Upload scripts.js
e88854c verified
Raw
History Blame Contribute Delete
6.49 kB
document.addEventListener("DOMContentLoaded", function () {
const cardContainer = document.getElementById('cardContainer');
const shuffleButton = document.getElementById('shuffleButton');
const cardData = Array.from({ length: 22 }, (_, i) => `images/card-front-${i + 1}.png`);
let cards = [];
let cardAnimations = new Map();
let enlargedCard = null;
let zIndexCounter = 1;
function createCardElement(cardImage) {
const card = document.createElement('div');
card.className = 'card';
card.style.top = `${Math.random() * (cardContainer.clientHeight - 170)}px`;
card.style.left = `${Math.random() * (cardContainer.clientWidth - 100)}px`;
const front = document.createElement('div');
front.className = 'front';
front.style.backgroundImage = `url(${cardImage})`;
const back = document.createElement('div');
back.className = 'back';
back.style.backgroundImage = `url(images/card-back.png)`;
card.appendChild(front);
card.appendChild(back);
card.classList.add('flipped'); // Start with the back side visible
card.addEventListener('click', () => {
// Stop movement
const animationId = cardAnimations.get(card);
if (animationId) {
cancelAnimationFrame(animationId);
cardAnimations.delete(card);
}
// Bring the clicked card to the front
card.style.zIndex = zIndexCounter++;
// If card is already enlarged, reduce it
if (enlargedCard === card) {
card.style.transition = 'transform 0.6s, width 0.6s, height 0.6s, top 0.6s, left 0.6s';
card.style.transform = '';
card.style.width = '100px';
card.style.height = '170px';
card.style.top = card.originalTop;
card.style.left = card.originalLeft;
setTimeout(() => {
card.classList.toggle('flipped');
card.style.transition = '';
moveCard(card); // Restart movement
}, 600);
enlargedCard = null;
} else {
// Enlarge card
card.originalTop = card.style.top;
card.originalLeft = card.style.left;
card.style.transition = 'transform 0.6s, width 0.6s, height 0.6s, top 0.6s, left 0.6s';
const newWidth = card.clientWidth * 3;
const newHeight = card.clientHeight * 3;
const newLeft = (cardContainer.clientWidth - newWidth) / 2;
const newTop = (cardContainer.clientHeight - newHeight) / 2;
card.style.width = `${newWidth}px`;
card.style.height = `${newHeight}px`;
card.style.top = `${newTop}px`;
card.style.left = `${newLeft}px`;
setTimeout(() => {
card.classList.toggle('flipped');
card.style.transform = '';
card.style.transition = '';
}, 600);
enlargedCard = card;
}
});
// Drag functionality
let offsetX, offsetY;
let isDragging = false;
card.addEventListener('mousedown', (e) => {
isDragging = true;
card.style.cursor = 'grabbing';
const rect = card.getBoundingClientRect();
offsetX = e.clientX - rect.left;
offsetY = e.clientY - rect.top;
card.classList.add('dragging');
});
document.addEventListener('mousemove', (e) => {
if (isDragging) {
card.style.left = `${e.clientX - offsetX}px`;
card.style.top = `${e.clientY - offsetY}px`;
}
});
document.addEventListener('mouseup', () => {
if (isDragging) {
isDragging = false;
card.classList.remove('dragging');
card.style.cursor = 'grab';
}
});
cardContainer.appendChild(card);
return card;
}
function moveCard(card) {
let xDirection = Math.random() > 0.5 ? 1 : -1;
let yDirection = Math.random() > 0.5 ? 1 : -1;
let xSpeed = Math.random() * 0.5 + 0.1; // Slower speed
let ySpeed = Math.random() * 0.5 + 0.1; // Slower speed
function updatePosition() {
const rect = card.getBoundingClientRect();
if (rect.left <= 0 || rect.right >= cardContainer.clientWidth) {
xDirection *= -1;
}
if (rect.top <= 0 || rect.bottom >= cardContainer.clientHeight) {
yDirection *= -1;
}
card.style.left = `${card.offsetLeft + xSpeed * xDirection}px`;
card.style.top = `${card.offsetTop + ySpeed * yDirection}px`;
const animationId = requestAnimationFrame(updatePosition);
cardAnimations.set(card, animationId);
}
updatePosition();
}
function shuffleCards() {
cards.forEach(card => {
// Cancel current animation
const animationId = cardAnimations.get(card);
if (animationId) {
cancelAnimationFrame(animationId);
cardAnimations.delete(card);
}
// Set new random position
card.style.transition = 'left 0.5s, top 0.5s';
card.style.left = `${Math.random() * (cardContainer.clientWidth - 100)}px`;
card.style.top = `${Math.random() * (cardContainer.clientHeight - 180)}px`;
// Restart animation after position change
setTimeout(() => {
card.style.transition = ''; // Remove transition after moving
moveCard(card);
}, 500); // Wait for the transition to finish before restarting animation
});
}
function initializeCards() {
while (cardContainer.firstChild) {
cardContainer.removeChild(cardContainer.firstChild);
}
cards = cardData.map(createCardElement);
shuffleCards();
}
shuffleButton.addEventListener('click', shuffleCards);
initializeCards();
});