Spaces:
Running
Running
| // Initialize animations on scroll | |
| const observerOptions = { | |
| threshold: 0.1, | |
| rootMargin: '0px 0px -50px 0px' | |
| }; | |
| const observer = new IntersectionObserver(function(entries) { | |
| entries.forEach(entry => { | |
| if (entry.isIntersecting) { | |
| entry.target.classList.add('fade-in'); | |
| } | |
| }); | |
| }, observerOptions); | |
| // Observe all sections | |
| document.addEventListener('DOMContentLoaded', function() { | |
| const sections = document.querySelectorAll('section'); | |
| sections.forEach(section => { | |
| observer.observe(section); | |
| }); | |
| // Mobile menu toggle | |
| const mobileMenuButton = document.getElementById('mobile-menu-button'); | |
| const mobileMenu = document.getElementById('mobile-menu'); | |
| if (mobileMenuButton && mobileMenu) { | |
| mobileMenuButton.addEventListener('click', function() { | |
| mobileMenu.classList.toggle('hidden'); | |
| }); | |
| } | |
| // Smooth scroll for anchor links | |
| document.querySelectorAll('a[href^="#"]').forEach(anchor => { | |
| anchor.addEventListener('click', function (e) { | |
| e.preventDefault(); | |
| const target = document.querySelector(this.getAttribute('href')); | |
| if (target) { | |
| target.scrollIntoView({ | |
| behavior: 'smooth', | |
| block: 'start' | |
| }); | |
| } | |
| }); | |
| }); | |
| // Form validation | |
| const forms = document.querySelectorAll('form'); | |
| forms.forEach(form => { | |
| form.addEventListener('submit', function(e) { | |
| e.preventDefault(); | |
| // Add your form validation logic here | |
| console.log('Form submitted'); | |
| }); | |
| }); | |
| }); | |
| // Counter animation for numbers | |
| function animateCounter(element, target, duration = 2000) { | |
| let start = 0; | |
| const increment = target / (duration / 16); | |
| function updateCounter() { | |
| start += increment; | |
| if (start < target) { | |
| element.textContent = Math.floor(start); | |
| requestAnimationFrame(updateCounter); | |
| } else { | |
| element.textContent = target; | |
| } | |
| } | |
| updateCounter(); | |
| } | |
| // Lazy loading images | |
| const imageObserver = new IntersectionObserver((entries, observer) => { | |
| entries.forEach(entry => { | |
| if (entry.isIntersecting) { | |
| const img = entry.target; | |
| img.src = img.dataset.src; | |
| img.classList.remove('lazy'); | |
| imageObserver.unobserve(img); | |
| } | |
| }); | |
| }); | |
| document.addEventListener('DOMContentLoaded', () => { | |
| const lazyImages = document.querySelectorAll('img.lazy'); | |
| lazyImages.forEach(img => imageObserver.observe(img)); | |
| }); |