162 lines
4.5 KiB
JavaScript
162 lines
4.5 KiB
JavaScript
|
document.addEventListener('DOMContentLoaded', function() {
|
|||
|
const track = document.querySelector('.carousel-track');
|
|||
|
const dotsContainer = document.querySelector('.carousel-dots');
|
|||
|
|
|||
|
// 轮播图数据
|
|||
|
const carouselData = [
|
|||
|
{
|
|||
|
title: "企业官网 / 品牌官网",
|
|||
|
image: "../imgs/website/roll1.jpg"
|
|||
|
},
|
|||
|
{
|
|||
|
title: "电商商城(B2B/B2C)",
|
|||
|
image: "../imgs/website/roll2.jpg"
|
|||
|
},
|
|||
|
{
|
|||
|
title: "教育、政务、医疗等垂直行业平台",
|
|||
|
image: "../imgs/website/roll3.jpg"
|
|||
|
},
|
|||
|
{
|
|||
|
title: "SaaS 管理后台/数据可视化平台",
|
|||
|
image: "../imgs/website/roll4.jpg"
|
|||
|
}
|
|||
|
];
|
|||
|
|
|||
|
// 创建轮播项目
|
|||
|
function createCarouselItems() {
|
|||
|
// 克隆最后两个项目到开头
|
|||
|
for (let i = carouselData.length - 2; i < carouselData.length; i++) {
|
|||
|
const item = createItem(carouselData[i]);
|
|||
|
track.appendChild(item.cloneNode(true));
|
|||
|
}
|
|||
|
|
|||
|
// 添加原始项目
|
|||
|
carouselData.forEach(data => {
|
|||
|
track.appendChild(createItem(data));
|
|||
|
});
|
|||
|
|
|||
|
// 克隆前两个项目到末尾
|
|||
|
for (let i = 0; i < 2; i++) {
|
|||
|
const item = createItem(carouselData[i]);
|
|||
|
track.appendChild(item.cloneNode(true));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function createItem(data) {
|
|||
|
const item = document.createElement('div');
|
|||
|
item.className = 'carousel-item';
|
|||
|
item.innerHTML = `
|
|||
|
<img src="${data.image}" alt="${data.title}">
|
|||
|
<div class="carousel-caption">${data.title}</div>
|
|||
|
`;
|
|||
|
return item;
|
|||
|
}
|
|||
|
|
|||
|
// 初始化圆点
|
|||
|
function initDots() {
|
|||
|
dotsContainer.innerHTML = '';
|
|||
|
carouselData.forEach((_, index) => {
|
|||
|
const dot = document.createElement('div');
|
|||
|
dot.className = 'dot' + (index === 0 ? ' active' : '');
|
|||
|
dot.addEventListener('click', () => goToSlide(index));
|
|||
|
dotsContainer.appendChild(dot);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
createCarouselItems();
|
|||
|
initDots();
|
|||
|
|
|||
|
const items = document.querySelectorAll('.carousel-item');
|
|||
|
const dots = document.querySelectorAll('.dot');
|
|||
|
const itemCount = carouselData.length;
|
|||
|
let currentIndex = 2; // 从第一个真实项目开始
|
|||
|
let isAnimating = false;
|
|||
|
let autoScrollInterval;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
function updateCarousel() {
|
|||
|
const itemWidth = items[0].offsetWidth + 40; // 包括margin
|
|||
|
|
|||
|
// 更新位置
|
|||
|
track.style.transform = `translateX(${-(currentIndex * itemWidth)}px)`;
|
|||
|
|
|||
|
// 更新项目状态
|
|||
|
items.forEach((item, index) => {
|
|||
|
item.classList.remove('left-side', 'center', 'right-side');
|
|||
|
|
|||
|
const relativePos = index - currentIndex;
|
|||
|
if (relativePos === -1) {
|
|||
|
item.classList.add('left-side');
|
|||
|
} else if (relativePos === 0) {
|
|||
|
item.classList.add('center');
|
|||
|
} else if (relativePos === 1) {
|
|||
|
item.classList.add('right-side');
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
// 更新圆点
|
|||
|
const realIndex = (currentIndex - 2 + itemCount) % itemCount;
|
|||
|
dots.forEach((dot, index) => {
|
|||
|
dot.classList.toggle('active', index === realIndex);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
function goToSlide(index) {
|
|||
|
if (isAnimating) return;
|
|||
|
isAnimating = true;
|
|||
|
|
|||
|
currentIndex = index + 2; // 调整索引以匹配克隆项目
|
|||
|
|
|||
|
track.style.transition = 'transform 0.8s cubic-bezier(0.16, 0.77, 0.58, 0.97)';
|
|||
|
updateCarousel();
|
|||
|
|
|||
|
setTimeout(() => {
|
|||
|
isAnimating = false;
|
|||
|
}, 800);
|
|||
|
|
|||
|
resetAutoScroll();
|
|||
|
}
|
|||
|
|
|||
|
function nextSlide() {
|
|||
|
if (isAnimating) return;
|
|||
|
isAnimating = true;
|
|||
|
|
|||
|
currentIndex++;
|
|||
|
track.style.transition = 'transform 0.8s cubic-bezier(0.16, 0.77, 0.58, 0.97)';
|
|||
|
updateCarousel();
|
|||
|
|
|||
|
// 检查是否到达末尾克隆项目
|
|||
|
if (currentIndex > itemCount + 1) {
|
|||
|
setTimeout(() => {
|
|||
|
track.style.transition = 'none';
|
|||
|
currentIndex = 2;
|
|||
|
updateCarousel();
|
|||
|
isAnimating = false;
|
|||
|
}, 800);
|
|||
|
} else {
|
|||
|
setTimeout(() => {
|
|||
|
isAnimating = false;
|
|||
|
}, 800);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function startAutoScroll() {
|
|||
|
autoScrollInterval = setInterval(nextSlide, 3000);
|
|||
|
}
|
|||
|
|
|||
|
function resetAutoScroll() {
|
|||
|
clearInterval(autoScrollInterval);
|
|||
|
startAutoScroll();
|
|||
|
}
|
|||
|
|
|||
|
// 初始化
|
|||
|
updateCarousel();
|
|||
|
startAutoScroll();
|
|||
|
|
|||
|
// 窗口大小变化时重新计算
|
|||
|
window.addEventListener('resize', () => {
|
|||
|
track.style.transition = 'none';
|
|||
|
updateCarousel();
|
|||
|
});
|
|||
|
});
|