Spaces:
Running
Running
| // Плавная прокрутка | |
| function scrollToContact() { | |
| document.querySelector('#contact').scrollIntoView({ behavior: 'smooth' }); | |
| } | |
| // Кастомный курсор | |
| const cursor = document.querySelector('.cursor'); | |
| const follower = document.querySelector('.cursor-follower'); | |
| document.addEventListener('mousemove', (e) => { | |
| cursor.style.left = `${e.clientX}px`; | |
| cursor.style.top = `${e.clientY}px`; | |
| follower.style.left = `${e.clientX - 15}px`; | |
| follower.style.top = `${e.clientY - 15}px`; | |
| }); | |
| // WebGL фон | |
| const scene = new THREE.Scene(); | |
| const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); | |
| const renderer = new THREE.WebGLRenderer({ alpha: true }); | |
| renderer.setSize(window.innerWidth, window.innerHeight); | |
| document.getElementById('webgl-bg').appendChild(renderer.domElement); | |
| const geometry = new THREE.SphereGeometry(5, 32, 32); | |
| const material = new THREE.MeshBasicMaterial({ | |
| color: 0xe74c3c, | |
| wireframe: true | |
| }); | |
| const sphere = new THREE.Mesh(geometry, material); | |
| scene.add(sphere); | |
| camera.position.z = 15; | |
| function animateWebGL() { | |
| requestAnimationFrame(animateWebGL); | |
| sphere.rotation.x += 0.01; | |
| sphere.rotation.y += 0.01; | |
| renderer.render(scene, camera); | |
| } | |
| animateWebGL(); | |
| // Параллакс-эффект | |
| document.addEventListener('mousemove', (e) => { | |
| const parallaxElements = document.querySelectorAll('[data-parallax]'); | |
| parallaxElements.forEach(el => { | |
| const speed = 0.05; | |
| const x = (window.innerWidth - e.pageX * speed) / 100; | |
| const y = (window.innerHeight - e.pageY * speed) / 100; | |
| el.style.transform = `translate(${x}px, ${y}px)`; | |
| }); | |
| }); | |
| // Голосовое управление | |
| const voiceBtn = document.getElementById('voice-btn'); | |
| if ('webkitSpeechRecognition' in window) { | |
| const recognition = new webkitSpeechRecognition(); | |
| recognition.lang = 'ru-RU'; | |
| recognition.onresult = (event) => { | |
| const transcript = event.results[0][0].transcript; | |
| if (transcript.toLowerCase().includes('заказать')) { | |
| scrollToContact(); | |
| alert('Голосовой заказ активирован! Заполните форму ниже.'); | |
| } | |
| }; | |
| voiceBtn.addEventListener('click', () => { | |
| recognition.start(); | |
| voiceBtn.textContent = 'Слушаю...'; | |
| setTimeout(() => voiceBtn.textContent = '🎙️ Голосовой заказ', 3000); | |
| }); | |
| } else { | |
| voiceBtn.style.display = 'none'; | |
| } | |
| // Анимация загрузки | |
| document.addEventListener('DOMContentLoaded', () => { | |
| const elements = [document.querySelector('.cta-button'), ...document.querySelectorAll('.service-card')]; | |
| elements.forEach(el => { | |
| el.style.opacity = '0'; | |
| el.style.transform = 'translateY(20px)'; | |
| setTimeout(() => { | |
| el.style.transition = 'all 0.8s ease'; | |
| el.style.opacity = '1'; | |
| el.style.transform = 'translateY(0)'; | |
| }, 300); | |
| }); | |
| }); | |
| // Отслеживание груза (демо) | |
| function trackCargo() { | |
| const trackNum = document.getElementById('track-input').value; | |
| if (trackNum) { | |
| alert(`Груз ${trackNum}: В пути (этап 2/4). Ожидаемое время прибытия: 28 февраля 2025.`); | |
| } else { | |
| alert('Введите номер груза!'); | |
| } | |
| } | |
| // Обработка формы | |
| document.getElementById('contact-form').addEventListener('submit', (e) => { | |
| e.preventDefault(); | |
| alert('Заявка успешно отправлена! Мы свяжемся с вами в течение 24 часов.'); | |
| }); | |
| // Vanilla Tilt для карточек | |
| VanillaTilt.init(document.querySelectorAll('.service-card'), { | |
| max: 20, | |
| speed: 300, | |
| glare: true, | |
| 'max-glare': 0.3 | |
| }); |