CSS

body{
display: flex;
flex-direction: column;
align-items: center;
background-color: hsl(0, 0%, 90%);
} 
 
#myH1{
font-size: 4rem;
font-family: "Arial", "sans-serif";
color: hsl(0, 0%, 25%);
}
 
#container{
display: flex;
flex-direction: column;
align-items: center;
padding: 30px;
border: 5px solid;
border-radius: 50px;
background-color: #fff;
}
 
#display{
font-size: 5rem;
font-family: monospace;
font-weight: bold;
color: hsl(0, 0%, 30%);
text-shadow: 2px 2px 2px #000;
margin-bottom: 25px;
}
 
#controls button{
font-size: 1.5rem;
font-weight: bold;
padding: 10px 20px;
margin: 5px;
min-width: 125px;
border-radius: 10px;
cursor: pointer;
color: #fff;
transition: all 0.5s ease;
}
 
#startBtn{
background-color: hsl(115, 100%, 40%);
}
#startBtn:hover{
background-color: hsl(115, 100%, 30%);
} 
 
#stopBtn{
background-color: hsl(10, 90%, 30%);
}
#stopBtn:hover{
background-color: hsl(10, 90%, 50%);
}
 
#resetBtn{
background-color: hsl(205, 90%, 40%);
}
#resetBtn:hover{
background-color: hsl(205, 90%, 30%);
}

HTML

<h1 id="myH1">StopWatch</h1>
	<div id="container">
	<div id="display">00:00:00:00</div>
	<div id="controls">
		<button id="startBtn" onclick="start()">Start</button>
		<button id="stopBtn" onclick="stop()">stop</button>
		<button id="resetBtn" onclick="reset()">reset</button>
	</div>
</div>

Js

// ======================== 元素 & 变量初始化 ========================
// 获取 HTML 中显示时间的元素,例如:<div id="display"></div>
const display = document.getElementById("display");
// 保存定时器 ID(用于 clearInterval)
let timer = null;
// 保存开始时间(单位:毫秒)
let startTime = 0;
// 保存已经经过的时间(单位:毫秒)
// 用于暂停后继续计时
let elapsedTime = 0;
// 记录秒表是否正在运行
let isRunning = false;
 
// ======================== 启动计时 ========================
function start() {
  // 只有当计时器当前未运行时才可以启动
  if (!isRunning) {
    // 记录启动的时间点
    // 若之前暂停过,就从暂停时间继续(减去 elapsedTime)
    startTime = Date.now() - elapsedTime;
    // 每隔 10 毫秒更新一次显示(即 1/100 秒精度)
    timer = setInterval(update, 10);
    // 标记当前状态为“正在运行”
    isRunning = true;
  }
}
 
// ======================== 暂停计时 ========================
function stop() {
  // 只有在运行状态下才能暂停
  if (isRunning) {
    // 清除定时器(停止调用 update())
    clearInterval(timer);
    // 记录当前已用时间(用于恢复继续计时)
    elapsedTime = Date.now() - startTime;
    // 修改状态为“停止”
    isRunning = false;
  }
}
 
// ======================== 重置计时 ========================
function reset() {
  // 停止定时器,防止仍在运行
  clearInterval(timer);
  // 重置所有计时相关变量
  startTime = 0;
  elapsedTime = 0;
  isRunning = false;
  // 恢复显示为初始值
  display.textContent = "00:00:00:00";
}
 
// ======================== 更新时间显示 ========================
function update() {
  // 当前系统时间(毫秒)
  const currentTime = Date.now();
  // 计算从开始到现在经过的总时间(单位:毫秒)
  elapsedTime = currentTime - startTime;
  // 计算时、分、秒、毫秒(四个部分)
  let hours = Math.floor(elapsedTime / (1000 * 60 * 60));    
  let minutes = Math.floor((elapsedTime / (1000 * 60)) % 60);      
  let seconds = Math.floor((elapsedTime / 1000) % 60);             
  let milliseconds = Math.floor((elapsedTime % 1000) / 10);     
  // padStart(2, "0") 保证个位数前补“0”
  hours = String(hours).padStart(2, "0");
  minutes = String(minutes).padStart(2, "0");
  seconds = String(seconds).padStart(2, "0");
  milliseconds = String(milliseconds).padStart(2, "0");
  // 更新页面显示
  display.textContent = `${hours}:${minutes}:${seconds}:${milliseconds}`;
}