figma_adp_mob_final

This commit is contained in:
2025-10-31 15:36:56 +03:00
parent 2bfae5248b
commit 05d5a40b7d
2 changed files with 72 additions and 56 deletions

109
main.js
View File

@@ -134,91 +134,92 @@ document.addEventListener('DOMContentLoaded', () => {
// -----------------------------------------ACCORDION-SECOND---------------------------------------------- // -----------------------------------------ACCORDION-SECOND----------------------------------------------
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
// карточки (открытие/закрытие)
const cards = document.querySelectorAll('.advantage_slider_item'); const cards = document.querySelectorAll('.advantage_slider_item');
cards.forEach(card => { cards.forEach(card => {
card.addEventListener('click', () => { card.addEventListener('click', () => {
if (card.classList.contains('active')) { if (card.classList.contains('active')) card.classList.remove('active');
card.classList.remove('active'); else {
} else {
cards.forEach(c => c.classList.remove('active')); cards.forEach(c => c.classList.remove('active'));
card.classList.add('active'); card.classList.add('active');
} }
}); });
}); });
});
document.addEventListener('DOMContentLoaded', () => { // слайдер
const sliderContainer = document.querySelector('.advantage_slider'); const sliderContainer = document.querySelector('.advantage_slider');
const slider = document.querySelector('.advantage_slider_items'); const slider = document.querySelector('.advantage_slider_items');
const slides = document.querySelectorAll('.advantage_slider_item'); const slides = document.querySelectorAll('.advantage_slider_item');
let currentIndex = 0; let currentIndex = 0;
let dotsContainer, dots; let dotsContainer = null;
let dots = null;
function initSlider() { const isMobile = () => window.matchMedia('(max-width: 900px)').matches;
if (window.innerWidth > 900) {
slider.style.transform = '';
if (dotsContainer) dotsContainer.remove();
return;
}
if (!dotsContainer) { function buildDots() {
dotsContainer = document.createElement('div'); if (dotsContainer) dotsContainer.remove();
dotsContainer.classList.add('slider_dots'); dotsContainer = document.createElement('div');
slides.forEach((_, i) => { dotsContainer.className = 'slider_dots';
const dot = document.createElement('div'); slides.forEach((_, i) => {
dot.classList.add('slider_dot'); const dot = document.createElement('div');
if (i === 0) dot.classList.add('active'); dot.className = 'slider_dot' + (i === currentIndex ? ' active' : '');
dot.addEventListener('click', () => moveToSlide(i)); dot.addEventListener('click', () => moveToSlide(i));
dotsContainer.appendChild(dot); dotsContainer.appendChild(dot);
}); });
sliderContainer.appendChild(dotsContainer); sliderContainer.appendChild(dotsContainer);
dots = dotsContainer.querySelectorAll('.slider_dot'); 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;
slider.style.transform = `translateX(-${index * slideWidth}px)`;
updateDots();
} }
function updateDots() { function updateDots() {
if (!dots) return; if (!dots) return;
dots.forEach((dot, i) => dot.classList.toggle('active', i === currentIndex)); dots.forEach((d, i) => d.classList.toggle('active', i === currentIndex));
} }
// === свайп === function moveToSlide(index) {
let touchStartX = 0; if (!isMobile()) return;
let touchEndX = 0; if (index < 0) index = slides.length - 1;
if (index >= slides.length) index = 0;
currentIndex = index;
// <<< ВАЖНО: едем к фактическому смещению карточки >>>
const offset = slides[index].offsetLeft;
slider.style.transform = `translateX(-${offset}px)`;
updateDots();
}
function initSlider() {
if (!slider || slides.length === 0) return;
if (!isMobile()) {
// десктоп: сброс
slider.style.transform = '';
if (dotsContainer) { dotsContainer.remove(); dotsContainer = null; dots = null; }
return;
}
if (!dotsContainer) buildDots();
// после ресайза дождаться перерасчёта верстки
requestAnimationFrame(() => moveToSlide(currentIndex));
}
// свайпы
let touchStartX = 0;
sliderContainer.addEventListener('touchstart', e => { sliderContainer.addEventListener('touchstart', e => {
touchStartX = e.changedTouches[0].screenX; touchStartX = e.changedTouches[0].screenX;
}); }, {passive:true});
sliderContainer.addEventListener('touchend', e => { sliderContainer.addEventListener('touchend', e => {
touchEndX = e.changedTouches[0].screenX; const diff = e.changedTouches[0].screenX - touchStartX;
handleSwipe(); if (Math.abs(diff) >= 50) {
moveToSlide(currentIndex + (diff < 0 ? 1 : -1));
}
}); });
function handleSwipe() {
const diff = touchEndX - touchStartX;
if (Math.abs(diff) < 50) return; // минимальная дистанция свайпа
if (diff > 0) moveToSlide(currentIndex - 1); // свайп вправо → предыдущий
else moveToSlide(currentIndex + 1); // свайп влево → следующий
}
window.addEventListener('resize', initSlider); window.addEventListener('resize', initSlider);
initSlider(); initSlider();
}); });
// ----------------------------------------------------------ВЫПАДАЮЩЕЕ-МЕНЮ-------------------------------------------------------- // ----------------------------------------------------------ВЫПАДАЮЩЕЕ-МЕНЮ--------------------------------------------------------
document.querySelector('.header_nav_link-reverse').addEventListener('click', function() { document.querySelector('.header_nav_link-reverse').addEventListener('click', function() {

View File

@@ -728,9 +728,11 @@ html, body, * {
.advantage_slider_items { .advantage_slider_items {
margin: 0; margin: 0;
display:flex; display:flex;
gap:28px;
width: 100%; width: 100%;
} }
.advantage_slider_item:not(:last-child) {
margin-right: 28px;
}
.advantage_slider_item { .advantage_slider_item {
position:relative; position:relative;
@@ -2177,6 +2179,19 @@ body.lock {
.row_middle_title { .row_middle_title {
font-size: 24px; font-size: 24px;
} }
.advantage_slider {
justify-content: flex-start;
overflow: hidden;
}
.advantage_slider_items {
justify-content: flex-start;
transition: transform .4s ease;
will-change: transform;
}
.advantage_slider_item {
flex: 0 0 100%;
max-width: 100%;
}
} }