与setInterval()冲突的动画

时间:2012-11-08 15:51:22

标签: javascript jquery jquery-animate overlay setinterval

我制作了一些脚本来对我的网站进行倒计时,它会在所有截止日期类上循环并更改时钟。

这是代码

self.setInterval(function(){
$('.deadline_container').each(function(){
    days = parseInt($(this).children('.deadline_days').html(),10);
    time = $(this).children('.deadline_time').html().split(':');
    hours = parseInt(time[0],10);
    minutes = parseInt(time[1],10);
    seconds = parseInt(time[2],10);
    if(seconds > 0){
        seconds -= 1;
    } else if(minutes > 0){
        minutes -= 1;
        seconds = 59;
    } else if(hours > 0){
        hours -= 1;
        minutes = 59;
        seconds = 59;
    } else if(days > 0){
        days -= 1;
        hours = 23;
        minutes = 59;
        seconds = 59;
    }
    sec = (seconds < 10) ? '0' + seconds : seconds;
    min = (minutes < 10) ? '0' + minutes : minutes;
    hh = (hours < 10) ? '0' + hours : hours;
    $(this).children('.deadline_days').html(days);
    $(this).children('.deadline_time').html([hh,min,sec].join(':'));
});
}, 1000);

我还有一些代码可以在鼠标悬停时显示div上的叠加

$('.someDivClass').live({
    mouseover: function() {
        $(this).children('.background').children('.overlay').stop().animate({opacity:"1"}, 300);
    },
    mouseout: function() {
         $(this).children('.background').children('.overlay').stop().animate({opacity:"0"}, 300);
    }
});

这两段代码效果很好,动画没有任何问题,问题是当间隔运行并且我将其中一个div覆盖时,覆盖动画会冻结,直到倒计时一秒钟。有时看起来没有动画,只是突然出现叠加层。有时候看起来很好,这一切都取决于我在盘旋时的瞬间。我认为setInterval函数会停止动画队列,直到它停止执行它自己的代码。

我认为jquery或类似的东西没有线程。

所以问题是:

¿如何在不依赖时钟间隔的情况下使叠加动画平滑?

¿是否有更有效的方法来进行倒计时或重叠动画?

我正在使用jquery 1.8.2和jQuery UI 1.9.0

修改

我以前没有意识到,我也有不透明度的变化,像这样:

$('#top_bar, #top_bar_container').hover(
    function(event){
        $(this).stop().animate({backgroundColor:"rgba(0,0,0,0.5)"}, 300);
    },
    function(event){
        $(this).stop().animate({backgroundColor:"rgba(0,0,0,0.2)"}, 1000);
    }
);

无论如何,动画都能顺利运行! 所以它可能是实时函数(我需要它,因为我使用AJAX向页面添加内容)或不透明动画背景动画(在CPU术语上可能更昂贵)

任何帮助都将不胜感激,谢谢。

修改
这是我的DOM

<div class="someDivClass">
    <div class="background">
        <div class="overlay">
            <div class="deadline">
                <div>Time Left</div>
                <div class="deadline_container">
                    <div class="deadline_days">14</div>
                    <div class="deadline_time">23:20:51</div>
                    <div style="clear:both;"></div>
                </div>
            </div>
        </div>
    </div>
</div>  

我的页面上有很多这样的容器。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题 实际上它不是jQuery动画或javascript setInterval()问题,它是Google Chrome本身。

我试过了:

正如philipp所说,我将第一个代码更改为setTimeout()

我将.live()更改为$(document).on('mouseover','。someDivClass',function(){...});

但这一切都没有解决问题,所以在这里和那里测试我优化了我网站上的图像,它就解决了!

我认为会发生什么:
Chrome在LARGE图像上渲染具有不透明背景的动画div时出现问题,因为当我使.background类图像变小时,动画延迟消失了。

我测试了我在Firefox 15.0.1开头的代码,并没有任何延迟。

无论如何,谢谢你的答案,我不再有动画问题了