1. 简介
在线倒计时应用是常见的一种基于时间管理的工具。它可以为用户提供定时提醒、倒计时和倒计时统计等功能。在本文中,我们将使用JavaScript构建一个在线倒计时应用。
2. 功能列表
在我们开始构建应用之前,让我们列出我们的功能清单:
设置倒计时时间
开始/停止倒计时
暂停/恢复倒计时
重置倒计时
声音提醒
显示倒计时进度条
3. 页面布局
我们将采用HTML、CSS和JavaScript技术来实现在线倒计时应用。首先,我们要设计应用的页面布局。
我们需要一个表单,让用户设置倒计时时间,并且在倒计时开始后,可以暂停或停止倒计时。此外,我们还需要一个进度条来显示倒计时的进度,以及一个声音播放器。
3.1 页面结构
下面是我们应用的基本HTML结构:
<!-- 页面结构 -->
<div id="timer-container">
<form id="timer-form">
<label for="minutes">Min:</label>
<input type="number" id="minutes" value="0" min="0" max="59">
<label for="seconds">Sec:</label>
<input type="number" id="seconds" value="0" min="0" max="59">
<input type="button" id="start-timer" value="Start">
<input type="button" id="pause-timer" value="Pause">
<input type="button" id="stop-timer" value="Stop">
</form>
<div id="timer-progress"></div>
<audio id="alarm-sound" src="alarm.mp3"></audio>
</div>
3.2 样式布局
接下来,我们需要应用CSS样式来布局和美化我们的页面。下面是基本的样式:
/* 页面样式 */
body {
background-color: #f2f2f2;
font-family: "Open Sans", sans-serif;
font-size: 16px;
color: #333;
margin: 0;
padding: 0;
}
#timer-container {
background-color: #fff;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
margin: 50px auto;
max-width: 500px;
padding: 20px;
}
#timer-form {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
margin-bottom: 10px;
}
#timer-form label, #start-timer, #pause-timer, #stop-timer {
margin-right: 10px
}
#timer-form input[type="number"], #start-timer, #pause-timer, #stop-timer {
font-size: 1.4rem;
text-align: center;
}
#start-timer, #pause-timer, #stop-timer {
background-color: #0a5;
border: 0;
border-radius: 4px;
color: #fff;
cursor: pointer;
padding: 8px 12px;
transition: background-color 0.2s ease-in-out;
}
#start-timer:hover, #pause-timer:hover, #stop-timer:hover {
background-color: #247059;
}
#start-timer:active, #pause-timer:active, #stop-timer:active {
background-color: #06302e;
}
#timer-progress {
background-color: #ddd;
border-radius: 4px;
height: 10px;
margin-bottom: 20px;
overflow: hidden;
position: relative;
width: 100%;
}
#timer-progress-bar {
background-color: #0a5;
height: 100%;
position: absolute;
}
#alarm-sound {
display: none;
}
4. JavaScript代码实现
现在,我们已经准备好开始编写JavaScript代码来处理倒计时程序。我们将把应用的控制逻辑和时间管理逻辑分开处理,以便于测试和调试。
4.1 时间管理
我们将创建一个Time类,这个类将实现倒计时的核心逻辑。Time类的构造函数将接受两个参数,分别是分钟和秒钟,并将它们转换成毫秒。这个类还将实现倒计时的开始、暂停、恢复和停止功能。
/**
* Time类:倒计时核心功能
*/
class Time {
constructor(minutes, seconds) {
this.minutes = minutes;
this.seconds = seconds;
this.totalTime = minutes * 60 * 1000 + seconds * 1000;
this.startTime = 0;
this.pauseTime = 0;
this.isPaused = false;
this.isStopped = false;
}
start(callback) {
if (this.isPaused) {
this.startTime += Date.now() - this.pauseTime;
this.isPaused = false;
} else {
this.startTime = Date.now();
this.isStopped = false;
}
this.interval = setInterval(() => {
const timePassed = Date.now() - this.startTime;
const timeLeft = this.totalTime - timePassed;
if (timeLeft <= 0) {
clearInterval(this.interval);
callback();
} else {
const minutesLeft = Math.floor(timeLeft / 60000);
const secondsLeft = Math.floor(timeLeft % 60000 / 1000);
const progress = (this.totalTime - timeLeft) / this.totalTime * 100;
this.seconds = secondsLeft;
this.minutes = minutesLeft;
callback(this.minutes, this.seconds, progress);
}
}, 500);
}
pause() {
this.pauseTime = Date.now();
this.isPaused = true;
clearInterval(this.interval);
}
stop() {
this.isStopped = true;
clearInterval(this.interval);
}
reset() {
this.minutes = 0;
this.seconds = 0;
this.totalTime = 0;
this.isPaused = false;
this.isStopped = false;
clearInterval(this.interval);
}
}
上面的代码创建了一个Time类,包含了倒计时的核心逻辑,我们将在应用的“开始”按钮上调用该类的“start”方法以启动倒计时。
4.2 应用程序逻辑
我们将使用下面的代码来实现应用程序的控制逻辑:
// 定义对象
const form = document.getElementById("timer-form");
const minutesInput = document.getElementById("minutes");
const secondsInput = document.getElementById("seconds");
const startButton = document.getElementById("start-timer");
const pauseButton = document.getElementById("pause-timer");
const stopButton = document.getElementById("stop-timer");
const progress = document.getElementById("timer-progress-bar");
const audio = document.getElementById("alarm-sound");
let time;
// 定义事件监听器
form.addEventListener("submit", (event) => {
event.preventDefault();
const minutes = parseInt(minutesInput.value);
const seconds = parseInt(secondsInput.value);
time = new Time(minutes, seconds);
});
startButton.addEventListener("click", () => {
time.start((minutes, seconds, progress) => {
minutesInput.value = minutes;
secondsInput.value = seconds;
progressBar.style.width = progress + "%";
if (progress === 100) {
audio.play();
}
});
});
pauseButton.addEventListener("click", () => {
time.pause();
});
stopButton.addEventListener("click", () => {
time.stop();
});
// 重置按钮
const resetButton = document.createElement("button");
resetButton.textContent = "Reset";
resetButton.style.marginLeft = "10px";
form.appendChild(resetButton);
resetButton.addEventListener("click", () => {
time.reset();
minutesInput.value = "0";
secondsInput.value = "0";
progressBar.style.width = "0%";
});
上面的代码将创建一个Time的对象,并在“开始”按钮上调用它的“start”方法。它还将监听“暂停”和“停止”按钮的点击事件,并在“暂停”按钮上调用Time对象的“pause”方法,“停止”按钮上调用Time对象的“stop”方法。还有一个“重置”按钮,当用户在倒计时开始之前或者在倒计时停止之后点击该按钮时,将调用Time对象的“reset”方法。
5. 总结
在本文中,我们已经使用JavaScript构建了一个简单的在线倒计时应用。通过使用对象和模块化的设计,我们可以更好地保持代码的结构和可读性,以及更容易测试和调试。
尽管我们只是实现了几个基本功能,但是我们已经学习了许多关于应用程序开发的核心概念,包括JavaScript中的类和面向对象编程,以及HTML、CSS和JavaScript之间的交互。
我希望这篇文章对您有所启发,以便您能够创建出更复杂的应用程序。