2012-12-01 72 views
0

我有一个开门的动画(41帧),我想用javaScript打开onmouseover,并且我想让它回到第1帧onmouseout。我认为我没有做到这一点。先谢谢您的帮助!javaScript动画图像onmouseover/onmouseout

HTML: 
    <div onmouseover="startAnimation()" onmouseout="stopAnimation()" id="door2"></div> 
    <div id="door"> 
    <img src="images/Animation_Door/0001.png"> 
    <img src="images/Animation_Door/0002.png"> 
    <img src="images/Animation_Door/0003.png"> 
    ...etc...(41 frames) 

css: 
    #door img{ 
    display: none; 
    } 

    #door img:first-child { 
    display: block; 
    } 

javaScript: 
    function startAnimation() { 
    var frames = document.getElementById("door").children; 
    var frameCount = frames.length; 

    for (i=0; i<41; i++) { 
    setTimeout(function(){ 
    frames[i % frameCount].style.display = "none"; 
    frames[++i % frameCount].style.display = "block"; 
    }, 50*i); 
    } 
    } 

    function stopAnimation() { 
    var frames = document.getElementById("door").children; 
    var frameCount = frames.length; 

    for (i=0; i<1; i++){ 
    setTimeout(function(){ 
    frames[++i % frameCount].style.display = "none"; 
    frames[i % frameCount].style.display = "block"; 
    }, 50*i); 
    } 
    } 

这里有一个链接: http://www.reveriesrefined.com/test

+2

链接正在返回一个403禁止状态 – lostsource

+1

stopAnimation中的for循环不应该有“i <41”而不是“i <1”吗? – luwes

+0

我似乎无法修复链接,但如果您只是将其粘贴到浏览器中,它应该可以正常工作。 – user1868086

回答

1

我觉得这可能是更喜欢你想要什么:

var ti, frame = 0, 
frames = document.getElementById('door').children; 

function resetAnimation() { 
    frame = 0; 
    frames[0].style.display = 'block'; 
    for (var i = 1; i < frames.length; i++) { 
     frames[i].style.display = 'none'; 
    } 
} 
function startAnimation() { 
    console.log('start animation'); 
    resetAnimation(); 
    ti = setInterval(function() { 
     frames[frame].style.display = 'none'; 
     frame ++; 
     if (frame >= frames.length) frame = 0; 
     frames[frame].style.display = 'block'; 
    }, 50); 
} 
function stopAnimation() { 
    if (ti) { 
     clearInterval(ti); 
     ti = undefined; 
    } 
    resetAnimation(); 
}​ 

注意,它通常是更合适的比的setTimeout使用的setInterval当你想要一个连续的动画。全局变量存储我们当前正在查看的帧。 resetAnimation将帧设置为零并相应地设置显示。 startAnimation会设置一个隐藏旧帧的间隔计时器,将帧增加一个,并每隔50ms显示一个新帧。停止动画只是清除间隔计时器并重置动画。

+0

我试过你的代码,但它不工作。它甚至不会开始动画。我试过onmouseover =“startAnimation()”onm​​ouseout =“stopAnimation()”,我也尝试onClick,但它不启动动画。任何想法为什么?我正在尝试一堆东西,但似乎无法让动画与您的代码一起工作。 – user1868086

+0

适用于我[这里](http://jsfiddle.net/vHbn5/3/)。在原始代码中,事件处理程序位于空白div(id =“door2”)上,因此您甚至可能无法看到需要将鼠标放在上面的div。 – Stuart