Jquery 创建动画图像滑块-如何设置动画并限制多次单击?

Jquery 创建动画图像滑块-如何设置动画并限制多次单击?,jquery,html,css,Jquery,Html,Css,在过去的几天里,我一直在为一个产品页面制作一个图像滑块,我已经成功地制作了一个我觉得足够令人满意的滑块,但是我想添加到它的最后一步不是从一个图像到下一个图像的静态移动,你可以看到一个物理滑动动画,我遇到的唯一问题是,它允许多次单击,这意味着值被完全抛出,它只是中断。我想知道如何检查函数何时运行,以便在完成之前不能再次运行,或者我想也许我可以使用.finish(),这样用户就不会被迫在每次单击之前等待动画完成,这样,如果他们想快速滚动,它就会将上一个动画急推到最终值 这里是(当前)工作滑块的JSF

在过去的几天里,我一直在为一个产品页面制作一个图像滑块,我已经成功地制作了一个我觉得足够令人满意的滑块,但是我想添加到它的最后一步不是从一个图像到下一个图像的静态移动,你可以看到一个物理滑动动画,我遇到的唯一问题是,它允许多次单击,这意味着值被完全抛出,它只是中断。我想知道如何检查函数何时运行,以便在完成之前不能再次运行,或者我想也许我可以使用.finish(),这样用户就不会被迫在每次单击之前等待动画完成,这样,如果他们想快速滚动,它就会将上一个动画急推到最终值

这里是(当前)工作滑块的JSFIDLE链接

如果在第12行和第24行将.css()更改为.animate(),您将看到我在多次单击箭头时遇到的问题

HTML

<div id="imageSlider">
    <div id="imagesContainer">
        <div class="left imagePane" id="selectedImage">
            <div class="sliderImageAlign">
                <p style="height: 100px; width: 75px; line-height: 100px; text-align: center;">1</p>
            </div>
        </div>

        <div class="left imagePane">
            <div class="sliderImageAlign">
                <p style="height: 100px; width: 75px; line-height: 100px; text-align: center;">2</p>
            </div>
        </div>

        <div class="left imagePane">
            <div class="sliderImageAlign">
                <p style="height: 100px; width: 75px; line-height: 100px; text-align: center;">3</p>
            </div>
        </div>

        <div class="left imagePane">
            <div class="sliderImageAlign">
                <p style="height: 100px; width: 75px; line-height: 100px; text-align: center;">4</p>
            </div>
        </div>

        <div class="left imagePane">
            <div class="sliderImageAlign">
                <p style="height: 100px; width: 75px; line-height: 100px; text-align: center;">5</p>
            </div>
        </div>
    </div>

    <div id="imagesUp">
        <div id="imagesArrowUp"></div>
    </div>

    <div id="imagesDown">
        <div id="imagesArrowDown"></div>
    </div>
</div>

只需在使用jQuery
:animated
伪类单击时检查元素是否仍在移动,例如以这种方式

$("#imagesUp").on('click', function () {
     var ic = $("#imagesContainer");
     ...

     if (ic.is(':not(:animated)') && containerNewPos < imageHeight) {
        ic.animate({
                top: containerNewPos + 'px'
        }, 800);
     }
});
$(“#imagesUp”)。在('click',函数(){
var ic=$(“#图像容器”);
...
if(ic.is(':not(:animated)&&containerNewPos
只有在上一个动画已完成时,才能执行此操作

您还可以将该条件作为处理程序中的第一条语句进行检查,并根据您的便利性在该语句中移动所有必要的逻辑


作为旁注,我建议重构您的代码,缓存对移动元素的引用,并对imageUp和imageDown元素使用单个事件处理程序,因此您可以只查看单击的元素的
id
属性来计算新的顶级属性(以及运行动画的条件)。

谢谢!是的,我打算这样做,当其中任何一个被点击时,都有一个函数在运行,只需在函数中运行相应的代码,根据点击的id使其上升/下降。
* {
    color: RGB(0, 0, 0);
    font: 14px Arial;
    margin: 0;
    padding: 0;
    text-decoration: none;
}

.left {
    float: left;
}

.right {
    float: right;
}

#imageSlider {
    border: 1px solid RGB(0, 0, 0);
    box-shadow: 0px 0px 10px RGB(200, 200, 200);
    float: left;
    height: 450px;
    margin-right: 20px;
    overflow: hidden;
    position: relative;
    width: 87px;
}

#imagesContainer {
    position: absolute;
    top: 35px;
    width: 100%;
}

#imagesUp,
#imagesDown {
    background: RGB(20, 100, 150);
    box-sizing: border-box;
        -moz-box-sizing: border-box;
        -webkit-box-sizing: border-box;
    height: 35px;
    position: absolute;
    width: 100%;
}

#imagesUp {
    border-bottom: 1px solid RGB(0, 0, 0);
    top: 0;
}

#imagesDown {
    border-top: 1px solid RGB(0, 0, 0);
    bottom: 0;
}

#imagesArrowUp,
#imagesArrowDown {
    border-left: 20px solid transparent;
    border-right: 20px solid transparent;
    margin: 0 auto;
    margin-top: 10px;
    height: 0;
    width: 0;
}

#imagesArrowUp {
    border-bottom: 15px solid RGB(200, 230, 240);
}

#imagesArrowDown {
    border-top: 15px solid RGB(200, 230, 240);
}

#selectedImage {
    background: RGBA(20, 100, 150, 0.4);
}

.sliderImageAlign {
    border: 1px solid RGB(0, 0, 0);
    height: 100px;
    margin: 5px;
    width: 75px;
}
$("#imagesUp").on('click', function () {
     var ic = $("#imagesContainer");
     ...

     if (ic.is(':not(:animated)') && containerNewPos < imageHeight) {
        ic.animate({
                top: containerNewPos + 'px'
        }, 800);
     }
});