2

我需要更改图像 滑块幻灯片图像

每张幻灯片包含两个图像,它们将在 3 秒后更改。

因此,幻灯片附带第一张图片,3 秒后它将第一张图片更改为第二张图片,再过 3 秒(总共 6 秒)当前幻灯片消失,下一张幻灯片出现。

我的想法是使用setTimeOut函数并每 3 秒调用另一个图像。所以在 3 秒后fadeOut()第一张图像和fadeIn()第二张图像。

我使用cycle2及其cycle-aftercycle-before事件尝试了这个:

$('.slide .center img:nth-child(2)').hide(); // hide all slides second images

$('#slides').cycle({
    fx: 'scrollHorz',
    slides: '>.slide',
    timeout: 6000,
    prev: '#prev',
    next: '#next'
});

$('#slides').on('cycle-before', function(event, optionHash){
    setTimeout(function(){
         $('.slide:eq('+optionHash.currSlide+') > .center > img:first-child').fadeOut(1000);
         console.log($('.slide:eq('+(optionHash.currSlide)+')').attr('slideNum'));
    },1000)

    setTimeout(function(){
        $('.slide:eq('+optionHash.currSlide+') > .center > img:nth-child(2)').fadeIn();
        console.log($('.slide:eq('+(optionHash.currSlide)+')').attr('slideNum'));
    },2000)
});

$('#slides').on('cycle-after', function(event, optionHash, outgoingSlideEl, incomingSlideEl, forwardFlag) {
    $('.center img:first-child',outgoingSlideEl).show();
    $('.center img:nth-child(2)',outgoingSlideEl).hide();
});

JSFiddle

但这并不像我预期的那样工作。它不会改变图像,它会在按钮next上中断。prev如果您看到控制台,您会看到它不会触发.current slide

任何帮助表示赞赏。

4

2 回答 2

3

如果您检查 JavaScript 生成的 HTML 代码,您会注意到 Cycle2 复制了第一张幻灯片并使其不可见。其原因超出了我的范围,但至少我们可以轻松解决它。

其次,您应该在cycle-after. 如果在 中完成此操作cycle-beforesetTimeout则在幻灯片仍在转换到下一张幻灯片时开始计数。另一个问题是 in cycle-after,optionHash.currSlide设置为上一张幻灯片...

为了解决所有这些问题,我们必须计算当前可见幻灯片的索引,如下所示:

var visibleSlide = ((optionHash.currSlide + 1) % optionHash.slideCount) + 1;

关于损坏的前/后按钮,实际上应该足以完全停止淡入/淡出动画并在单击其中一个按钮时将其重置。但是,当单击 prev 按钮时,必须调整索引计算(-1而不是+1,请参见下面的代码)。

此外,我们必须在幻灯片初始化后立即为第一张幻灯片“手动”触发淡入/淡出动画。为此,我们可以将cycle-initialized事件与来自的逻辑结合使用cycle-after

我猜代码说了一千多个单词,所以这是我的建议:

$(".slide img:nth-child(2)").hide();

// Workaround for first slide right after initialization
// Handler has to be set before initialization, otherwise it might never be called!
$("#slides").on("cycle-initialized", function(event, optionHash){
    // Pretend the slideshow just transitioned from the last slide to the first
    onCycleAfter(optionHash.slideCount-1, optionHash.slideCount);
});

$("#slides").cycle({
    fx: "scrollHorz",
    slides: ".slide",
    timeout: 6000,
    prev: "#prev",
    next: "#next"
});

var timeout, prevClicked = false;
$("#slides").on("cycle-after", function(event, optionHash){
    onCycleAfter(optionHash.currSlide, optionHash.slideCount);
});

$("#slides").on("cycle-prev", function(){
    prevClicked = true;
});

function onCycleAfter(currSlide, slideCount) {
    // Reset slides
    $(".slide img:first-child").show();
    $(".slide img:nth-child(2)").hide();

    // Reset animation
    clearTimeout(timeout);
    $(".slide img").finish();

    // Calculate current slide (with workaround for prev button)
    var visibleSlide;
    if (prevClicked) {
        visibleSlide = ((currSlide - 1 + slideCount) % slideCount) + 1;
        prevClicked = false;
    }
    else {
        visibleSlide = ((currSlide + 1) % slideCount) + 1;
    }

    // Trigger new animation
    timeout = setTimeout(function(){
        var slideImages = $(".slide").eq(visibleSlide).find("img");
        slideImages.eq(0).fadeOut(1000, function(){
            slideImages.eq(1).fadeIn(1000);
        });
    }, 1000);
}

演示(JSFiddle)

于 2013-10-27T14:58:57.047 回答
0

编辑:

似乎 currSlide 没问题,但由于 setTimeOut引起的竞争条件,不知何故名称错误。看到这个叉子:http: //jsfiddle.net/pMX7D/3/

我得到的输出:

1=> fadeIN /_display/ (line 63)
second /_display/ (line 56)
2=> fadeOut /_display/ (line 57)
second /_display/ (line 62)
2=> fadeIN 

// 3 never gets focus

原来的

这是工作。随机单击上一个和下一个按钮后从我的控制台输出:

// first or second = slide data I beileve
[cycle2] --c2 init--
jquery....min.js (line 7) 
first
/vucko...5/show/ (line 56)
first
/vucko...5/show/ (line 61)
[cycle2] cycle-next
jquery....min.js (line 7)
first
/vucko...5/show/ (line 56)
[cycle2] cycle-next
jquery....min.js (line 7)
first
/vucko...5/show/ (line 61)
second
/vucko...5/show/ (line 56)
[cycle2] cycle-prev
jquery....min.js (line 7)
second
/vucko...5/show/ (line 61)
[cycle2] cycle-prev
jquery....min.js (line 7)
first
/vucko...5/show/ (line 56)
second

我正在使用:Firefox 16.0.2 in windows

于 2013-10-25T09:43:40.727 回答