Spaces:
Running
Running
File size: 1,758 Bytes
9a0f1d7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
// Smooth scroll effect for navbar
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener("click", function (e) {
e.preventDefault();
document.querySelector(this.getAttribute("href")).scrollIntoView({
behavior: "smooth"
});
});
});
// 3D Card Flip on hover (for touch devices)
const card3d = document.querySelector('.card-3d');
if (card3d) {
card3d.addEventListener('click', function () {
this.querySelector('.card-inner').classList.toggle('flipped');
});
}
// 3D Tilt Card Effect
const tiltCard = document.getElementById('tiltCard');
if (tiltCard) {
tiltCard.addEventListener('mousemove', (e) => {
const rect = tiltCard.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
const centerX = rect.width / 2;
const centerY = rect.height / 2;
const rotateX = ((y - centerY) / centerY) * 12;
const rotateY = ((x - centerX) / centerX) * 12;
tiltCard.querySelector('.tilt-card-inner').style.transform = `rotateX(${-rotateX}deg) rotateY(${rotateY}deg)`;
});
tiltCard.addEventListener('mouseleave', () => {
tiltCard.querySelector('.tilt-card-inner').style.transform = 'rotateX(0deg) rotateY(0deg)';
});
}
// Animate sections on scroll (intersection observer)
const animatedEls = document.querySelectorAll('.animate-fadein, .animate-slideup, .animate-pop');
const observer = new window.IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.animationPlayState = 'running';
}
});
}, { threshold: 0.1 });
animatedEls.forEach(el => {
el.style.animationPlayState = 'paused';
observer.observe(el);
});
|