【发布时间】:2017-01-04 23:04:52
【问题描述】:
我正在尝试为这个“乒乓”(fizz-buzz)程序添加声音和动画。我想要发生的是对于数组中的每个项目(数字/ping/pong/pingpong),当声音和动画播放时,文本会在列表中淡入。
我得到的是 - 整个列表一次全部淡入,声音一次播放一个(如果输入的数字很大,它会永远持续下去)但动画只发生一次(显然只是最后一个动画)。
整个项目位于:https://github.com/karenfreemansmith/Epic-AdvancedJSwk1-PingPongCalculator,以及一个指向当前正在运行的页面的链接。 (比下面的代码稍早,只是用新的方式破坏了它。)
我一直在尝试使用 setInterval 和 setTimeout 来同步它们,方法是调用一个函数,该函数一次显示一个元素及其声音和动画:
var play=setInterval(function() {
var i=1;
output.forEach(item => {
showNext(item);
if(i>=output.length) {
clearInterval(play);
}
i++;
});
}, 1000);
函数如下所示:
function showNext(item) {
acorn.style.animation= "";
acorn.style.webkitAnimation="";
if(item==="ping") {
window.setTimeout(playPing(), 1000);
} else if(item==="pong") {
window.setTimeout(playPong(), 1000);
} else if(item==="ping-pong") {
window.setTimeout(playVolley(), 1000);
} else {
window.setTimeout(playMiss(), 1000);
$("#pingpong").append("<p class='"+item+"'>" + item + "</p>");
}
}
而且播放功能基本相同,只是声音不同:
function playPing() {
acorn.style.animation= "ping 1s linear";
acorn.style.webkitAnimation="ping 1s linear";
sndSlam1.currentTime = 0;
sndSlam1.play();
$("#pingpong").append("<p class='ping'>ping</p>");
}
我想我一定是误解了 setTimeout 的工作原理。为什么动画只播放一次?为什么添加到列表的元素之间没有停顿?
【问题讨论】:
-
我没有播放音频,只是使用 .mp3 文件播放乒乓球的声音。看起来这里的事件主要是检查文件是否已下载。
-
获取媒体,然后
timeupdate或progress事件可用于确定媒体播放的.currentTime以应用特定样式或动画。 -
每个声音文件只有一个动画,动画首先播放(或至少开始),然后是所有声音,但没有更多动画。我觉得这很奇怪,因为动画是与 LAST 声音相匹配的动画。看起来还有一个“结束”事件,所以如果我使用 eventListener 和 .then() 来播放动画?
-
你能创建一个 jsfiddle jsfiddle.net 或 plnkr plnkr.co 来演示吗?
标签: javascript animation audio settimeout setinterval