菜鸟科技网

JS做时钟,如何实现实时更新与样式设计?

当然可以!用 JavaScript 制作一个时钟是一个非常经典且有趣的项目,它可以帮助你理解 JavaScript 的核心概念,如 Date 对象、setInterval 定时器以及如何操作 DOM(文档对象模型)。

JS做时钟,如何实现实时更新与样式设计?-图1
(图片来源网络,侵删)

下面我将为你提供几种不同复杂度和风格的时钟实现方法,从最简单的数字时钟到更酷的模拟时钟。


简单的数字时钟

这是最基础、最容易理解的方式,它会在网页上显示当前的时间(时:分:秒)。

最终效果

HH:MM:SS

步骤 1:HTML 结构

我们需要一个 HTML 元素来显示时间,一个 <div><span> 都可以。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">JS 数字时钟</title>
    <style>
        body {
            background-color: #282c34;
            color: white;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            font-family: 'Courier New', Courier, monospace;
        }
        #clock {
            font-size: 5rem;
            padding: 2rem 4rem;
            border: 3px solid #61dafb;
            border-radius: 10px;
        }
    </style>
</head>
<body>
    <div id="clock">00:00:00</div>
    <!-- 引入我们的 JavaScript 文件 -->
    <script src="clock.js"></script>
</body>
</html>

步骤 2:JavaScript 逻辑 (clock.js)

我们来编写 JavaScript 代码来更新时间。

JS做时钟,如何实现实时更新与样式设计?-图2
(图片来源网络,侵删)
// 1. 获取显示时间的 DOM 元素
const clockElement = document.getElementById('clock');
// 2. 创建一个函数来更新时间
function updateClock() {
    // 获取当前时间
    const now = new Date();
    // 分别获取时、分、秒
    let hours = now.getHours();
    let minutes = now.getMinutes();
    let seconds = now.getSeconds();
    // 如果数字只有一位数,在前面补一个 '0'
    hours = String(hours).padStart(2, '0');
    minutes = String(minutes).padStart(2, '0');
    seconds = String(seconds).padStart(2, '0');
    // 格式化时间字符串
    const timeString = `${hours}:${minutes}:${seconds}`;
    // 将时间字符串更新到页面上
    clockElement.textContent = timeString;
}
// 3. 初始调用一次,避免页面加载后等待1秒才显示时间
updateClock();
// 4. 设置一个定时器,每秒钟执行一次 updateClock 函数
// setInterval 会在指定的时间间隔(毫秒)后重复执行一个函数
setInterval(updateClock, 1000);

代码解释:

  1. document.getElementById('clock'): 获取 HTML 中 idclock<div> 元素。
  2. new Date(): 创建一个 Date 对象,包含当前的日期和时间信息。
  3. getHours(), getMinutes(), getSeconds(): 从 Date 对象中分别提取小时、分钟和秒。
  4. String(...).padStart(2, '0'): 这是一个非常实用的技巧,它会把数字转换成字符串,并确保其长度为2,如果长度不足2,就在前面补一个 '0'。'7'.padStart(2, '0') 会变成 '07'
  5. clockElement.textContent = ...: 将计算出的时间字符串赋值给 <div> 的文本内容,从而在页面上显示出来。
  6. updateClock(): 首先调用一次,确保页面加载后时钟立即显示正确时间,而不是等待1秒。
  7. setInterval(updateClock, 1000): 这是核心,它会每1000毫秒(即1秒)调用一次 updateClock 函数,实现时间的动态更新。

带日期的数字时钟

这个版本在时间的基础上增加了年、月、日和星期。

最终效果

2025年10月27日 星期五
23:59:59

JavaScript 逻辑 (clock.js)

const clockElement = document.getElementById('clock');
function updateClock() {
    const now = new Date();
    // --- 获取并格式化日期部分 ---
    const year = now.getFullYear();
    const month = String(now.getMonth() + 1).padStart(2, '0'); // getMonth() 返回 0-11
    const day = String(now.getDate()).padStart(2, '0');
    const weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
    const weekday = weekdays[now.getDay()]; // getDay() 返回 0-6
    const dateString = `${year}年${month}月${day}日 ${weekday}`;
    // --- 获取并格式化时间部分 (与方法一相同) ---
    let hours = String(now.getHours()).padStart(2, '0');
    let minutes = String(now.getMinutes()).padStart(2, '0');
    let seconds = String(now.getSeconds()).padStart(2, '0');
    const timeString = `${hours}:${minutes}:${seconds}`;
    // --- 组合并显示 ---
    clockElement.innerHTML = `${dateString}<br>${timeString}`;
}
updateClock();
setInterval(updateClock, 1000);

主要变化:

  • 使用 getFullYear(), getMonth(), getDate(), getDay() 获取日期信息。
  • 注意 getMonth() 返回的是 0-11,所以需要 +1
  • 创建了一个星期数组,通过 getDay() 返回的索引来获取对应的中文星期名。
  • 使用 clockElement.innerHTML 而不是 textContent,因为我们要插入 <br> 换行标签。

酷炫的模拟时钟

这个版本使用 HTML5 <canvas> 元素来绘制一个有时针、分针、秒针的模拟时钟。

JS做时钟,如何实现实时更新与样式设计?-图3
(图片来源网络,侵删)

步骤 1:HTML 结构

只需要一个 <canvas> 元素。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">JS 模拟时钟</title>
    <style>
        body {
            background-color: #282c34;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
        }
        canvas {
            border: 5px solid #61dafb;
            border-radius: 50%;
            background-color: white;
        }
    </style>
</head>
<body>
    <canvas id="clockCanvas" width="300" height="300"></canvas>
    <script src="analogClock.js"></script>
</body>
</html>

步骤 2:JavaScript 逻辑 (analogClock.js)

const canvas = document.getElementById('clockCanvas');
const ctx = canvas.getContext('2d'); // 获取2D绘图上下文
const radius = canvas.height / 2; // 时钟半径
// 将坐标原点移动到画布中心
ctx.translate(radius, radius);
// 缩小坐标系,使其更适合绘制
radius * 0.90;
ctx.scale(0.90, 0.90);
function drawClock() {
    drawFace(ctx, radius);
    drawNumbers(ctx, radius);
    drawTime(ctx, radius);
}
function drawFace(ctx, radius) {
    // 画表盘外圈
    ctx.beginPath();
    ctx.arc(0, 0, radius, 0, 2 * Math.PI);
    ctx.fillStyle = 'white';
    ctx.fill();
    // 画表盘边框
    const grad = ctx.createRadialGradient(0, 0, radius * 0.95, 0, 0, radius * 1.05);
    grad.addColorStop(0, '#333');
    grad.addColorStop(0.5, 'white');
    grad.addColorStop(1, '#333');
    ctx.strokeStyle = grad;
    ctx.lineWidth = radius * 0.1;
    ctx.stroke();
    // 画中心点
    ctx.beginPath();
    ctx.arc(0, 0, radius * 0.1, 0, 2 * Math.PI);
    ctx.fillStyle = '#333';
    ctx.fill();
}
function drawNumbers(ctx, radius) {
    let ang;
    ctx.font = radius * 0.15 + "px arial";
    ctx.textBaseline = "middle";
    ctx.textAlign = "center";
    ctx.fillStyle = '#333';
    for(let num = 1; num < 13; num++){
        ang = num * Math.PI / 6;
        ctx.rotate(ang);
        ctx.translate(0, -radius * 0.85);
        ctx.rotate(-ang);
        ctx.fillText(num.toString(), 0, 0);
        ctx.rotate(ang);
        ctx.translate(0, radius * 0.85);
        ctx.rotate(-ang);
    }
}
function drawTime(ctx, radius){
    const now = new Date();
    let hour = now.getHours();
    let minute = now.getMinutes();
    let second = now.getSeconds();
    // 计算时针角度 (也要加上分钟的影响)
    hour = hour % 12;
    hour = (hour * Math.PI / 6) + (minute * Math.PI / (6 * 60)) + (second * Math.PI / (360 * 60));
    drawHand(ctx, hour, radius * 0.5, radius * 0.07, '#333');
    // 计算分针角度 (也要加上秒的影响)
    minute = (minute * Math.PI / 30) + (second * Math.PI / (30 * 60));
    drawHand(ctx, minute, radius * 0.8, radius * 0.07, '#666');
    // 计算秒针角度
    second = (second * Math.PI / 30);
    drawHand(ctx, second, radius * 0.9, radius * 0.02, 'red');
}
function drawHand(ctx, pos, length, width, color) {
    ctx.beginPath();
    ctx.strokeStyle = color;
    ctx.lineWidth = width;
    ctx.lineCap = "round";
    ctx.moveTo(0, 0);
    ctx.rotate(pos);
    ctx.lineTo(0, -length);
    ctx.stroke();
    ctx.rotate(-pos);
}
// 初始绘制并设置定时器
drawClock();
setInterval(drawClock, 1000);

代码解释:

  1. Canvas 基础: canvas.getContext('2d') 获取了绘图所需的“上下文”(Context),所有绘图操作都通过它来完成。
  2. 坐标变换: ctx.translate() 将画布的原点(0,0)从左上角移动到了中心。ctx.scale() 对整个坐标系进行了缩放,方便后续计算。
  3. drawClock(): 主函数,负责调用其他绘制函数来完成整个时钟的绘制。
  4. drawFace(): 绘制表盘,包括圆形背景、渐变边框和中心点。
  5. drawNumbers(): 循环12次,使用 ctx.fillText() 在正确的位置绘制数字 1-12。ctx.rotate()ctx.translate() 的组合是实现精确定位的关键。
  6. drawTime(): 核心逻辑,获取当前时间,并计算出时针、分针、秒针各自的角度。
    • 关键点: 时针和分针的角度会受到分钟和秒数的影响,这样指针的运动才更平滑、更真实。
  7. drawHand(): 绘制单个指针,它接收角度、长度、宽度和颜色作为参数,然后画一条从中心点出发的线。
特性 方法一 (数字时钟) 方法二 (带日期) 方法三 (模拟时钟)
技术核心 Date 对象, textContent, setInterval Date 对象, innerHTML, setInterval Date 对象, Canvas API, setInterval
难度 ⭐⭐ ⭐⭐⭐
灵活性
学习重点 基础的 JS 语法和 DOM 操作 数组应用和字符串格式化 Canvas 坐标系、变换和绘图 API

从最简单的数字时钟开始,逐步尝试更复杂的版本,是学习 JavaScript 的绝佳路径,希望这个详细的教程对你有帮助!

分享:
扫描分享到社交APP
上一篇
下一篇