figma_adp_mob_final
This commit is contained in:
109
main.js
109
main.js
@@ -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() {
|
||||||
|
|||||||
19
style.css
19
style.css
@@ -727,10 +727,12 @@ 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%;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user