canvas绘制时钟

news2024/9/22 17:26:03

这篇文章用于介绍html5的新标签,<canvas></canvas>

Canvas介绍

canvasHTML5新增的元素,通过javascript脚本绘制图形。那么canvas可以用来干啥呢?

  • 制作web网页游戏
  • 数据可视化;即:echarts就是基于canvas进行绘制
  • 广告banner的动态效果,视频的弹幕效果
  • canvas还可以用来内嵌一些网页
  • 手写签名
  • 等…

点击进入查看canvas的系列学习

在这里我添加了一个时钟的绘制,呈现的效果如下:
在这里插入图片描述
这里采用的是俩个canvas的形式进行圆刻度表与指针分开的绘制;
实现代码的html的代码如下:

 <style>
   * {
       margin: 0;
       padding: 0;
   }
   h1 {
       line-height: 100px;
   }
   .clock_box {
       position: relative;
       z-index: 0;
       width: 600px;
       height: 600px;
       margin: 100px auto;
       border: 2px solid gray;
       text-align: center;
       border-radius: 10px;
   }
   #canva_cicle {
       position: absolute;
       z-index: -1;
   }
</style>
<div class="clock_box">
   <h1>canvas绘制时钟</h1>
   <canvas id="canva_cicle" width="500" height="500"></canvas>
   <canvas id="canva_line" width="500" height="500"></canvas>
</div>

javascript的方式如下:

<script type="module">
   const canvasCicle = document.getElementById('canva_cicle');
   const cicleCtx = canvasCicle.getContext('2d');
   const canvasLine = document.getElementById('canva_line');
   const lineCtx = canvasLine.getContext('2d');

   // 绘制表盘
   renderClockCicle();
   function renderClockCicle () {
       cicleCtx.save(); // 进行当前translate中心轴偏移的存储
       cicleCtx.translate(250, 250); // 当前绘制的中心到(300, 300)的坐标轴中

       cicleCtx.beginPath();
       cicleCtx.arc(0, 0, 200, 0, 2*Math.PI, false);
       cicleCtx.strokeStyle = "darkgray";
       cicleCtx.lineWidth = 10;
       cicleCtx.stroke();
       cicleCtx.closePath();

       for(let i = 0; i < 60; i++) {
           cicleCtx.rotate(Math.PI / 30); // 旋转表盘进行绘制刻度
           cicleCtx.beginPath();
           cicleCtx.moveTo(180, 0);
           cicleCtx.lineTo(190, 0); // 圆的半径是0
           cicleCtx.lineWidth = 2;
           cicleCtx.strokeStyle = "pink";
           cicleCtx.stroke();
       }
       // 绘制时钟的刻度
       for(let i = 0; i < 12; i++) {
           cicleCtx.rotate(Math.PI / 6); // 旋转表盘进行绘制刻度
           cicleCtx.beginPath();
           cicleCtx.moveTo(180, 0);
           cicleCtx.lineTo(200, 0); // 圆的半径是0
           cicleCtx.lineWidth = 10;
           cicleCtx.lineCap = 'round';
           cicleCtx.strokeStyle = "darkgray";
           cicleCtx.stroke();
       }
   }
   
   // 每隔一秒钟进行绘制
   setInterval(() => {
       renderClockLine();

   }, 1000);
   // 渲染时针
   function renderClockLine() {
       lineCtx.clearRect(0, 0, 500, 500);
       lineCtx.save(); // 进行当前translate中心轴偏移的存储
       lineCtx.translate(250, 250); // 当前绘制的中心到(300, 300)的坐标轴中
       lineCtx.rotate(-2 * Math.PI / 4); // 将表盘逆时针的选择回轴刻度是90度

       const time = new Date();
       let hoursNum = time.getHours();
       const minNum = time.getMinutes();
       const secNum = time.getSeconds();
       hoursNum = hoursNum > 12 ? (hoursNum - 12) : hoursNum;
       // console.log(hoursNum, minNum, secNum);
       lineCtx.save();
       // 绘制秒针的旋转
       lineCtx.beginPath();
       lineCtx.rotate(2 * Math.PI / 60 * secNum);
       lineCtx.moveTo(-30, 0); // 线条的开始
       lineCtx.lineTo(170, 0); // 绘制的结束
       lineCtx.lineWidth = 2;
       lineCtx.strokeStyle = 'red';
       lineCtx.stroke();
       lineCtx.closePath();

       // 进行恢复再保留的形式
       lineCtx.restore();
       lineCtx.save();

       // 绘制分针
       lineCtx.beginPath();
       lineCtx.rotate(2 * Math.PI / 60 * minNum + 2 * Math.PI / 3600 * secNum);
       lineCtx.moveTo(-20, 0);
       lineCtx.lineTo(150, 0);
       lineCtx.lineWidth = 2;
       lineCtx.strokeStyle = 'drakblue';
       lineCtx.stroke();
       lineCtx.closePath();

       // 进行恢复再保留的形式
       lineCtx.restore();
       lineCtx.save();

       // 绘制时针
       lineCtx.beginPath();
       lineCtx.rotate(2 * Math.PI / 12 * hoursNum + 2 * Math.PI / 60 / 12 * hoursNum + 2 * Math.PI / 12 / 60 /60);
       lineCtx.moveTo(-10, 0);
       lineCtx.lineTo(100, 0);
       lineCtx.lineWidth = 6;
       lineCtx.strokeStyle = 'drak';
       lineCtx.stroke();
       lineCtx.closePath();

       // 绘制指针的固定圆
       lineCtx.arc(0, 0, 10, 0, 2 * Math.PI);
       lineCtx.fillStyle = "darkgray";
       lineCtx.fill();
       lineCtx.closePath();

       // 进行将位置清除回归
       lineCtx.restore();
       lineCtx.restore();
   }
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ajax 学习记录

ajax 学习记录ecplise 下载安装创建项目创建ajax后台请求处理类新建包创建servletAjaxServlet 内容web.xml新建index.htmlindex.html内容运行ecplise 下载安装 ecplise 21.06 Eclipse IDE for Enterprise Java and Web Developers 下载 下载完直接解压运行 创建项目 先下载…

基于最小二乘支持向量机(LS-SVM)进行分类、函数估计、时间序列预测和无监督学习附Matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法…

线性回归(机器学习)

用神经网络的思维来看待线性回归 单层的神经网络&#xff0c;其实就是一个神经元&#xff0c;可以完成一些线性的工作&#xff0c;比如拟合一条直线&#xff0c;这用一个神经元就可以实现。 当变量多于一个时&#xff0c;两个变量的量和数值有可能差别很大&#xff0c;这种情况…

MicroApp的Vite项目,特别全面

目录 前言 简介 分离 修改基座 子应用修改 修改vite.config.js​编辑 修改index.html 基座修改 处理子应用静态资源 效果 基座与子应用传值 在基座的MicroApp的index页面修改 在子应用的App.tsx文件进行useEffect的监听 效果​编辑 去掉菜单栏头部 效果​编辑 …

SpringBoot面试

0. Spring Boot 原理 Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Spring Boot 致力…

D. Bandit in a City(DFS + 叶子节点数目)

Problem - 1436D - Codeforces 输出标准输出 城市里出现了强盗! 他们中的一个正试图尽可能多地抓捕市民。 这个城市由n个广场组成&#xff0c;由n-1条道路连接&#xff0c;从任何其他广场都可以到达任何广场。1号广场是主广场。 星期天散步后&#xff0c;所有的道路都改为单行…

uni-app —— 小程序登录功能的相关实现

文章目录 前言一、示例图二、静态页面的搭建 1.登录页面的静态页面css样式设置2.我的页面的静态页面css样式设置三、登录页面的实现逻辑 1.进行表单验证的组件2.验证登录成功的思路3.具体代码实现一、示例图 二、静态页面的搭建 实现思路&#xff1a; 主要需要实现的功能点&am…

企业为什么做不好生产计划?

生产计划是企业对生产任务作出统筹安排&#xff0c;具体拟定生产产品的品种、数量、质量和进度的计划。是企业经营计划的重要组成部分&#xff0c;是企业进行生产管理的重要依据。既是实现企业经营目标的重要手段&#xff0c;也是组织和指导企业生产活动有计划进行的依据。企业…

【微服务】SpringCloud微服务注册源码解析

目录 一、前言 1、简述 2、SpringCloudCommons 项目 二、客户端服务注册 1、流程图 2、入口 2.1、客户端注册引入依赖 3、EurekaServiceRegistry服务注册机 3.1、EurekaServiceRegistry注册逻辑 4、ApplicationInfoManager 4.1、setInstanceStatus(InstanceStatus s…

【区块链技术与应用】(七)

资料来源 https://pkg.go.dev/github.com/hyperledger/fabric-sdk-go#section-readme https://github.com/hyperledger/fabric-sdk-go https://wiki.hyperledger.org/display/fabric https://github.com/hyperledger/fabric-samples 书接上回&#xff0c;补充getway链码分析 上…

maven assembly打包生成Java应用启动脚本bat和sh

1. maven插件介绍 springboot应用通过maven插件appassembler-maven-plugi生成启动脚本bat和sh。根据官网介绍&#xff0c;这个插件主要用于生成启动 java应用程序的脚本&#xff0c;能将项目依赖jar能够打包目录中&#xff0c;并且它们加入启动脚本类路径中。 主要命令 appas…

springboot瑞吉外卖

创建数据库,项目初始化静态资源不在static目录下&#xff0c;如何映射结果类登录过滤器拦截路径全局异常处理器分页查询消息转换器修改禁用分页编辑公共字段自动填充使用ThreadLocal新增用户绑定的数据不可删除上传下载前端传递的数据&#xff0c;不在同一张表时&#xff0c;DT…

java设计模式之策略模式

一&#xff1a;策略模式 1.什么是策略模式? 模板方法模式是一种行为设计模式&#xff0c; 它在超类中定义了一个算法的框架&#xff0c; 允许子类在不修改结构的情况下重写算法的特定步骤。 策略模式的基本介绍 1.策略模式&#xff08;Strategy Pattern&#xff09;中&#x…

【MQ基本概念 MQ的工作原理】

一、MQ基本概念 1、MQ概述 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存 消息的容器。多用于分布式系统之间进 行通信。 小结 MQ&#xff0c;消息 队列&#xff0c;存储消息的中间件 分布式系统通信两种方式&#xff1a;直接远程…

2022年数维杯D题 极端天气问题思路指导

D题损失评估与应对策略的研究三重拉尼娜事件下的极端气候灾害 很明显D题是一个数据收集➕数据处理类型题目&#xff0c;这与美赛中的E题题型相似。该题所涉及的极端天气与2021年小美赛极端天气题目高度相似。因此&#xff0c;我们首先对大家整理了去年小美赛极端天气的相关论文…

Kubeadm搭建kubernetes集群

Kubeadm搭建kubernetes集群 环境说明 | 角色 | ip | 操作系统 |组件 | | – | – | – | | master | 192.168.226.10 |centos8 | docker&#xff0c;kubectl&#xff0c;kubeadm&#xff0c;kubelet | | node1 | 192.168.226.20 |centos8 |docker&#xff0c;kubectl&#xff…

登陆拦截案例

登陆拦截案例 登陆拦截器小案例&#xff0c;判断登陆的用户名及密码是否正确&#xff1b;&#xff1a; 1.创建一个maven项目&#xff0c;导入相关的坐标&#xff1a; <dependencies><dependency><groupId>org.springframework</groupId><artifact…

【Hack The Box】windows练习-- Blackfield

HTB 学习笔记 【Hack The Box】windows练习-- Blackfield &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &…

[Games 101] Lecture 10 Geometry 1 (Introduction)

Geometry 1 (Introduction) Ways to Represent Geometry 隐式 (Implicit) 几何 只告诉点满足某种约束或关系&#xff0c;并不给出实际的点&#xff0c;也就是说&#xff0c;定义 f(x,y,z)0f(x,y,z) 0 f(x,y,z)0 例如&#xff0c;定义三维空间中的点&#xff0c;满足&#…

上海亚商投顾:信创概念掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪指数早盘低开低走&#xff0c;沪指一度跌超1%&#xff0c;失守3100点关口&#xff0c;创业板指盘中跌逾2%&#xff…