223 lines
8.1 KiB
JavaScript
223 lines
8.1 KiB
JavaScript
// -----------------------------------------HEADER-----------------------------------------------------------
|
||
const headers = document.querySelectorAll('.header_top_item');
|
||
if(headers.length > 0) {
|
||
headers[0].classList.add('active');
|
||
}
|
||
document.querySelectorAll('.header_top_item').forEach((item) => {
|
||
|
||
item.addEventListener('click', (e) => {
|
||
e.preventDefault(); // если не нужно переходить со страницы
|
||
document.querySelectorAll('.header_top_item').forEach(el => el.classList.remove('active'));
|
||
item.classList.add('active');
|
||
});
|
||
});
|
||
|
||
// -------------------------------ACCORDION-SLIDER-----------------------------------------------------------
|
||
|
||
const items = document.querySelectorAll('.accordion-item');
|
||
|
||
// Делаем первый аккордеон активным по умолчанию
|
||
if(items.length > 0) {
|
||
items[0].classList.add('active');
|
||
}
|
||
|
||
// items.forEach(item => {
|
||
// item.addEventListener('click', () => {
|
||
// items.forEach(i => i.classList.remove('active'));
|
||
// item.classList.add('active');
|
||
// });
|
||
// });
|
||
// код ниже если нужно картинку на открытую и закрытую колонку(ток классы добавь в html и картинки по 2 или че там придумаешь)
|
||
items.forEach(item => {
|
||
item.addEventListener('click', () => {
|
||
items.forEach(i => {
|
||
i.classList.remove('active');
|
||
i.querySelector('.img-open').style.display = 'none';
|
||
i.querySelector('.img-closed').style.display = 'block';
|
||
});
|
||
|
||
item.classList.add('active');
|
||
item.querySelector('.img-open').style.display = 'block';
|
||
item.querySelector('.img-closed').style.display = 'none';
|
||
});
|
||
});
|
||
|
||
// -----------------------------------------ACCORDION-SECOND----------------------------------------------
|
||
document.addEventListener('DOMContentLoaded', () => {
|
||
const cards = document.querySelectorAll('.advantage_slider_item');
|
||
|
||
cards.forEach(card => {
|
||
card.addEventListener('click', () => {
|
||
// если уже активна — просто закрываем
|
||
if (card.classList.contains('active')) {
|
||
card.classList.remove('active');
|
||
} else {
|
||
// иначе закрываем все остальные и открываем текущую
|
||
cards.forEach(c => c.classList.remove('active'));
|
||
card.classList.add('active');
|
||
}
|
||
});
|
||
});
|
||
});
|
||
|
||
document.addEventListener('DOMContentLoaded', () => {
|
||
const sliderContainer = document.querySelector('.advantage_slider');
|
||
const slider = document.querySelector('.advantage_slider_items');
|
||
const slides = document.querySelectorAll('.advantage_slider_item');
|
||
let currentIndex = 0;
|
||
let dotsContainer, dots;
|
||
|
||
function initSlider() {
|
||
// если ширина > 900 — отключаем слайдер
|
||
if (window.innerWidth > 900) {
|
||
slider.style.transform = '';
|
||
if (dotsContainer) dotsContainer.remove();
|
||
return;
|
||
}
|
||
|
||
// создаём точки только если их ещё нет
|
||
if (!dotsContainer) {
|
||
dotsContainer = document.createElement('div');
|
||
dotsContainer.classList.add('slider_dots');
|
||
slides.forEach((_, i) => {
|
||
const dot = document.createElement('div');
|
||
dot.classList.add('slider_dot');
|
||
if (i === 0) dot.classList.add('active');
|
||
dot.addEventListener('click', () => moveToSlide(i));
|
||
dotsContainer.appendChild(dot);
|
||
});
|
||
sliderContainer.appendChild(dotsContainer);
|
||
dots = dotsContainer.querySelectorAll('.slider_dot');
|
||
}
|
||
|
||
moveToSlide(0); // начальная позиция
|
||
}
|
||
|
||
function moveToSlide(index) {
|
||
if (window.innerWidth > 900) return; // не сдвигать если десктоп
|
||
if (index < 0) index = slides.length - 1;
|
||
if (index >= slides.length) index = 0;
|
||
currentIndex = index;
|
||
const slideWidth = slides[0].offsetWidth + 28; // с учётом gap
|
||
slider.style.transform = `translateX(-${index * slideWidth}px)`;
|
||
updateDots();
|
||
}
|
||
|
||
function updateDots() {
|
||
if (!dots) return;
|
||
dots.forEach((dot, i) => dot.classList.toggle('active', i === currentIndex));
|
||
}
|
||
|
||
// пересоздаём слайдер при изменении ширины
|
||
window.addEventListener('resize', initSlider);
|
||
|
||
initSlider(); // запустить при загрузке
|
||
});
|
||
|
||
// ----------------------------------------------------------ВЫПАДАЮЩЕЕ-МЕНЮ--------------------------------------------------------
|
||
|
||
document.querySelector('.header_nav_link-reverse').addEventListener('click', function() {
|
||
const dropdown = document.querySelector('.dropdown-list');
|
||
const text = this.querySelector('.link-text');
|
||
|
||
dropdown.classList.toggle('show');
|
||
|
||
// Меняем текст кнопки
|
||
if (dropdown.classList.contains('show')) {
|
||
text.textContent = 'Меньше услуг';
|
||
} else {
|
||
text.textContent = 'Больше услуг';
|
||
}
|
||
});
|
||
|
||
// -------------------------------------BURGER-MENU-TOP-----------------------------------------------------------------------------------
|
||
|
||
document.addEventListener('DOMContentLoaded', () => {
|
||
const burgerBtn = document.querySelector('.burger_menu_btn');
|
||
const navWrapper = document.querySelector('.header_top_wrapper-open');
|
||
const navMenu = navWrapper.querySelector('.header_nav_top');
|
||
|
||
burgerBtn.addEventListener('click', () => {
|
||
navMenu.classList.toggle('active');
|
||
burgerBtn.classList.toggle('active');
|
||
document.body.classList.toggle('lock'); // блокируем скролл при открытом меню
|
||
});
|
||
|
||
// при клике по ссылке меню закрываем бургер
|
||
navWrapper.querySelectorAll('.header_top_link').forEach(link => {
|
||
link.addEventListener('click', () => {
|
||
navMenu.classList.remove('active');
|
||
burgerBtn.classList.remove('active');
|
||
document.body.classList.remove('lock');
|
||
});
|
||
});
|
||
});
|
||
|
||
// -----------------------------------------BURGER-MENU-----------------------------------------------------------------
|
||
|
||
document.addEventListener("DOMContentLoaded", () => {
|
||
const toggleBtn = document.querySelector(".top_list_btn");
|
||
const menu = document.querySelector(".header_nav_burger");
|
||
|
||
toggleBtn.addEventListener("click", () => {
|
||
menu.classList.toggle("open");
|
||
});
|
||
});
|
||
|
||
// ---------------------------------------------SLIDER----------------------------------------------------
|
||
|
||
document.addEventListener('DOMContentLoaded', () => {
|
||
const servicesContainer = document.querySelector('.our-services_row');
|
||
const slider = document.querySelector('.our-services_row_items');
|
||
const slides = document.querySelectorAll('.our-services_row_item');
|
||
let currentIndex = 0;
|
||
let dotsContainer, dots;
|
||
let isActive = false;
|
||
|
||
function initServicesSlider() {
|
||
if (window.innerWidth > 900) {
|
||
slider.style.transform = '';
|
||
if (dotsContainer) {
|
||
dotsContainer.remove();
|
||
dotsContainer = null;
|
||
}
|
||
isActive = false;
|
||
return;
|
||
}
|
||
|
||
if (isActive) return;
|
||
isActive = true;
|
||
|
||
// создаём контейнер для точек
|
||
dotsContainer = document.createElement('div');
|
||
dotsContainer.classList.add('our-services_dots');
|
||
slides.forEach((_, i) => {
|
||
const dot = document.createElement('div');
|
||
dot.classList.add('our-services_dot');
|
||
if (i === 0) dot.classList.add('active');
|
||
dot.addEventListener('click', () => moveToSlide(i));
|
||
dotsContainer.appendChild(dot);
|
||
});
|
||
servicesContainer.appendChild(dotsContainer);
|
||
dots = dotsContainer.querySelectorAll('.our-services_dot');
|
||
|
||
moveToSlide(0);
|
||
}
|
||
|
||
function moveToSlide(index) {
|
||
if (window.innerWidth > 900) return;
|
||
if (index < 0) index = slides.length - 1;
|
||
if (index >= slides.length) index = 0;
|
||
currentIndex = index;
|
||
const offset = index * servicesContainer.offsetWidth;
|
||
slider.style.transform = `translateX(-${offset}px)`;
|
||
updateDots();
|
||
}
|
||
|
||
function updateDots() {
|
||
dots.forEach((dot, i) => dot.classList.toggle('active', i === currentIndex));
|
||
}
|
||
|
||
window.addEventListener('resize', initServicesSlider);
|
||
initServicesSlider();
|
||
}); |