JS+canvas绘制的动态机械表动画效果

发布时间 - 2026-01-11 03:13:10    点击率:

本文实例讲述了JS+canvas绘制的动态机械表动画效果。分享给大家供大家参考,具体如下:

先来看看运行效果:

完整实例代码:

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title>www. canvas时钟</title>
  <style>
    canvas {
      border: 1px solid red;
    }
  </style>
</head>
<body>
<canvas width="800" height="600"></canvas>
</body>
<script>
  function Clock(opt) {
    for (var key in opt) {
      this[key] = opt[key];
    }
    this.init();
  }
  Clock.prototype = {
    init: function () {
      var self = this;
      var ctx = this.ctx;
      this.timer = setInterval(function(){
        ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height);
        self.drawDial();
        self.drawDegreeScale();
        self.drawNumber();
        self.drawPointers();
      },1000);
    },
    drawDial: function () {
      var ctx = this.ctx;
      ctx.save();
      ctx.beginPath();
      ctx.lineWidth = this.clockDialW;
      ctx.strokeStyle = this.clockDialColor;
      ctx.arc(this.clockX, this.clockY, this.clockRadius, 0, 2 * Math.PI);
      ctx.stroke();
      ctx.restore();
    },
    drawDegreeScale: function () {
      var ctx = this.ctx;
      var clockRadius = this.clockRadius;
      var clockX = this.clockX;
      var clockY = this.clockY;
      var bigDegreeScaleL = this.bigDegreeScaleL;
      var smallDegreeScale = this.smallDegreeScale;
      var startX, startY, endX, endY, radian;
      ctx.save();
      for (var i = 0; i < 12; i++) {
        radian = i * Math.PI / 6;
        endX = clockX + clockRadius * Math.cos(radian);
        endY = clockY + clockRadius * Math.sin(radian);
        if (radian % (Math.PI / 2) == 0) {
          startX = clockX + (clockRadius - bigDegreeScaleL) * Math.cos(radian);
          startY = clockY + (clockRadius - bigDegreeScaleL) * Math.sin(radian);
          ctx.lineWidth = this.bigDCWidth;
        } else {
          startX = clockX + (clockRadius - smallDegreeScale) * Math.cos(radian);
          startY = clockY + (clockRadius - smallDegreeScale) * Math.sin(radian);
          ctx.lineWidth = this.smallDCWidth;
        }
        ctx.beginPath();
        ctx.moveTo(startX, startY);
        ctx.lineTo(endX, endY);
        ctx.stroke();
        ctx.restore();
      }
    },
    drawNumber: function () {
      var ctx = this.ctx;
      var textX, textY, textRadian;
      var clockX = this.clockX;
      var clockY = this.clockY;
      var clockRadius = this.clockRadius;
      ctx.font = '20px 微软雅黑';
      ctx.fillStyle = 'red';
      ctx.textAlign = 'center';
      ctx.textBaseline = 'middle';
      ctx.save();
      for (var i = 0; i < 12; i++) {
        textRadian = i * Math.PI / 6 - Math.PI/3;
        textX = clockX + (clockRadius - 40) * Math.cos(textRadian);
        textY = clockY + (clockRadius - 40) * Math.sin(textRadian);
        ctx.beginPath();
        ctx.fillText(i + 1, textX, textY);
      }
      ctx.restore();
    },
    drawPointers: function () {
      var date = new Date();
      var h = date.getHours();
      var m = date.getMinutes();
      var s = date.getSeconds();
      h = h % 12;
      var hRadian = 2 * Math.PI / 12 * h - Math.PI / 2;
      this.drawPoint(hRadian,30,'red',8);
      var mRadian = 2 * Math.PI / 60 * m - Math.PI / 2;
      this.drawPoint(mRadian,50,'blue',6);
      var sRadian = 2 * Math.PI / 60 * s - Math.PI / 2;
      this.drawPoint(sRadian,70,'green',2);
    },
    drawPoint: function (radian, length,color,lineWidth) {
      var x = this.clockX + Math.cos(radian) * length;
      var y = this.clockY + Math.sin(radian) * length;
      var ctx = this.ctx;
      ctx.save();
      ctx.beginPath();
      ctx.strokeStyle = color;
      ctx.lineWidth = lineWidth;
      ctx.moveTo(this.clockX,this.clockY);
      ctx.lineTo(x,y);
      ctx.stroke();
      ctx.restore();
    }
  };
</script>
<script>
  var canvas = document.querySelector('canvas');
  var ctx = canvas.getContext('2d');
  var clock = new Clock({
    ctx: this.ctx,
    clockRadius: 150,
    clockX: 300,
    clockY: 300,
    clockDialW: 6,
    clockDialColor: 'blue',
    bigDegreeScaleL: 20,
    bigDCWidth: 6,
    smallDegreeScale: 10,
    smallDCWidth: 4
  });
</script>
</html>

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript+HTML5特效与技巧汇总》、《JavaScript动画特效与技巧汇总》、《JavaScript图形绘制技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。


# JS  # canvas  # 绘制  # 动态  # 机械表  # 动画  # js canvas实现写字动画效果  # JS基于HTML5的canvas标签实现炫目的色相球动画效果实例  # javascript+HTML5的Canvas实现Lab单车动画效果  # js+canvas实现画板功能  # js+canvas实现刮刮奖功能  # js实现贪吃蛇游戏 canvas绘制地图  # 使用js和canvas实现时钟效果  # javascript使用canvas实现饼状图效果  # javascript canvas实现简易时钟例子  # JS Canvas接口和动画效果大全  # 相关内容  # 感兴趣  # 数据结构  # 微软  # 给大家  # 更多关于  # 所述  # 先来  # 程序设计  # 讲述了  # init  # key  # var  # timer  # ctx  # prototype  # opt  # height  # Clock  # function 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python自然语言搜索引擎项目教程_倒排索引查询优化案例  佛山企业网站制作公司有哪些,沟通100网上服务官网?  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  如何在阿里云ECS服务器部署织梦CMS网站?  如何在云主机上快速搭建多站点网站?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  如何快速搭建自助建站会员专属系统?  Laravel定时任务怎么设置_Laravel Crontab调度器配置  如何用VPS主机快速搭建个人网站?  香港服务器租用每月最低只需15元?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  如何在Windows环境下新建FTP站点并设置权限?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  在线教育网站制作平台,山西立德教育官网?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Laravel如何使用模型观察者?(Observer代码示例)  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  简历在线制作网站免费版,如何创建个人简历?  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何在建站之星绑定自定义域名?  javascript读取文本节点方法小结  如何为不同团队 ID 动态生成多个独立按钮  如何用免费手机建站系统零基础打造专业网站?  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  JavaScript如何实现倒计时_时间函数如何精确控制  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  bing浏览器学术搜索入口_bing学术文献检索地址  bootstrap日历插件datetimepicker使用方法  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  重庆市网站制作公司,重庆招聘网站哪个好?  如何确保FTP站点访问权限与数据传输安全?  原生JS获取元素集合的子元素宽度实例  Android 常见的图片加载框架详细介绍  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  非常酷的网站设计制作软件,酷培ai教育官方网站?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Laravel如何生成URL和重定向?(路由助手函数)  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Laravel如何使用Gate和Policy进行授权?(权限控制)  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音