下面给你一个纯 CSS + 少量 JS 实现的动态幻灯版(轮播图)效果,包含自动播放、指示器、左右切换按钮,代码简洁可直接复用。
html
预览
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.slider-container {
position: relative;
width: 100%;
max-width: 800px;
height: 400px;
margin: 20px auto;
overflow: hidden;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}
.slider-wrapper {
display: flex;
height: 100%;
transition: transform 0.6s ease-in-out;
}
.slider-item {
min-width: 100%;
height: 100%;
}
.slider-item img {
width: 100%;
height: 100%;
object-fit: cover;
}
/* 左右切换按钮 */
.slider-btn {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 40px;
height: 40px;
background: rgba(0,0,0,0.4);
color: white;
border: none;
border-radius: 50%;
cursor: pointer;
font-size: 20px;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.3s;
}
.slider-btn:hover {
background: rgba(0,0,0,0.7);
}
.slider-btn.prev {
left: 15px;
}
.slider-btn.next {
right: 15px;
}
/* 指示器 */
.slider-indicators {
position: absolute;
bottom: 15px;
left: 50%;
transform: translateX(-50%);
display: flex;
gap: 8px;
}
.indicator {
width: 10px;
height: 10px;
border-radius: 50%;
background: rgba(255,255,255,0.5);
cursor: pointer;
transition: all 0.3s;
}
.indicator.active {
background: white;
width: 24px;
border-radius: 5px;
}
</style>
</head>
<body>
<div class="slider-container">
<div class="slider-wrapper">
<div class="slider-item"></div>
<div class="slider-item">/div>
</div>
<button class="slider-btn prev"><</button>
<button class="slider-btn next">></button>
<div class="slider-indicators">
<span class="indicator active" data-index="0"></span>
<span class="indicator" data-index="1"></span>
<span class="indicator" data-index="2"></span>
<span class="indicator" data-index="3"></span>
</div>
</div>
<script>
const wrapper = document.querySelector('.slider-wrapper');
const items = document.querySelectorAll('.slider-item');
const indicators = document.querySelectorAll('.indicator');
const prevBtn = document.querySelector('.prev');
const nextBtn = document.querySelector('.next');
let currentIndex = 0;
const total = items.length;
let interval;
// 更新显示
function updateSlider() {
wrapper.style.transform = `translateX(-${currentIndex * 100}%)`;
indicators.forEach((ind, i) => {
ind.classList.toggle('active', i === currentIndex);
});
}
// 下一张
function nextSlide() {
currentIndex = (currentIndex + 1) % total;
updateSlider();
}
// 上一张
function prevSlide() {
currentIndex = (currentIndex - 1 + total) % total;
updateSlider();
}
// 点击指示器
indicators.forEach(ind => {
ind.addEventListener('click', () => {
currentIndex = parseInt(ind.dataset.index);
updateSlider();
});
});
// 自动播放
function startAutoPlay() {
interval = setInterval(nextSlide, 3000);
}
function stopAutoPlay() {
clearInterval(interval);
}
// 绑定事件
nextBtn.addEventListener('click', nextSlide);
prevBtn.addEventListener('click', prevSlide);
document.querySelector('.slider-container').addEventListener('mouseenter', stopAutoPlay);
document.querySelector('.slider-container').addEventListener('mouseleave', startAutoPlay);
// 初始化
startAutoPlay();
</script>
</body>
</html>.slider-container:外层容器,控制宽高和溢出隐藏.slider-wrapper:包裹所有幻灯片,通过 transform: translateX() 实现滑动.slider-item:单个幻灯片,宽度为容器 100%transition: transform 0.6s ease-in-out:实现平滑滑动过渡.active 状态:宽度变化 + 颜色变化,突出当前页setInterval 定时切换transition 时长或缓动函数(如 ease-out)setInterval 的毫秒数(当前 3000ms=3 秒)原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。