You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现图片轮播器的悬停暂停功能技术求助

问题解决:图片轮播器悬停暂停/继续计时功能

你的轮播器当前悬停后重启计时器是因为直接调用了playSlide,而playSlide里会重置为完整的sliderSpeed计时。要实现暂停后继续剩余时间的效果,需要记录计时器的流逝时间,计算剩余时长,离开时用剩余时长重启计时器。

修改思路

  • 新增变量记录计时器启动的时间点,以及悬停时的剩余时间
  • 鼠标悬停时:清除当前计时器,计算已经过去的时间,得出剩余时间
  • 鼠标离开时:用剩余时间启动计时器,而不是重置为完整时长
  • 每次切换幻灯片后,重新记录计时器的起始时间

修改后的完整JS代码

var timeout;
var timerStartTime; // 记录计时器启动时间
var remainingTime = sliderSpeed; // 剩余计时时长,初始为完整速度

function setDirection(d) {
  document.querySelector('.slider').style.setProperty('--direction', d);
}
setDirection(1);
var slider = document.getElementsByClassName("slider")[0];
var sliderDots = Array.prototype.slice.call(document.getElementsByClassName("dots")[0].children);
var sliderContents = Array.prototype.slice.call(document.getElementsByClassName("elements")[0].children);
var sliderArrowLeft = document.getElementsByClassName("arrow-left")[0];
var sliderArrowRight = document.getElementsByClassName("arrow-right")[0];
var sliderSpeed = 3000,
  currentSlide = 0,
  currentActive = 0,
  sliderTimer = 0;

let elements = document.querySelector('.elements');
elements.addEventListener('mouseover', function() {
  clearTimeout(sliderTimer);
  // 计算已流逝的时间,得出剩余时间
  const elapsed = Date.now() - timerStartTime;
  remainingTime = sliderSpeed - elapsed;
  // 防止剩余时间为负数
  if (remainingTime < 0) remainingTime = 0;
});

elements.addEventListener('mouseout', function() {
  // 用剩余时间启动计时器
  sliderTimer = setTimeout(function() {
    playSlide(currentSlide += 1);
  }, remainingTime);
  // 重新记录计时器启动时间
  timerStartTime = Date.now();
});

function playSlide(slide, d) {
  if (!(d === undefined)) {
    direction = d;
    setDirection(d);

    // Force it forwards after it's done:
    clearTimeout(timeout);
    timeout = setTimeout(function() {
      setDirection(1);
    }, 1000)
  }
  for (var k = 0; k < sliderDots.length; k++) {
    sliderContents[k].classList.remove("active");
    sliderContents[k].classList.remove("inactive");
    sliderDots[k].classList.remove("active");
  }
  if (slide < 0) {
    slide = currentSlide = sliderContents.length - 1;
  }
  if (slide > sliderContents.length - 1) {
    slide = currentSlide = 0;
  }
  if (currentActive != currentSlide) {
    sliderContents[currentActive].classList.add("inactive");
  }
  sliderContents[slide].classList.add("active");
  sliderDots[slide].classList.add("active");
  currentActive = currentSlide;
  clearTimeout(sliderTimer);
  // 每次切换后重置剩余时间为完整时长,并记录启动时间
  remainingTime = sliderSpeed;
  sliderTimer = setTimeout(function() {
    playSlide(currentSlide += 1);
  }, sliderSpeed)
  timerStartTime = Date.now();
}
sliderArrowLeft.addEventListener("click", function() {
  playSlide(currentSlide -= 1, -1);
})
sliderArrowRight.addEventListener("click", function() {
  playSlide(currentSlide += 1, 1);
})
for (var l = 0; l < sliderDots.length; l++) {
  sliderDots[l].addEventListener("click", function() {
    let d = sliderDots.indexOf(this) - currentSlide
    playSlide(currentSlide = sliderDots.indexOf(this), Math.sign(d));
  })
}
playSlide(currentSlide);

关键修改点说明

  • 变量新增:timerStartTime记录每次计时器启动的时间戳,remainingTime存储悬停时剩余的计时时长
  • 鼠标悬停逻辑:清除计时器后,通过当前时间减去启动时间,计算已经过去的时间,进而得到剩余时间
  • 鼠标离开逻辑:使用剩余时间启动计时器,而不是调用playSlide重置计时
  • 幻灯片切换时:每次切换后,重置remainingTime为完整的sliderSpeed,并重新记录计时器启动时间

HTML和CSS代码无需修改,直接沿用你提供的即可。

内容的提问来源于stack exchange,提问作者tez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:02:31