用setInterval+querySelectorAll实现轮播图需20行内完成:获取图片元素,用currentIndex记录索引,定时切换active类;须用position: absolute叠层避免重排,监听visibilitychange防后台暂停,支持data-index导航点点击跳转。
setInterval + querySelectorAll 控制图片切换轮播图本质就是定时切换一组 的显隐状态,不需要框架也能 20 行内搞定。核心是拿到所有图片元素,用一个索引 currentIndex 记录当前显示哪张,再用 setInterval 触发切换逻辑。
注意:别直接用 display: none 切换,会导致图片反复重排重绘;推荐用 opacity + visibility 组合,或更稳妥的 z-index 叠层控制。
setInterval
currentIndex = (currentIndex + 1) % images.length
@@##@@ @@##@@ @@##@@
.active 类必须用 position: absolute 叠在一起如果只是靠 display 或 visibility 切换,默认文档流会让图片上下堆叠,轮播就变成“一张张往下掉”。必须让所有 .slide 脱离文档流,共享同一位置。
#carousel 需设 position: relative 作为定位上下文.slide 设 position: absolute; top: 0; left: 0; width: 100%; height: 100%
.active 可额外加 z-index: 2,其他默认 z-index: 1,避免闪屏
document.hidden 状态
现代浏览器(Chrome、Edge)在标签页非激活时会暂停 setInterval,导致切到别的标签再回来,轮播卡住或跳多张。得监听页面可见性变化,手动恢复计时。
document.addEventListener('visibilitychange', ...) 捕获切换document.hidden === true 时 clearInterval(timer)
document.hidden === false 时重新 setInterval(或记录最后切换时间,补帧)data-index 绑事件就行导航点不是必须用 JS 动态生成,静态写死更稳。每个点加 data-index="0",点击时读取并跳转:
轮播最难的不是切换逻辑,而是各种边界情况:用户快速连点、切到后台又切回、图片加载失败占位、缩放后尺寸错乱……这些都得单独兜底,不能只靠“切换”本身。