简易的倒计时
目录
这两天折腾着实现一个带有声音的倒计时,效果虽简单,不过还是挺有趣的……
最终实现的效果:
环形进度条
本着不重复造轮子的原则,直接采用现成的 JS插件 progressbar.js,几行代码直接实现:
<div class="circle-progress"></div>
var bar = new ProgressBar.Circle(".circle-progress", {
color: "green",
strokeWidth: 4,
trailColor: "#eee",
duration: 10,
text: {
value: '<div class="circle-progress-btn" data-status="init"><i class="glyphicon glyphicon-play"></i></div>',
style: {
color: 'gray',
},
}
});
然后就可以很方便的控制进度了:
bar.animate(0.3)
倒计时
要实现倒计时的功能,我们可以通过 setInterval() 来实现:
<div class="clock">
<span id="clock-time">10</span> / <span id="total-time">10</span>
</div>
var interval;
interval= setInterval(updateTime, 1000);
function updateTime(){
var total = $("#total-time").html();
var left = $("#clock-time").html();
var now = left - 1;
if (now >= 0){
$("#clock-time").html(now);
bar.animate(1-now/total);
}else{
clearInterval(interval);
}
}
音效
我们要实现开始、结束、倒计时过程的声音,声音可以通过 HTML 的 audio 来实现:
var diAudio = document.createElement("audio");
diAudio.setAttribute("src", "sound/di.mp3");
// 开始提示音结束后启动倒计时
var startAudio = document.createElement("audio");
startAudio.setAttribute("src", "sound/start.mp3");
startAudio.addEventListener("ended", function(){
$(".circle-progress-btn").data("status", "pause");
$(".circle-progress-btn").trigger("click");
});
// 结束提示音停止后复位倒计时
var endAudio = document.createElement("audio");
endAudio.setAttribute("src", "sound/end.mp3");
endAudio.addEventListener("ended", function(){
$("#clock-time").html($("#total-time").html());
$(".circle-progress-btn").html('<i class="glyphicon glyphicon-play"></i>');
$(".circle-progress-btn").data("status", "init");
bar.animate(0);
});
暂停/播放
倒计时过程中如果要暂停,我们可以使用 clearInterval() 来实现,同时也需要对计时器的状态进行修改:
$(".circle-progress-btn").click(function(){
var status = $(this).data("status");
console.log(status);
if (status == "init"){
$(this).html('<i class="glyphicon glyphicon-pause"></i>');
startAudio.play();
}else if (status == "pause"){
$(this).html('<i class="glyphicon glyphicon-pause"></i>');
$(this).data("status", "play")
clearInterval(interval);
interval= setInterval(updateTime, 1000);
function updateTime(){
var total = $("#total-time").html();
var left = $("#clock-time").html();
var now = left - 1;
if (now >= 0){
diAudio.play();
$("#clock-time").html(now);
bar.animate(1-now/total);
}else{
clearInterval(interval);
endAudio.play();
}
}
}else if (status == "play") {
$(this).html('<i class="glyphicon glyphicon-play"></i>');
$(this).data("status", "pause")
clearInterval(interval);
}
});
适配移动设备
完成后,发现这个带声音的倒计时在Chrome下可以很完美地运行。然而把页面放到微信中去,却发现倒计时正常,开始音效也正常,滴滴声跟结束音效都不能正常播放!
仔细研究一番,才知道原来移动设备是不允许直接通过代码控制音频加载播放的,因为用户在移动网络下可能会产生昂贵的数据流量费用。
而开始音效之所以能够正常播放,是因为它是由用户 click 触发的;滴滴声和结束声是在 setInterval() 中触发的,因此也就没办法播放了。不过幸运的是,对于已经加载的音频,我们可以通过代码控制其播放。所以我们只要在用户click的时候把需要的音频文件都加载下来就可以了,修改代码:
$(".circle-progress-btn").click(function(){
var status = $(this).data("status");
console.log(status);
if (status == "init"){
diAudio = document.createElement("audio");
diAudio.play();
diAudio.src = "sound/di.mp3";
startAudio = document.createElement("audio");
startAudio.play();
startAudio.src = "sound/start.mp3";
endAudio = document.createElement("audio");
endAudio.play();
endAudio.src = "sound/end.mp3";
$(this).data("status", "ready");
$(this).trigger("click");
}else if (status == "ready"){
$(this).html('<i class="glyphicon glyphicon-pause"></i>');
startAudio.play();
}else if (status == "pause"){
......在第一次 play 的时候,由于 src 未设置,因此实际上是没有声音播放的:
diAudio = document.createElement("audio");
diAudio.play();
diAudio.src = "sound/di.mp3";
搞定收工~~~
参考:
码字很辛苦,转载请注明来自ChenJiehua的《简易的倒计时》


评论