我有一个代码,通过鼠标滚动更改图像,我需要添加一个自动更改图像,如果用户没有在7秒内滚动

<script>
const imageContainer = document.querySelector('.image-container');
const images = document.querySelectorAll('.image');
let currentIndexScroll = 0;
let isScrolling = false;
let hasScrolled = false;

function getRandomIndex(max) {
    return Math.floor(Math.random() * max);
}

document.addEventListener('wheel', (e) => {
    if (isScrolling) return;

    const delta = e.deltaY;
    const sensitivity = 40;

    if (delta > sensitivity && !hasScrolled) {
        currentIndexScroll = getRandomIndex(images.length);
        hasScrolled = true;
    } else if (delta < -sensitivity && !hasScrolled) {
        currentIndexScroll = getRandomIndex(images.length);
        hasScrolled = true;
    }

    images.forEach((image, index) => {
        if (index === currentIndexScroll) {
            image.style.opacity = 1;
        } else {
            image.style.opacity = 0;
        }
    });

    if (hasScrolled) {
        isScrolling = true;
        setTimeout(() => {
            isScrolling = false;
            hasScrolled = false;
        }, 600);
    }
});
</script>

我try 添加计时器,但图像不变

推荐答案

下面是一个可重用的示例,它使用setInverval在init上设置您的图像autoplay,如果鼠标没有悬停在父图像上.在mod函数中使用模运算符%循环图像.使用像anim()这样的简单函数来为c current index图像指定active类.在"车轮"事件上使用next()prev()函数递增或递减ccurrent indexanim()以动画形式显示current图像.作为额外的好处,On Click调用next()函数:

// DOM utility functions:
const els = (sel, par) => (par || document).querySelectorAll(sel);

// Utility functions:
const mod = (n, m) => ((n % m) + m) % m; // Fix negative Modulo


// Images wheeler component:
const imagesWheeler = (elParent) => {

  const elsImages = els(".image", elParent);
  const tot = elsImages.length;
  let itv = null;
  let c = 0; // current index

  const anim = () => {
    elsImages.forEach((elImage, i) => {
      elImage.classList.toggle("is-active", i === c);
    });
  };

  const next = () => {
    c = mod(++c, tot);
    anim();
  };

  const prev = () => {
    c = mod(--c, tot);
    anim();
  };

  const play = () => {
    itv = setInterval(next, 3000);
  };
  
  const stop = () => {
    clearInterval(itv);
  };

  const handleWheel = (evt) => {
    evt.preventDefault();
    c += Math.sign(evt.deltaY); // get 1, -1
    c = mod(c, tot);
    anim();
  };

  // Events:
  elParent.addEventListener("pointerenter", stop);
  elParent.addEventListener("pointerleave", play);
  elParent.addEventListener("pointerdown", next);
  addEventListener("wheel", handleWheel);

  // Init:
  anim(); // animate to first image
  play(); // start autoplay!

};

els(".images-container").forEach(imagesWheeler);
.images-container {
  position: relative;
  width: 10rem;
  aspect-ratio: 1;
  
  &>* {
    position: absolute;
    width: inherit;
    aspect-ratio: inherit;
    object-fit: cover;
    cursor: pointer;
    transition: opacity 0.4s;
    opacity: 0;
    pointer-events: none;
    
    &.is-active {
      opacity: 1;
      pointer-events: auto;
    }
  }
}
Use click to advance, wheel to prev/next, mouseleave to autoplay!

<div class="images-container">
  <img class="image" src="//picsum.photos/seed/01/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/02/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/03/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/04/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/05/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/06/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/07/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/08/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/09/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/10/200/200" alt="">
</div>

<p>Hey, you can have multiple!</p>

<div class="images-container">
  <img class="image" src="//picsum.photos/seed/21/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/22/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/23/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/24/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/25/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/26/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/27/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/28/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/29/200/200" alt="">
  <img class="image" src="//picsum.photos/seed/30/200/200" alt="">
</div>

Javascript相关问答推荐

React中的表格中 Select Radio按钮

react 路由加载程序行为

如何最好地从TypScript中的enum获取值

通过使用100%间隔时间来代表我们还剩多少时间来倒计时

GrapeJS -如何保存和加载自定义页面

类型脚本中只有字符串或数字键而不是符号键的对象

Chart.js V4切换图表中的每个条,同时每个条下有不同的标签.怎么做?

如何解决CORS政策的问题

togglePopover()不打开但不关闭原生HTML popover'

Rehype将hashtag呈现为URL

从Node JS将对象数组中的数据插入Postgres表

setcallback是什么时候放到macrotask队列上的?

获取Uint8ClampedArray中像素数组的宽度/高度

在运行时使用Next JS App Router在服务器组件中运行自定义函数

使用Ace编辑器对子组件实例的native-element 进行Angular 获取时面临的问题

Phaserjs-创建带有层纹理的精灵层以自定义外观

为什么在函数中添加粒子的速率大于删除粒子的速率?

使用Reaction窗体挂钩注册日历组件

Reaction即使在重新呈现后也会在方法内部保留局部值

AG-GRIDreact 显示布尔值而不是复选框