2016-03-13 25 views
0

我在这里有一个代码,其中imgNumb的值由timeElapsed变量定义。随着时间的推移,imgNumb的值从0开始到4的最大值,之后我希望它从0开始,就像循环中一样。大部分工作的功能是autoFade()。即使在JS中声明后仍然继续使用的时间

问题:问题是我声明elapsedTime等于延迟后,它只剩下4个持续时间的其余部分,并没有像以前那样增加。

请帮帮我!如果可以的话,我会非常感激!谢谢。

这里是下面的代码:

var a = document.getElementById("slidermain"); 
var b = a.getElementsByTagName("IMG"); 
var len = b.length; 

var cusOpac = 0; 
var delay = 4; 
var imgNumb = 0; 
var elem; 
var now, before = new Date(); 

function autoFade(){ 
    var loop = setInterval(function(){ 
    now = new Date(); 
    var timeDiff = (now.getTime() - before.getTime()); 
    var elapsedTime = Math.floor(timeDiff/1000); 
    var lendelay = len*delay; 
    var currentFrame = Math.floor(elapsedTime/delay)-1; 
    var imgNumb = currentFrame % 5; 
    initFade(imgNumb); 
    }, delay*1000); 
} 

function initFade(imgNumb){ 
    elem = b[imgNumb]; 
    startFadeEffect(elem); 
} 

function startFadeEffect(elem){ 
    opacSetting = cusOpac/10; 
    elem.style.opacity = opacSetting; 
    elem.style.display = "block"; 
    cusOpac++; 
    if(cusOpac > 10){ 
     cusOpac = 10; 
    } 
    var timer = setTimeout(function() { startFadeEffect(elem); }, 55); 
    if(opacSetting == 1){ 
     clearTimeout(timer); 
     cusOpac = 10; 
     elem.style.opacity = 1; 
     setTimeout(function() { endFadeEffect(elem); }, (delay*1000)/2); 
    } 
} 

function endFadeEffect(elem){ 
    opacSetting = cusOpac/10; 
    elem.style.opacity = opacSetting; 
    cusOpac--; 
    if(cusOpac < 0){ 
     cusOpac = 0;  
    } 
    var timer = setTimeout(function() { endFadeEffect(elem); }, 55); 
    if(opacSetting == 0){ 
     clearTimeout(timer); 
     elem.style.opacity = 0; 
     elem.style.display = "none"; 
     cusOpac = 0; 
     return false; 
    } 
} 

请注意我在寻找一个JavaScript唯一的解决办法!

+0

你已经在运行,每4秒的间隔,那么为什么你一直运行相当昂贵的操作(计算时间差 - 它永远是〜上次运行后4000毫秒),而不是简单地将1加到一个变量,并在它达到4时重置它? – h2ooooooo

+0

我使用它作为我在下一个函数中创建的FadeIn和Out动画的计时器。因此,即使浏览器的选项卡未激活,动画也会继续运行。 –

回答

0

请正确格式化代码,并尽量减少到必要的绝对最小值。你的情况,我相信你问到创建函数f(elapsedTimeSeconds) - >imgNumb,即是这样的:

  • 如果delay * 0 <= elapsedTimeSeconds < delay * 1imgNumb = 0
  • 如果delay * 1 <= elapsedTimeSeconds < delay * 2imgNumb = 0
  • 如果delay * 2 <= elapsedTimeSeconds < delay * 3imgNumb = 1
  • 如果delay * 3 <= elapsedTimeSeconds < delay * 4imgNumb = 2
  • 如果delay * 4 <= elapsedTimeSeconds < delay * 5imgNumb = 3
  • 如果delay * 5 <= elapsedTimeSeconds < delay * 6imgNumb = 4
  • 如果delay * 6 <= elapsedTimeSeconds < delay * 7imgNumb = 0
  • 如果delay * 7 <= elapsedTimeSeconds < delay * 8imgNumb = 1

...等等。

您已经知道Math.floor(elapsedTimeSeconds/delay)-1为您提供了什么,如果delay*1 <= elapsedTimeSeconds < delay*6,但在此之后它继续增长。

所以,你需要的是一个生产函数:

  • 0 - > 0
  • ...
  • 4 - > 4
  • 5 - > 0
  • 6 - > 1
  • ...
  • 9 - > 4

..等等。这就是modulo operation

var currentFrame = Math.floor(elapsedTimeSeconds/delay)-1; 
var imgNumb = currentFrame % 5; 
+0

谢谢!我现在正在通过模运算,但是你提到的最后2行代码究竟做了什么? –

+0

@SameerBakshi他们是我猜想你需要解决的问题的解决方案(*“我相信你要求创建一个函数f(elapsedTimeSeconds) - > imgNumb,就像这样工作”*)。这个想法是,给定起始时间,当前时间和“帧”之间的延迟(即页面上某些内容发生变化的时刻),我们可以找到帧号 - 这是第一行。它将无限增长(0,1,2,...,11,12)。接下来,我们需要将其转换为必须重复从0到4的图像编号,一遍又一遍。为此,我们使用模(%5)。 – Nickolay

+0

好吧,但是当elapseTime大于lendelay时会发生wat?并再次感谢! –

相关问题