<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>弹性过渡圆形幻灯片</title>
<style>
body {
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background: #f5f5f5;
font-family: Arial, sans-serif;
}
.slider-container {
position: relative;
width: 500px;
height: 500px;
overflow: hidden;
border-radius: 50%;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
}
.slider {
display: flex;
width: 100%;
height: 100%;
transition: transform 0.8s cubic-bezier(0.68, -0.55, 0.265, 1.55);
}
.slide {
min-width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
font-size: 24px;
color: white;
flex-shrink: 0;
}
.slide:nth-child(1) {
background: linear-gradient(135deg, #FF9A9E 0%, #FAD0C4 100%);
}
.slide:nth-child(2) {
background: linear-gradient(135deg, #A1C4FD 0%, #C2E9FB 100%);
}
.slide:nth-child(3) {
background: linear-gradient(135deg, #FFECD2 0%, #FCB69F 100%);
}
.slide:nth-child(4) {
background: linear-gradient(135deg, #84FAB0 0%, #8FD3F4 100%);
}
.controls {
position: absolute;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
display: flex;
gap: 10px;
}
.control-btn {
width: 12px;
height: 12px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.5);
border: none;
cursor: pointer;
transition: all 0.3s ease;
}
.control-btn.active {
background: white;
transform: scale(1.2);
}
.nav-btn {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 40px;
height: 40px;
background: rgba(255, 255, 255, 0.3);
border: none;
border-radius: 50%;
color: white;
font-size: 20px;
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
transition: all 0.3s ease;
}
.nav-btn:hover {
background: rgba(255, 255, 255, 0.5);
}
.prev {
left: 20px;
}
.next {
right: 20px;
}
</style>
</head>
<body>
<div class="slider-container">
<div class="slider">
<div class="slide">幻灯片 1</div>
<div class="slide">幻灯片 2</div>
<div class="slide">幻灯片 3</div>
<div class="slide">幻灯片 4</div>
</div>
<button class="nav-btn prev">❮</button>
<button class="nav-btn next">❯</button>
<div class="controls">
<button class="control-btn active"></button>
<button class="control-btn"></button>
<button class="control-btn"></button>
<button class="control-btn"></button>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const slider = document.querySelector('.slider');
const slides = document.querySelectorAll('.slide');
const controlBtns = document.querySelectorAll('.control-btn');
const prevBtn = document.querySelector('.prev');
const nextBtn = document.querySelector('.next');
let currentIndex = 0;
const slideCount = slides.length;
function updateSlider() {
slider.style.transform = `translateX(-${currentIndex * 100}%)`;
controlBtns.forEach((btn, index) => {
btn.classList.toggle('active', index === currentIndex);
});
}
function goToSlide(index) {
currentIndex = (index + slideCount) % slideCount;
updateSlider();
}
function nextSlide() {
goToSlide(currentIndex + 1);
}
function prevSlide() {
goToSlide(currentIndex - 1);
}
// 控制按钮点击事件
controlBtns.forEach((btn, index) => {
btn.addEventListener('click', () => {
goToSlide(index);
});
});
// 导航按钮点击事件
nextBtn.addEventListener('click', nextSlide);
prevBtn.addEventListener('click', prevSlide);
// 自动轮播
let autoSlideInterval = setInterval(nextSlide, 3000);
// 鼠标悬停时暂停自动轮播
const sliderContainer = document.querySelector('.slider-container');
sliderContainer.addEventListener('mouseenter', () => {
clearInterval(autoSlideInterval);
});
sliderContainer.addEventListener('mouseleave', () => {
autoSlideInterval = setInterval(nextSlide, 3000);
});
// 触摸事件支持
let touchStartX = 0;
let touchEndX = 0;
sliderContainer.addEventListener('touchstart', (e) => {
touchStartX = e.changedTouches[0].screenX;
}, {passive: true});
sliderContainer.addEventListener('touchend', (e) => {
touchEndX = e.changedTouches[0].screenX;
handleSwipe();
}, {passive: true});
function handleSwipe() {
if (touchEndX < touchStartX - 50) {
nextSlide();
}
if (touchEndX > touchStartX + 50) {
prevSlide();
}
}
});
</script>
</body>
</html>