1

我在这里找到了一个很棒的、超最小的推荐旋转器,但我很好奇如何获得它来简单地随机化结果。这是现在起作用的旋转器:

$('.testimonials div:first').show();

setInterval(function(){ 
    $('.testimonials div:first-child')
        .fadeOut(1000)
        .next('div')
        .delay(1000)
        .fadeIn(1000)
        .end()
        .appendTo('.testimonials') 
},3000);

http://jsfiddle.net/xXRwA/9/

4

3 回答 3

4

此代码确保同一项目不会显示两次,并且在您更改推荐数量时继续工作。显示的第一个项目也是随机的。

演示

$(document).ready(function() {

    $('.testimonials div').eq(Math.floor((Math.random() * $('.testimonials div').length))).show();

    setInterval(function() {

        var $items = $('.testimonials div');
        if ($items.length < 2) {
            return;
        }

        var $currentItem = $items.filter(':visible');
        var currentIndex = $currentItem.index();
        var nextIndex = currentIndex;
        while (nextIndex == currentIndex) {
            nextIndex = Math.floor((Math.random() * $items.length));
        }
        $currentItem.fadeOut(1000, function() {
            $items.eq(nextIndex).fadeIn(1000);
        });

    }, 3000);

});
于 2014-03-11T22:53:57.970 回答
0

尝试这个:

var $items = $('.testimonials .item');

function getRandomItem(){
    return $items.eq(Math.floor($items.length * Math.random()));
}

getRandomItem().show();

setInterval(function(){ 
    var $outgoing = $items.filter(':visible');
    var $incoming = getRandomItem();
    $outgoing.fadeOut(1000, function(){
        $incoming.fadeIn(1000);
    });
}, 3000);

演示:http: //jsfiddle.net/JWGbz/6/

于 2014-03-11T22:39:01.450 回答
0

这个问题一直困扰着我,我意识到真正的问题是你想要一种洗牌的方式。如果您有办法做到这一点,那么您的原始功能甚至可以按预期工作。事实证明,改组 jQuery 元素列表并不像您想象的那么容易。我首先实现了一个允许您交换两个任意 jQuery 元素的函数(这避免了使用jQuery.clone,它有副作用,例如删除事件侦听器):

function swap($a, $b){
    var $aNext = $a.next(),
        $aParent = $a.parent();
    $a.insertAfter($b);
    if($aNext.length) $b.insertBefore($aNext);
    else $aParent.append($b);
}

然后你可以实现一个Fisher-Yates shuffle:

function shuffle($items){
    var i, j;
    for(i=$items.length-1; i>1; i--){
        j = Math.floor(Math.random() * (i+1));
        swap($items.eq(i), $items.eq(j));
    }
}

现在你可以简单地洗牌你所有的推荐:

shuffle($('.testimonials .item'));

然后使用您的原始代码:

$('.testimonials div:first').show();

setInterval(function(){ 
    $('.testimonials div:first-child')
        .fadeOut(1000)
        .next('div')
        .delay(1000)
        .fadeIn(1000)
        .end()
        .appendTo('.testimonials') 
},3000);

当然,一旦你完成了所有的推荐,你可能想要重新洗牌,不要一遍又一遍地重复相同的顺序。

演示:http: //jsfiddle.net/JWGbz/7/

于 2014-03-12T02:03:17.423 回答