使用setInterval的动画问题

时间:2012-08-11 20:45:59

标签: javascript jquery

我通过点击红色的div来动画一个div向左移动0px。在div下面,当div移动时,类被添加到li中,但是类只被添加到某些li而不是全部。

还有其他逻辑可以解决这个问题吗?

小提琴 - http://jsfiddle.net/AsfFQ/16/

以下是问题的图片 enter image description here

2 个答案:

答案 0 :(得分:2)

试试 jsFiddle example

var pos;
var timer, selectLi = (function() {
    var $block = $('.block'),
        $container = $('.container'),
        $lis = $('.container ul li'),
        liWidth = $lis.width(),
        $selectedLi;
    return function() {
        pos = $block.offset().left - $container.offset().left;
        liNum = Math.round(pos / liWidth);
        // $selectedLi && $selectedLi.removeClass('selected');
        $selectedLi = $($lis.get(liNum));
        $('li.eligible').each(function() {
            if ($block.offset().left-3 <= $(this).offset().left) $(this).addClass('selected');
        });
    };
})();

$('.block').click(function() {
    timer = setInterval(selectLi, 30);
    $(this).animate({
        left: 0
    }, function() {
        clearInterval(timer);
    });
});

$('li').each(function() {
    $(this).addClass('eligible');
    if ($(this).offset().left > $('.block').offset().left) $(this).removeClass('eligible');
});​

设置符合条件的列表项,然后当栏移动时,将它们的位置与栏的tjat进行比较,如果它们在范围内,则会添加该类。

答案 1 :(得分:0)

你的小动画只需要一点代码。 见jsfiddle example

var $block = $('.block'),
    start = $block.offset().left;

$block.one('click').animate({left: 0})
 .$('li').filter(function(){return $(this).offset().left<=start})
 .repeat(30).filter(function(){return $(this).offset().left>=$block.offset().left})
 .addClass('selected').unrepeat();
​

我正在使用此插件jquery-timing


这在每次点击动画100px时也有效,请参阅another fiddle

var $block = $('.block');
$block.on('click').animate({left: '-=100px'})
 .$('li').filter(function(){return $(this).offset().left<=$block.offset().left})
 .repeat(30).filter(function(){return $(this).offset().left>=$block.offset().left})
 .addClass('selected').unrepeat();

玩得开心!