js实现简单圆盘时钟

yizhihongxing

下面让我来详细讲解一下如何用JavaScript实现一个简单的圆盘时钟。

一、准备工作

在实现之前,首先需要准备一些基础的知识和文件:

  • 了解HTML5、CSS3和JavaScript基础知识;
  • 引入jQuery库,在代码中使用jQuery封装好的方法来实现;
  • 创建一个HTML文件,命名为index.html,并在其中添加一个canvas元素,用于绘制时钟。
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS时钟</title>
  <style>
    canvas {
      background-color: #fff;
    }
  </style>
</head>
<body>
  <canvas id="clock" width="200" height="200"></canvas>
  <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
  <script src="clock.js"></script>
</body>
</html>

二、绘制时钟

创建一个clock.js文件,用于绘制时钟。在文件中我们需要写一些函数来绘制时钟。

2.1 绘制圆形

首先,我们需要可以绘制一个圆形的函数。

function drawCircle(ctx, x, y, radius) {
  ctx.beginPath();
  ctx.arc(x, y, radius, 0, 2 * Math.PI, true);
  ctx.closePath();
  ctx.fill();
}

函数drawCircle接受四个参数,分别是画布上下文、圆心的横坐标、纵坐标和半径。调用该函数,即可绘制一个圆形。

2.2 绘制时钟刻度

然后,我们想要在圆盘上绘制一些刻度。我们可以使用循环语句来实现。

function drawClockDial(ctx, x, y, radius) {
  for (var i = 1; i <= 12; i++) {
    var angle = i * Math.PI / 6;
    ctx.save();
    ctx.translate(x, y);
    ctx.rotate(angle);
    ctx.beginPath();
    ctx.moveTo(0, -radius);
    ctx.lineTo(0, -radius + 15);
    ctx.stroke();
    ctx.restore();
  }
}

函数drawClockDial接受四个参数,分别为画布上下文、圆心的横坐标、纵坐标和半径。函数内部使用循环语句来从1到12绘制12个刻度,每个刻度占用圆周的30度。使用Math.PI和数学函数来计算每个刻度的角度。在绘制每个刻度之前,我们需要使用ctx.save函数保存当前状态,使用ctx.restore函数回复上一个状态,以避免绘制下一个刻度时位置偏移。

2.3 绘制时针、分针和秒针

现在我们已经准备好了绘制时针、分针和秒针的函数。

function drawHands(ctx, x, y, radius, hours, minutes, seconds) {
  // 时针
  var hourAngle = (hours % 12) * Math.PI / 6 + minutes * Math.PI / 360 + seconds * Math.PI / 21600;
  drawLine(ctx, x, y, radius - 40, hourAngle, 8);

  // 分针
  var minuteAngle = minutes * Math.PI / 30 + seconds * Math.PI / 1800;
  drawLine(ctx, x, y, radius - 20, minuteAngle, 4);

  // 秒针
  var secondAngle = seconds * Math.PI / 30;
  drawLine(ctx, x, y, radius - 10, secondAngle, 1);
}

该函数接受七个参数,分别为画布上下文、圆心的横坐标、纵坐标、半径、时针、分针和秒针。函数内部使用三个辅助函数:drawLine绘制线条、drawCircle绘制圆形和toRad将角度转化为弧度。

function drawLine(ctx, x, y, length, angle, lineWidth) {
  ctx.save();
  ctx.translate(x, y);
  ctx.rotate(angle);
  ctx.lineWidth = lineWidth;
  ctx.beginPath();
  ctx.moveTo(0, 0);
  ctx.lineTo(0, -length);
  ctx.stroke();
  ctx.restore();
}

function toRad(degrees) {
  return degrees * Math.PI / 180;
}

三、完整代码演示

下面是完整的代码示例:

$(function() {
  var canvas = document.getElementById('clock');
  var ctx = canvas.getContext('2d');

  // 绘制时钟圆形
  drawCircle(ctx, 100, 100, 90);

  // 绘制时钟刻度
  drawClockDial(ctx, 100, 100, 75);

  // 绘制时针、分针和秒针
  setInterval(function() {
    var now = new Date();
    var hours = now.getHours();
    var minutes = now.getMinutes();
    var seconds = now.getSeconds();
    drawHands(ctx, 100, 100, 90, hours, minutes, seconds);
  }, 1000);

  // 绘制圆形
  function drawCircle(ctx, x, y, radius) {
    ctx.beginPath();
    ctx.arc(x, y, radius, 0, 2 * Math.PI, true);
    ctx.closePath();
    ctx.fill();
  }

  // 绘制时钟刻度
  function drawClockDial(ctx, x, y, radius) {
    for (var i = 1; i <= 12; i++) {
      var angle = i * Math.PI / 6;
      ctx.save();
      ctx.translate(x, y);
      ctx.rotate(angle);
      ctx.beginPath();
      ctx.moveTo(0, -radius);
      ctx.lineTo(0, -radius + 15);
      ctx.stroke();
      ctx.restore();
    }
  }

  // 绘制线条
  function drawLine(ctx, x, y, length, angle, lineWidth) {
    ctx.save();
    ctx.translate(x, y);
    ctx.rotate(angle);
    ctx.lineWidth = lineWidth;
    ctx.beginPath();
    ctx.moveTo(0, 0);
    ctx.lineTo(0, -length);
    ctx.stroke();
    ctx.restore();
  }

  // 绘制时针、分针和秒针
  function drawHands(ctx, x, y, radius, hours, minutes, seconds) {
    // 时针
    var hourAngle = (hours % 12) * Math.PI / 6 + minutes * Math.PI / 360 + seconds * Math.PI / 21600;
    drawLine(ctx, x, y, radius - 40, hourAngle, 8);

    // 分针
    var minuteAngle = minutes * Math.PI / 30 + seconds * Math.PI / 1800;
    drawLine(ctx, x, y, radius - 20, minuteAngle, 4);

    // 秒针
    var secondAngle = seconds * Math.PI / 30;
    drawLine(ctx, x, y, radius - 10, secondAngle, 1);
  }

  // 角度转弧度
  function toRad(degrees) {
    return degrees * Math.PI / 180;
  }
});

运行以上代码,你就可以在页面上看到一个简单的圆盘时钟。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现简单圆盘时钟 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JavaScript中的this指向问题详解

    JavaScript中的this指向问题详解 1. this的概念 在JavaScript中,每个函数都有自己的上下文环境,而this关键字就是指向这个上下文环境,表示当前函数的执行环境。 2. this的指向 全局环境下,this指向全局对象(浏览器中为window对象)。 函数内部,this指向调用该函数的对象,如果没有上下文对象,则为window对象。…

    JavaScript 2023年6月10日
    00
  • JS对象数组中如何匹配某个属性值

    针对这个问题,我们可以分为以下几个步骤进行说明: 定义一个JS对象数组; 遍历数组,检查所有对象是否包含指定的属性值; 如果找到指定的对象,就返回该对象;如果没有找到,就返回 undefined。 下面是具体的代码实现和示例: 定义 JS 对象数组 首先我们需要定义一个包含一组 JS 对象的数组,如下所示: let students = [ { id: 1,…

    JavaScript 2023年6月10日
    00
  • 使用webstorm进行javascript的Debug调试功能

    以下是详细讲解使用WebStorm进行JavaScript Debug调试功能的完整攻略: 约定 在本攻略中,我们使用WebStorm Version 2020.3.2,并假设你已经安装和配置好了WebStorm IDE。同时,我们使用以下的JavaScript代码示例: function sum(a, b) { return a + b; } consol…

    JavaScript 2023年6月11日
    00
  • 详解es6新增数组方法简便了哪些操作

    下面是详解ES6新增数组方法简便了哪些操作的完整攻略: ES6新增数组方法 ES6为数组提供了一系列的新方法,这些方法使得我们可以更加简便的操作数组。下面是ES6中新增的数组方法: Array.from():将类数组对象或可迭代对象转换成数组。 Array.of():创建一个包含任意数量参数的新数组。 Array.copyWithin():复制数组的一部分到…

    JavaScript 2023年6月1日
    00
  • 当json键为数字时的取值方法解析

    当JSON的键为数字时,我们可以使用以下三种方式来取值: 方式一:使用点号加双引号,将数字键转换成字符串来访问。 例如,在下面的JSON数据中,键名为数字1和2: { "1": "Apple", "2": "Banana" } 我们可以通过以下方式访问它们: – Apple可以这…

    JavaScript 2023年5月27日
    00
  • js图片延迟加载的实现方法及思路

    什么是图片延迟加载? 图片延迟加载是一种优化网页性能的技术,又称为“图片懒加载”。在传统的页面加载中,页面中的图片是同步加载的,也就是在页面加载过程中,所有的图片都会被下载并渲染。然而,在某些时候,页面的某些图片并不是必要的,或者在用户刚打开页面时不可见,此时就会浪费用户的流量和时间。 图片延迟加载,是指在页面滚动到某个位置或者某个时间点再去加载图片。当用户…

    JavaScript 2023年6月11日
    00
  • JS 页面内容搜索,类似于 Ctrl+F功能的实现代码

    实现类似于 Ctrl+F 功能的 JS 页面内容搜索,需要基于两个核心 API:window.find() 和 window.getSelection()。 window.find() window.find() 方法用于在当前页面中查找指定的字符串,并返回一个布尔值表示是否检索到该字符串。该方法可以接收三个参数,依次为: 要查找的字符串 是否区分大小写(可…

    JavaScript 2023年5月19日
    00
  • JavaScript中的设计模式 单例模式

    JavaScript设计模式之单例模式 什么是单例模式 单例模式是一种常用的软件设计模式,用于保证系统中一个类只有一个实例,避免多个实例造成的资源浪费,同时也能够方便对该实例的控制和管理。 在JavaScript中,单例模式通常是通过对象字面量或者构造函数来实现的。 示例1:对象字面量实现单例模式 var Singleton = { obj: null, g…

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