Spaces:
Running
Running
File size: 7,889 Bytes
8bcfaea 9d4d9df 8bcfaea 9d4d9df 8bcfaea 9d4d9df 64c6e4d 9d4d9df 64c6e4d 8bcfaea 9d4d9df 8bcfaea 1f90e55 b7a623b 1f90e55 b7a623b 1f90e55 b7a623b 1f90e55 b7a623b 1f90e55 b7a623b 1f90e55 b7a623b 432c5df b7a623b 1f90e55 b7a623b 1f90e55 b7a623b 432c5df 1f90e55 b7a623b 1f90e55 b7a623b 1f90e55 b7a623b 1f90e55 b7a623b 1f90e55 b7a623b 432c5df fbfcc14 432c5df fbfcc14 432c5df fbfcc14 432c5df fbfcc14 432c5df fbfcc14 432c5df b7a623b fbfcc14 d4acec1 386e465 d4acec1 fbfcc14 386e465 fbfcc14 386e465 fbfcc14 386e465 b7a623b d4acec1 386e465 432c5df fbfcc14 432c5df fbfcc14 432c5df 386e465 fbfcc14 432c5df 386e465 fbfcc14 432c5df fbfcc14 |
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
// Плавный скролл
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function(e) {
e.preventDefault();
const section = document.querySelector(this.getAttribute('href'));
section.scrollIntoView({ behavior: 'smooth' });
});
});
// Анимация при скролле
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
}, { threshold: 0.2 });
document.querySelectorAll('.service-card').forEach(element => {
observer.observe(element);
});
// Изменение шапки при скролле
window.addEventListener('scroll', () => {
const header = document.querySelector('.header');
if (window.scrollY > 50) {
header.classList.add('scrolled');
} else {
header.classList.remove('scrolled');
}
});
// Three.js 3D-анимация (плавающие сферы с контролем з-индекса)
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('three-canvas').appendChild(renderer.domElement);
// Свет
const ambientLight = new THREE.AmbientLight(0xffffff, 0.6);
scene.add(ambientLight);
const pointLight = new THREE.PointLight(0xff6200, 1.2, 100);
pointLight.position.set(15, 15, 15);
scene.add(pointLight);
// Создание сфер
const spheres = [];
const sphereGeometry = new THREE.SphereGeometry(0.5, 32, 32);
const sphereMaterial = new THREE.MeshPhongMaterial({ color: 0xff6200, emissive: 0xff6200, emissiveIntensity: 0.6, transparent: true, opacity: 0.8 });
for (let i = 0; i < 15; i++) {
const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
sphere.position.set(
(Math.random() - 0.5) * 15,
(Math.random() - 0.5) * 15 - 5,
(Math.random() - 0.5) * 15
);
sphere.userData = { velocity: new THREE.Vector3((Math.random() - 0.5) * 0.015, (Math.random() - 0.5) * 0.015, (Math.random() - 0.5) * 0.015) };
scene.add(sphere);
spheres.push(sphere);
}
camera.position.z = 12;
camera.position.y = 2;
// Анимация сфер с ограничением
function animate() {
requestAnimationFrame(animate);
spheres.forEach(sphere => {
sphere.position.add(sphere.userData.velocity);
if (Math.abs(sphere.position.x) > 10) sphere.userData.velocity.x *= -0.9;
if (sphere.position.y > 5 || sphere.position.y < -10) sphere.userData.velocity.y *= -0.9;
if (Math.abs(sphere.position.z) > 10) sphere.userData.velocity.z *= -0.9;
sphere.rotation.x += 0.02;
sphere.rotation.y += 0.02;
});
renderer.render(scene, camera);
}
animate();
// Адаптация канваса
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
// Корзина с Local Storage
let cart = JSON.parse(localStorage.getItem('cart')) || [];
function updateCart() {
// Сохраняем корзину в Local Storage
localStorage.setItem('cart', JSON.stringify(cart));
// Обновляем счетчик корзины
const cartCount = document.getElementById('cartCount');
if (cartCount) {
cartCount.textContent = cart.length;
}
// Обновляем содержимое модального окна
const cartItems = document.getElementById('cartItems');
if (cartItems) {
cartItems.innerHTML = '';
if (cart.length === 0) {
cartItems.innerHTML = '<li>Корзина пуста</li>';
} else {
cart.forEach(item => {
const li = document.createElement('li');
li.textContent = item;
cartItems.appendChild(li);
});
}
}
}
// Функция для привязки событий
function initializeCart() {
// Привязываем события к кнопкам "Добавить в корзину"
const addToCartButtons = document.querySelectorAll('.add-to-cart-btn');
addToCartButtons.forEach(button => {
button.addEventListener('click', (e) => {
e.preventDefault(); // Предотвращаем стандартное поведение
e.stopPropagation(); // Останавливаем всплытие события до карточки
console.log('Кнопка "Добавить в корзину" нажата'); // Отладка
const serviceCard = button.closest('.service-card');
const serviceName = serviceCard.getAttribute('data-service');
console.log('Услуга:', serviceName); // Отладка
if (serviceName && !cart.includes(serviceName)) {
cart.push(serviceName);
updateCart();
alert(`${serviceName} добавлено в корзину!`);
} else if (cart.includes(serviceName)) {
alert(`${serviceName} уже в корзине!`);
} else {
console.error('Не удалось определить услугу для добавления в корзину');
}
});
});
// Убедимся, что карточка не перехватывает клик
const serviceCards = document.querySelectorAll('.service-card');
serviceCards.forEach(card => {
card.addEventListener('click', (e) => {
console.log('Клик по карточке (должно игнорироваться)'); // Отладка
});
});
// Открытие/закрытие модального окна корзины
const cartIcon = document.getElementById('cartIcon');
const cartModal = document.getElementById('cartModal');
const closeModal = document.getElementById('closeModal');
if (cartIcon && cartModal && closeModal) {
cartIcon.addEventListener('click', () => {
cartModal.style.display = 'flex';
updateCart();
});
closeModal.addEventListener('click', () => {
cartModal.style.display = 'none';
});
}
// Очистка корзины
const clearCartBtn = document.getElementById('clearCartBtn');
if (clearCartBtn) {
clearCartBtn.addEventListener('click', () => {
cart = [];
updateCart();
alert('Корзина очищена!');
});
}
// Рассчитать стоимость
const calculateBtn = document.getElementById('calculateBtn');
if (calculateBtn) {
calculateBtn.addEventListener('click', () => {
if (cart.length > 0) {
const message = `Здравствуйте! Интересуют следующие услуги: ${cart.join(', ')}. Прошу рассчитать стоимость.`;
const whatsappUrl = `https://wa.me/996500398754?text=${encodeURIComponent(message)}`;
window.open(whatsappUrl, '_blank');
cartModal.style.display = 'none';
cart = []; // Очищаем корзину после отправки
updateCart();
} else {
alert('Пожалуйста, выберите хотя бы одну услугу!');
}
});
}
}
// Инициализация корзины после загрузки DOM
document.addEventListener('DOMContentLoaded', () => {
initializeCart();
updateCart();
}); |