You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

117 lines
3.9 KiB

document.addEventListener('DOMContentLoaded', function() {
const heroBlocks = document.querySelectorAll('.hero-block');
heroBlocks.forEach(function(block) {
const swiperContainer = block.querySelector('.swiper');
if (!swiperContainer) return;
let progressAnimation = null;
const autoplayDelay = 4000;
const swiper = new Swiper(swiperContainer, {
slidesPerView: 1,
grabCursor: true,
loop: true,
effect: 'fade',
fadeEffect: {
crossFade: true
},
autoplay: {
delay: autoplayDelay,
disableOnInteraction: false
},
on: {
slideChange: function () {
updatePagination(block, this.realIndex);
startProgressAnimation(block, this.realIndex);
},
autoplayStart: function() {
startProgressAnimation(block, this.realIndex);
},
autoplayStop: function() {
stopProgressAnimation();
}
}
});
function updatePagination(block, activeIndex) {
const paginationItems = block.querySelectorAll('.pagination-item');
paginationItems.forEach((item, index) => {
const isActive = index === activeIndex;
item.setAttribute('data-active', isActive ? 'true' : 'false');
const line = item.querySelector('.pagination-line');
if (line && !isActive) {
line.style.background = '';
line.style.backgroundImage = '';
}
});
}
function startProgressAnimation(block, activeIndex) {
stopProgressAnimation();
const paginationItems = block.querySelectorAll('.pagination-item');
const activeItem = paginationItems[activeIndex];
if (!activeItem) return;
const line = activeItem.querySelector('.pagination-line');
if (!line) return;
line.style.backgroundImage = 'linear-gradient(to right, rgba(255, 255, 255, 0.8) 0%, transparent 0%)';
let progress = 0;
const startTime = Date.now();
function animate() {
const elapsed = Date.now() - startTime;
progress = Math.min(elapsed / autoplayDelay, 1);
const percentage = progress * 100;
line.style.backgroundImage = `linear-gradient(to right, rgba(255, 255, 255, 0.8) ${percentage}%, transparent ${percentage}%)`;
if (progress < 1) {
progressAnimation = requestAnimationFrame(animate);
}
}
progressAnimation = requestAnimationFrame(animate);
}
function stopProgressAnimation() {
if (progressAnimation) {
cancelAnimationFrame(progressAnimation);
progressAnimation = null;
}
}
const prevBtn = block.querySelector('.custom-prev');
const nextBtn = block.querySelector('.custom-next');
if (prevBtn) {
prevBtn.addEventListener('click', () => {
swiper.slidePrev();
stopProgressAnimation();
});
}
if (nextBtn) {
nextBtn.addEventListener('click', () => {
swiper.slideNext();
stopProgressAnimation();
});
}
block.querySelectorAll('.pagination-item').forEach((item, index) => {
item.addEventListener('click', () => {
swiper.slideToLoop(index);
stopProgressAnimation();
});
});
updatePagination(block, 0);
startProgressAnimation(block, 0);
});
});