为什么控制按钮在我的幻灯片中不起作用?

why the control button do not work in my slideshow?

我制作了宽度为 4 的不透明度为 1 和 z-index:2 的照片,我可以自动制作它 运行,但要控制它,还没有,这是我的 js 代码一些 jquery:

$(document).ready(function() {
var i = 0
function next() {
    move(i++);
    if (i === 4) {
        i = 0
    }
    console.log("first i = " + i)
};
setInterval(next, 2000);
function move(n) {
    var images = document.querySelectorAll('img')
    var img = images[n]
    $(img).addClass('showSlide')
    $(img).removeClass('hideSlide')
    $(img).siblings(".img").addClass('hideSlide')
}
$('.next').click(

    () => {
        if (i === 3) {
            i = 0
        };
        move(i++);
        console.log("next i = " + i)
    }
)
$('.previous').click(
    () => {
        if (i === 0) {
            i = 3
        };
        move(i--);
        console.log("previous i = " + i)
    }
)})

我的自动幻灯片工作,但是当我单击下一个或上一个按钮时,幻灯片不会从最后一个位置继续,我的 HTML 代码是:

 <div class="container">
        <button class="next">next</button>
        <button class="previous">previous</button>
        <img class="img" src="gallery-img7.jpg" alt="">
        <img class="img" src="gallery-img2.jpg" alt="">
        <img class="img" src="gallery-img8.jpg" alt="">
        <img class="img" src="gallery-img3.jpg" alt="">
    </div>

我认为您触发下一次和上一次点击的代码基本上可以正常工作,您使用的 Interval 函数 运行 永远不会被您的按钮点击打断,因此幻灯片会继续循环播放。

您要显示和隐藏的 类 可能也没有正确附加到 DOM。我发现在附加特定幻灯片之前附加不太具体的 类 是一个很好的做法,即一揽子隐藏所有幻灯片然后显示所选幻灯片。

我认为另一种有用的技术是首先尝试找出手动用户交互,然后将我的自动化建立在它的基础上。我已经对您发布的代码进行了更改,其中幻灯片 'slide' 通过触发下一个动作本身,类似于用户的方式。

因此幻灯片应该在页面加载时通过声明的 setInterval 自行开始。当用户将鼠标移动到幻灯片区域时,setInterval 被中断 - 这样按钮将控制 active/shown 幻灯片。如果您将鼠标移开或远离幻灯片容器,则允许 setInterval 再次启动,幻灯片应自动循环。

$(document).ready(function() {
        var i = 0;

        function move(n) {
            var images = document.querySelectorAll('img');
            var img = images[n];
            $(img).siblings(".img").addClass('hideSlide');
            $(img).siblings(".img").removeClass('showSlide');
            $(img).addClass('showSlide');
            $(img).removeClass('hideSlide');
        }

        var next = setInterval(autoRotate, 2000);

        function autoRotate() {
            $('.next').trigger('click');
        }

        $('.container').on('mouseenter', function() {
          clearInterval(next);
        });

        $('.container').on('mouseleave', function() {
          next = setInterval(autoRotate, 2000);
        });


        $('.next').click(() => {
           if (i === 3) {
             i = 0;
           } else {
            i++;
           }
           move(i);
        });

        $('.previous').click(() => {
            if (i === 0) {
              i = 3;
            } else {
                i--;
            }
            move(i);
        });
    })

我认为您处理增量和减量的方式可能是问题所在?这是模 % 的一个很好的用例。我还清除并重置了按钮单击后的间隔,以便在新显示的图像上获得相同的间隔。这是一个似乎符合您预期的示例:

$(document).ready(function() {
var i = 0
function next() {
    move(i++);
};

let nextInterval = setInterval(next, 2000);
function move(n) {
    clearInterval(nextInterval)
    nextInterval = setInterval(next, 2000);
    n = i%4;
    var images = document.querySelectorAll('img')
    var img = images[n]
    $(img).addClass('showSlide')
    $(img).removeClass('hideSlide')
    $(img).siblings(".img").addClass('hideSlide')
}
$('.next').click(

    () => {
        move(i++);
    }
)
$('.previous').click(
    () => {
        move(i--);
    }
)})
.img{
  display:block;
  width:100px;
  height:100px;
}
.showSlide{
  display:block;
}
.hideSlide{
  display:none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
 <div class="container">
        <button class="next">next</button>
        <button class="previous">previous</button>
        <img class="img" src="https://via.placeholder.com/100x100.png?text=1" alt="">
        <img class="img hideSlide"   src="https://via.placeholder.com/100x100.png?text=2" alt="">
        <img class="img hideSlide"  src="https://via.placeholder.com/100x100.png?text=3" alt="">
        <img class="img hideSlide" src="https://via.placeholder.com/100x100.png?text=4" alt="">
    </div>