javascript+HTML5 canvas绘制时钟功能示例

让我详细地讲解“JavaScript+HTML5 Canvas绘制时钟功能示例”的完整攻略。

简介

在这个项目中,我们将使用JavaScript和HTML5的Canvas API来绘制一个时钟。

HTML5 Canvas是用于绘制2D图像的HTML元素。它可以用于绘制各种形状,如直线、圆形、多边形、图像等等。

在这个项目中,我们将使用Canvas API来绘制时钟的各个部分,包括时针、分针和秒针。

第一步 - HTML结构

首先,我们需要一个HTML结构来容纳我们的时钟。

这是一个基本的HTML结构,其中包含一个Canvas元素:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Canvas Clock</title>
    <style>
        canvas {
            background-color: #333;
            display: block;
            margin: 0 auto;
        }
    </style>
</head>
<body>
    <canvas id="clock"></canvas>
    <script src="script.js"></script>
</body>
</html>

第二步 - 绘制时钟

接下来,我们需要一个JavaScript文件来处理绘制时钟的逻辑。

我们可以使用Canvas API中的方法来绘制时钟的各个组件。这些方法包括beginPath()arc()stroke()fill()等。

以下是一个基本的JavaScript文件,它实现了一个简单的时钟:

const canvas = document.getElementById('clock');
const ctx = canvas.getContext('2d');

const radius = canvas.width / 2;

ctx.translate(radius, radius);
radius = radius * 0.90

setInterval(drawClock, 1000);

function drawClock() {
    drawFace(ctx, radius);
    drawNumbers(ctx, radius);
    drawTime(ctx, radius);
}

function drawFace(ctx, radius) {
    let grad;

    ctx.beginPath();
    ctx.arc(0, 0, radius, 0, 2*Math.PI);
    ctx.fillStyle = 'white';
    ctx.fill();

    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;
    let num;

    ctx.font = radius*0.15 + "px arial";
    ctx.textBaseline="middle";
    ctx.textAlign="center";

    for(num = 1; num <= 12; 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){
    let now = new Date();
    let hour = now.getHours();
    let minute = now.getMinutes();
    let second = now.getSeconds();

    //hour
    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);

    //minute
    minute=(minute*Math.PI/30)+(second*Math.PI/(30*60));
    drawHand(ctx, minute, radius*0.8, radius*0.07);

    // second
    second=(second*Math.PI/30);
    drawHand(ctx, second, radius*0.9, radius*0.02);
}

function drawHand(ctx, pos, length, width) {
    ctx.beginPath();
    ctx.lineWidth = width;
    ctx.lineCap = "round";
    ctx.moveTo(0,0);
    ctx.rotate(pos);
    ctx.lineTo(0, -length);
    ctx.stroke();
    ctx.rotate(-pos);
}

我们使用setInterval()函数每秒钟调用drawClock()函数一次。

drawClock()函数用于绘制整个时钟,它分别调用了drawFace()drawNumbers()drawTime()函数。

drawFace()函数用于绘制时钟的表盘。

drawNumbers()函数用于绘制时钟的数字。

drawTime()函数用于绘制时钟的时针、分针和秒针。

示例说明

示例一

要想自定义时钟样式,可以先调整绘制时钟的各个方法,例如:

function drawFace(ctx, radius) {
  ctx.beginPath();
  ctx.arc(0, 0, radius, 0, 2*Math.PI);
  ctx.fillStyle = "#fff";
  ctx.fill();
}

function drawNumbers(ctx, radius) {
  ctx.font = radius * 0.15 + "px arial";
  ctx.textBaseline = "middle";
  ctx.textAlign = "center";
  for(let num = 1; num <= 12; num++){
    let 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){
  let 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, "#000");

  minute = (minute*Math.PI/30)+(second*Math.PI/(30*60));
  drawHand(ctx, minute, radius*0.8, radius*0.07, "#000");

  second = (second*Math.PI/30);
  drawHand(ctx, second, radius*0.9, radius*0.02, "#f00");
}

function drawHand(ctx, pos, length, width, color) {
  ctx.beginPath();
  ctx.lineWidth = width;
  ctx.lineCap = "round";
  ctx.moveTo(0,0);
  ctx.rotate(pos);
  ctx.strokeStyle = color;
  ctx.lineTo(0, -length);
  ctx.stroke();
  ctx.rotate(-pos);
}

这里,我们将时针设为黑色,分针设为黑色,秒针设为红色。

示例二

可以添加一些动画效果,可以将时钟的表盘和指针都做成渐变色,并且每秒钟表盘上的所有数字随机旋转,例如:

function drawFace(ctx, radius) {
  let grad;

  ctx.beginPath();
  ctx.arc(0, 0, radius, 0, 2*Math.PI);
  grad = ctx.createRadialGradient(0, 0, radius*0.95, 0, 0, radius*1.05);
  grad.addColorStop(0, '#333');
  grad.addColorStop(0.5, "#fff");
  grad.addColorStop(1, '#333');
  ctx.fillStyle = grad;
  ctx.fill();

  ctx.beginPath();
  ctx.arc(0, 0, radius*0.1, 0, 2*Math.PI);
  ctx.fillStyle = '#333';
  ctx.fill();
}

function drawNumbers(ctx, radius) {
  let ang;
  let num;
  ctx.font = radius*0.15 + "px arial";
  ctx.textBaseline="middle";
  ctx.textAlign="center";

  for(num = 1; num <= 12; num++){
    ang = num * Math.PI / 6;
    ctx.rotate(ang);
    ctx.translate(0, -radius*0.85);
    let rotateAng = Math.floor(Math.random() * 31) * Math.PI / 180;
    ctx.rotate(rotateAng);
    ctx.fillText(num.toString(), 0, 0);
    ctx.rotate(-rotateAng);
    ctx.rotate(-ang);
    ctx.translate(0, radius*0.85);
  }
}

function drawTime(ctx, radius){
  let 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, "#F50057");

  minute = (minute*Math.PI/30)+(second*Math.PI/(30*60));
  drawHand(ctx, minute, radius*0.8, radius*0.07, "#05668D");

  second = (second*Math.PI/30);
  drawHand(ctx, second, radius*0.9, radius*0.02, "#DCF763");
}

function drawHand(ctx, pos, length, width, color) {
  ctx.beginPath();
  ctx.lineWidth = width;
  ctx.lineCap = "round";
  ctx.strokeStyle = color;
  ctx.moveTo(0, 0);
  ctx.rotate(pos);
  ctx.lineTo(0, -length);
  ctx.stroke();
  ctx.rotate(-pos);
}

这里,我们添加了随机角度rotateAng,使每秒钟时钟的数字都随机旋转。

而时针、分针、秒针都做的颜色不同,并且表盘是渐变色。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript+HTML5 canvas绘制时钟功能示例 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 十个不为人知的Photoshop文本排版工具详解

    十个不为人知的Photoshop文本排版工具详解 1. 风格预设 在Photoshop中,可以通过风格预设(Style Presets)轻松快捷地为文本添加独特的样式。选择一个文本层,点击“图层样式”(Layer Style)按钮,在弹出的面板中选择“风格预设”(Style Presets),从中选择一个你喜欢的样式即可。 2. 字母间距/字符间距 字母(字…

    css 2023年6月9日
    00
  • Mootools 图片展示插件(lightbox,ImageMenu)收集集合

    Mootools 是一个功能强大的 JavaScript 框架,提供了丰富的 UI 组件,其中包括图片展示插件。在本文中,我们将为大家分享两种 Mootools 图片展示插件:lightbox 和 ImageMenu,并提供完整的攻略。 1. Lightbox Lightbox 是一款非常流行的基于 Mootools 的图片展示插件,它可以在当前页面内展示大…

    css 2023年6月10日
    00
  • 利用label标签和CSS美化文件上传表单(不兼容IE6)

    下面我将详细讲解“利用label标签和CSS美化文件上传表单(不兼容IE6)”的完整攻略: HTML部分 首先,我们需要在HTML中定义一个文件上传表单,并使用label标签包裹住文件上传按钮。 示例代码: <form> <label for="file-upload" class="custom-file-u…

    css 2023年6月11日
    00
  • CSS border边框一半或者部分可见的实现代码

    要实现CSS border边框的一半或部分可见,可以通过以下的步骤: 首先,需要给元素设置一个固定的宽度和高度,以便能够指定边框的部分可见位置。 .element { width: 100px; height: 100px; } 然后,将边框的偏移量设置为负值,将边框向内部移动,从而只让一部分边框可见。例如,如果要让一个矩形框左边框一半可见,可以使用下面的代…

    css 2023年6月10日
    00
  • 以淘宝前端为例剖析HTML5与移动端页面的性能优化

    以淘宝前端为例剖析HTML5与移动端页面的性能优化 1. HTML5的语义化结构 在HTML5中,我们可以使用语义化标签来描述页面的结构。这些标签不仅可以使代码更加清晰易懂,还能提高搜索引擎的识别能力,从而提高网站的SEO排名。在淘宝前端中,大量使用了语义化标签,例如:header、nav、section、aside等。这些标签不仅有利于搜索引擎优化,还能提…

    css 2023年6月11日
    00
  • Spring Boot实现文件上传下载

    来讲解一下“Spring Boot实现文件上传下载”的完整攻略。这里将分为以下步骤: 添加依赖 创建上传文件的控制器 创建下载文件的控制器 1. 添加依赖 首先,在我们的Spring Boot项目中添加依赖。这里我们需要添加的依赖是Spring Boot Web和Apache Commons Fileupload,后者是用来支持文件上传的。在Maven项目中…

    css 2023年6月10日
    00
  • 网站导致浏览器崩溃的原因总结(多款浏览器) 推荐

    网站导致浏览器崩溃的原因总结 背景 在日常浏览网页的时候可能会遇到浏览器崩溃的情况,这种情况可能是由于访问的网站存在一些问题,导致浏览器在处理网页时崩溃。本文总结了一些导致浏览器崩溃的原因,并提供了一些解决方案。 原因 1. JavaScript代码错误 JavaScript 代码错误可能是导致浏览器崩溃的主要原因之一。例如,在编写 JavaScript 代…

    css 2023年6月9日
    00
  • HTML5响应式(自适应)网页设计的实现

    实现HTML5响应式(自适应)网页设计的步骤如下: 第一步:理解响应式设计的概念 响应式设计是通过使用不同的技术,使网站的布局和内容适应不同的设备(如电脑、平板电脑和手机)的屏幕大小和分辨率,从而提供更好的用户体验。 第二步:使用流式网格进行布局 流式网格是响应式设计的一个关键部分,它允许网页的内容随着浏览器窗口大小而自适应。在HTML5中,可以使用CSS3…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部