Canvas时钟

canvas画时钟 canvas画时钟 今天我们来学习学习如何使用canvas画时钟 首先我们得了解一下canvas是什么,怎么使用它: Canvas 中文名称叫“画布”,通过 JavaScript 来绘制 2D 图形,是 HTML 5 中新增的元素。 它最大得特点就是绘制它需要使用脚本绘制。canvas拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。 首先在html5中添加canvas元素,规定元素的id ,width,和height,这次的高度和宽度我习惯用js书写。 <canvas id="canvas"& 阅读详情

H5 Canvas 时钟

先贴上代码

<canvas id="canvas" width="500" height="500"></canvas>


    var canvas = document.getElementById('canvas')
        var ctx = canvas.getContext('2d');
        var num = [6, 5, 4, 3, 2, 1, 12, 11, 10, 9, 8, 7];

    function watch() {

        //时分秒针时间设置
        /*
        * -90让指针的开始方向从竖直方向开始,即从12点开始
        * new Data().getSeconds()/60*6,/60将秒转换成分,表盘一圈360度,每一分钟有6度,*6计算出秒针转动多少秒,分针对应需要转动多少度
        * new Data().getMinutes()/60*30
        * */
        var indicator=new Date();
        var ns=indicator.getSeconds()/60*360-90;
        var nm=indicator.getMinutes()/60*360-90+(indicator.getSeconds()/60*6);
        var nh=indicator.getHours()/12*360-90+(indicator.getMinutes()/60*30);

        //表盘内方块区域时间设置
        var date=new Date();
        var Year=date.getFullYear();
        var Month=date.getMonth()+1;
        var DateTime=date.getDate();
        var Day=date.getDay();
        var Hours=date.getHours();
        var Minutes=date.getMinutes();
        var Seconds=date.getSeconds();
        var weekDay,time;
        switch (Day){
            case 0:
                weekDay='星期日';
                break;
            case 1:
                weekDay='星期一';
                break;
            case 2:
                weekDay='星期二';
                break;
            case 3:
                weekDay='星期三';
                break;
            case 4:
                weekDay='星期四';
                break;
            case 5:
                weekDay='星期五';
                break;
            case 6:
                weekDay='星期六';
                break;
        }
        if (Hours > 0 && Hours <= 6) time = "凌晨";
        if (Hours > 6 && Hours <= 9) time = "早上";
        if (Hours > 9 && Hours <= 24) time = "上午";
        if (Hours > 24 && Hours <= 14) time = "中午";
        if (Hours > 14 && Hours <= 18) time = "下午";
        if (Hours > 18 && Hours <= 24) time = "晚上";

        ctx.clearRect(0, 0, canvas.width, canvas.height);

        //外圆阴影
        ctx.beginPath();
        var shdow = ctx.createRadialGradient(250, 250, 96, 250, 250, 250);
        shdow.addColorStop(0.1, 'rgba(74, 94, 157, 0.8)');
        shdow.addColorStop(0.9, '#16171B');
        ctx.fillStyle = shdow;
        ctx.arc(250, 250, 250, 0, 2 * Math.PI, false);
        ctx.fill();
        ctx.closePath();

        //蓝色边框
        ctx.beginPath();
        ctx.arc(250, 250, 200, 0, 2 * Math.PI);
        ctx.fillStyle = '#09c';
        ctx.fill();
        ctx.closePath();

        //仪表盘
        ctx.beginPath();
        var gradient = ctx.createRadialGradient(250, 250, 80, 250, 250, 250);
        gradient.addColorStop(0, '#111');
        gradient.addColorStop(1, '#222');
        ctx.fillStyle = gradient;
        ctx.arc(250, 250, 196, 0, 2 * Math.PI);
        ctx.fill();
        ctx.closePath();

        //时间点
        for (var i = 0; i < 12; i++) {
            var lt = i * 30;
            var x = Math.ceil(250 + 168 * Math.sin((Math.PI / 180) * lt));
            var y = Math.ceil(250 + 168 * Math.cos((Math.PI / 180) * lt));
            ctx.beginPath();
            if (i == 3 || i == 6 || i == 9 || i == 12) {
                ctx.font = 'italic 30px Arial';
                ctx.fillStyle = "#FFF";
            } else {
                ctx.font = 'italic 22px Arial';
                ctx.fillStyle = '#ddd';
            }
            ctx.textAlign = 'center';
            ctx.textBaseline = 'middle';
            ctx.fillText(num[i], x, y);
            ctx.closePath();
        }

        //数字年月日
        ctx.beginPath();
        var linear = ctx.createLinearGradient(120, 235, 120, 265);
        linear.addColorStop(0, '#fff');
        linear.addColorStop(1, '#16171B');
        ctx.fillStyle = linear;
        ctx.fillRect(120, 235, 100, 30);
        ctx.closePath();
       //填充年月日
        ctx.beginPath();
        ctx.font='normal 18px Arial';
        ctx.textAlign='center';
        ctx.textBaseline='middle';
        ctx.fillStyle = '#000';
        ctx.fillText(Year+'-'+Month+'-'+DateTime,canvas.width/2-(50+30),canvas.height/2);
        ctx.closePath();

        //汉字日期
        ctx.beginPath();
        var linear2 = ctx.createLinearGradient(280, 235, 280, 265);
        linear2.addColorStop(0, '#fff');
        linear2.addColorStop(1, '#16171B');
        ctx.fillStyle = linear2;
        ctx.fillRect(280, 236, 100, 30);
        ctx.closePath();
        //填充日期
        //alert(Day);
        ctx.beginPath();
        ctx.font='normal 14px Microsoft YaHei';
        ctx.textAlign='center';
        ctx.textBaseline='middle';
        ctx.fillStyle = '#000';
        ctx.fillText(weekDay+'~'+time,canvas.width/2+(50+30),canvas.height/2);
        ctx.closePath();

        //数字时分秒
        ctx.beginPath();
        var linear3 = ctx.createLinearGradient(200, 320, 200, 350);
        linear3.addColorStop(0, '#fff');
        linear3.addColorStop(1, '#16171B');
        ctx.fillStyle = linear3;
        ctx.fillRect(200, 320, 100, 30);
        ctx.closePath();
        //填充时分秒
        ctx.beginPath();
        ctx.font='normal 18px Microsoft YaHei';
        ctx.textAlign='center';
        ctx.textBaseline='middle';
        ctx.fillStyle='#000'
        ctx.fillText(Hours+':'+Minutes+':'+Seconds,200+50,320+15);
        ctx.closePath();

        //人物标识
        ctx.save();
        ctx.beginPath();
        ctx.fillStyle='#fff';
        ctx.font='italic 24px Microsoft YaHe'
        ctx.textAlign='center';
        ctx.textBaseline='middle';
        ctx.fillText('TianTian',250,160);
        ctx.closePath();

        ctx.beginPath();
        ctx.translate(canvas.width / 2, canvas.height / 2); //旋转是以canvas的起点开始旋转的,所以需要改变旋转中心的坐标,使其在在圆的中间

        //刻度
        /*
        * 刻度和指针应该放在一块绘制,这里涉及到一个技巧性问题,绘制刻度的时候旋转是以canvas的起点开始旋转的,所以需要改变旋转中心的坐标,使其在在圆的中间,每次循环绘制完一个刻度时需要还原中心坐标点,使其在绘制下一个刻度点的时候中心仍然在圆中间,在绘制指针的时候也需要还原
        * */
        for (var s = 0; s < 60; s++) {
            ctx.save();
            ctx.fillStyle = "#ccc";
            ctx.rotate(((Math.PI * 2) / 60) * s);
            ctx.fillRect(188, -1, 6, 2);
            ctx.restore();
        }



        //指针
        //时针
        ctx.save();
        ctx.rotate(nh*Math.PI/180);
        ctx.fillStyle='#969';
        ctx.fillRect(0,-2,100 ,4);
        ctx.restore();
        //分针
        ctx.save();
        ctx.rotate(nm*Math.PI/180);
        ctx.fillStyle='rgba(74, 94, 157, 0.8)';
        ctx.fillRect(0,-1.5,120 ,3);
        ctx.restore();
        //秒针
        ctx.save();
        ctx.rotate(ns*Math.PI/180);
        ctx.fillStyle='#fff';
        ctx.fillRect(0,0,140 ,1);
        ctx.restore();
        ctx.closePath();
        //中心点

        ctx.restore();
        ctx.save();
        ctx.beginPath();
        var centerLinear=ctx.createLinearGradient(250,242,250,258);
        centerLinear.addColorStop(0.1,'rgba(200,200,200,1)');
        centerLinear.addColorStop(1,'rgba(80,80,80,1)');
        ctx.fillStyle=centerLinear;
        ctx.arc(250,250,8,0,2*Math.PI,false);
        ctx.fill();
        ctx.restore();
        ctx.closePath();
    }
    watch()
    setInterval(function () {
        watch();
    },1000);

在用canvas绘制这个时钟的时候有几个重难点和技巧性的地方下面来依次剖析

一、绘制时间点

时间点就是小时数由1-12组成,圆的一周有360度,故每两个时间点之间的夹角为30(360/12)度。手表是基于500*500的方形画布上绘制,要正确安放时间点就要知道每个时间点X,Y坐标。
这里用到三角函数数学知识Math.sin(弧度),Math.cos(弧度)。圆的一周是2π个弧度,360°,故 1°=2π/360°,因为是求时间点在整个方形画布上的坐标,所以应加上250。
这里写图片描述
var x = Math.ceil(250 + 168 * Math.sin((Math.PI / 180) * lt)),var y = Math.ceil(250 + 168 * Math.cos((Math.PI / 180) * lt))


    //var num = [6, 5, 4, 3, 2, 1, 12, 11, 10, 9, 8, 7];
    for (var i = 0; i < 12; i++) {
        var lt = i * 30;
        var x = Math.ceil(250 + 168 * Math.sin((Math.PI / 180) * lt));
        var y = Math.ceil(250 + 168 * Math.cos((Math.PI / 180) * lt));
        ctx.beginPath();
        if (i == 3 || i == 6 || i == 9 || i == 12) {
            ctx.font = 'italic 30px Arial';
            ctx.fillStyle = "#FFF";
        } else {
            ctx.font = 'italic 22px Arial';
            ctx.fillStyle = '#ddd';
        }
        ctx.textAlign = 'center';
        ctx.textBaseline = 'middle';
        ctx.fillText(num[i], x, y);
        ctx.closePath();
    }
二、绘制刻度点

仪表盘一圈应有60个刻度,应采用循环旋转绘制刻度的方法,500*500的方形画布的原点在左上角,需要将原点至于圆形的中心点才能循环旋转绘制一个完整的刻度
ctx.translate(canvas.width / 2, canvas.height / 2)
2π个弧度平均分成60份,每一份的弧度就是(Math.PI * 2) / 60


    ctx.translate(canvas.width / 2, canvas.height / 2); //旋转是以canvas的起点开始旋转的,所以需要改变旋转中心的坐标,使其在在圆的中间
    for (var s = 0; s < 60; s++) {
        ctx.save();
        ctx.fillStyle = "#ccc";
        ctx.rotate(((Math.PI * 2) / 60) * s);
        ctx.fillRect(188, -1, 6, 2);
        ctx.restore();
    }
三、绘制三个指针(时针、分针、秒针)和时钟中心点

刻度和指针应该放在一块绘制,且仪表中心圆点要在最后绘制,这样才能盖住三个指针的交叉点。这里涉及到一个技巧性问题,绘制刻度的时候旋转是以canvas的起点开始旋转的,所以需要改变旋转中心的坐标,使其在在圆的中间,每次循环绘制完一个刻度时需要还原中心坐标点,使其在绘制下一个刻度点的时候中心仍然在圆中间,在绘制指针的时候也需要还原。这里用到了canvas的save()方法和restore()方法

四、如何让时针、分针、秒针在正确的时间点在正确的位置

让三个指针在正确的位置这里是最关键的一点也是比较难以理解的一点。首先指针的转动需要用到canvas的rotate(弧度)方法,我们只需要知道对应的弧度即可。在绘制时间点的时候已知1°=2π/360,那么现在我们只需要知道每个指针需要转动的角度即可。
indicator.getSeconds()/60*360-901分有60秒,60秒刚好一周360°。-90让指针的开始位置在竖直方向12点刻度的位置
indicator.getMinutes()/60*360-901小时有60分,60分刚好一周360°。-90让指针的开始位置在竖直方向12点刻度的位置
ndicator.getHours()/12*360-90仪表盘一周有12个小时,12小时刚好一周360°。-90让指针的开始位置在竖直方向12点刻度的位置


    var ns=indicator.getSeconds()/60*360-90;
    var nm=indicator.getMinutes()/60*360-90;
    var nh=indicator.getHours()/12*360-90;

这里还存在一个问题:当时间为4:30:50(4点30分50秒),此时时针不应该正对着4这个刻度,而应该在4-5正中间,分针也不应该正对着6这个刻度,而应该在6-7之间靠近6。所以在这种情况下,分针转动的角度应该加上秒针转动的角度,时针转动的角度应该加上分针转动的角度


    var indicator=new Date();
    var ns=indicator.getSeconds()/60*360-90;
    var nm=indicator.getMinutes()/60*360-90+(indicator.getSeconds()/60*6);
    var nh=indicator.getHours()/12*360-90+(indicator.getMinutes()/60*30);

indicator.getSeconds()/60*61分有60秒,1秒的角度是6°(360°/60)
indicator.getMinutes()/60*301小时有60分,1小时的角度是30°(360°/12)

Canvas绘制一个时钟 Canvas绘制一个时钟 Canvas:一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素。它可以用来制作照片集或者制作简单(也不是那么简单)的动画,甚至可以进行实时视频处理和渲染。 博客地址:https://xiaofly.cn/post-details?id=627b9c9b5fcf765110cdcb6e 先上效果图: 先创建一个index.html,内容如下: <!-- index.html --> <!DOCTYPE html> <h 阅读详情

相关推荐

HTML5 Canvas时钟效果全解析

本文还有配套的精品资源,点击获取 简介:HTML5的Canvas元素提供了一个绘图区域,允许开发者利用JavaScript创建动态的2D图形。本课程设计项目演示了一个具体的时钟效果实现,其中涉及了表盘、时分秒针的绘制和数字时间显示。通过学习这个项目,学生可以深入理解Canvas的基本使用、绘图方法、时间与动画处理,以及如何优化性能和考虑浏览器兼容性。 1. Can...

weixin_42471823的博客 1297

【原创】时间轴组件 timeline-canvas

一个基于 vue 框架使用 canvas 绘制的时间轴组件,可用于视频、录像播放或实时数据展示等业务。

jqrrgmvtk的专栏 1万+

使用canvas写的时间轴插件,可以实现拖动、点击返回时间点、增加录像块、放大缩小等功能

分享一个使用canvas写的时间轴插件 这是一个使用canvas写的时间轴插件,可以实现拖动、点击返回时间点、增加录像块、放大缩小等功能 在我工作项目中用在了视频回放时间轴部分 项目开发刚好用到,找了很久终于合适

使用canvas编写时间轴插件

使用canvas编写时间轴插件 背景 项目中有一个视频广场的功能,需要一个时间轴类似视频播放中进度条功能一样显示录像情况,并且可以点击、拖动、放大缩小展示时间轴,获取到时间轴的某个时间。原来的时间轴是使用了timeslider 这个插件,原插件中是使用原生的js 绘制dom节点来显示时间轴,后面使用起来发现每一次重绘就要操作上百个dom节点,性能很差,所以决定采用canvas来重写时间轴。 效果如...

weixin_30733003的博客 1783

html 、canvas、 jquery 时间轴拖动效果

运用Canvas 依赖jquery 实现 时间轴拖动效果 应用场景:视频回放,定时定位播放时间等等。

timeline:使用 GWT 和 HTML5(纯 Canvas)制作的时间轴库

时间线 使用 GWT 和 HTML5 制作的时间轴库 特征: 整个小部件是一个画布。 一切都显示在里面 在 GWT 中实现 面向事件:触发事件 BrowseEvent(Date) 和 IntervalChange(Date, Date),因此可以使用更复杂的小部件进一步扩展 支持 timezoneJS 库。 开发人员可以指定库使用的时区。 您可以在阅读更多相关信息 鼠标浏览:拖放平移,鼠标滚轮缩放 行可以使用图标和标签进行自定义 时间块可定制颜色

使用canvas实现时间轴上滑块的各种常用操作(仅供参考)

使用canvas,模拟绘制时间轴区域,有时间刻度标尺,时间轴区域上会有多行,每行都有一个滑块。1、时间刻度标尺可以拖动,会自动对齐整数点秒数,最小步数为0.1秒。2、滑块可以自由拖动,当滑块处于选中状态时,左右两边会出现可拖动的按钮,用于拉伸宽度。3、滑块与滑块之间对齐时会出现对齐虚线,滑块与刻度标尺对齐时,刻度标尺会变色用于提醒用户此时已对齐。4、当滑块拉伸到最右侧区域时,右侧空间不足时,会自动增加右侧空间区域。

不怕麻烦的鹿丸的博客 1957

Html+JavaScript 在canvas上绘制带日期显示的时钟 (自己绘制刻度)

Html+JavaScript 在canvas上绘制带日期显示的时钟 (自己绘制刻度)。 想了解此框架以及程序结果图的,可以去博客看一看,再决定下载与否。

【Canvas】绘制时间轴+动态当前时间线

/一分钟的宽度,每十分钟一小格每六个小格一个大格。重要ctx赋值全局变量,以免传输中改变。//超过2030时间从2030开始显示。//计算出当前时间与830之间的差值。//绘制时间轴时间线。//绘制动态时间线。...

芳草萋萋鹦鹉洲哦 2737

html5公司官网发展时间轴动画特效.zip

html5鼠标移动特效,带logo的psd修改文件,可做官网、引导页、时间轴特效。

AXI4接口说明

ACLK:全局AXI接口时钟输入(建议与系统时钟保持一致)ARESET_n:全局AXI接口复位信号,低电平有效。PS:在HBM AXI接口应用中,此复位端口仅应在数据传输开始前使用。若在传输开始后使用,会导致AXI接口与内存控制器失步(out-of-sync)。当开关启用时,IP核会将所有ARESET_n引脚内部连接在一起——因为内存作为一个整体工作。

rhtul的博客 1522

Canvas圆形时钟

  今天带来一个圆形时钟,用JQ编写的Canvas 代码。Canvas 的神奇之处就在于,可以自行绘制图片不需要外部引入,当你深入了解这项技术的时候,你也会忍不住赞叹他的神奇之处。   虽然我一再强调,自学也是人生的一门必修课。但哪怕我接连几天不眠不休写出了 Canvas 教程,大家还是置若罔闻,要求我在代码中写下详细注释。从我的角度来讲:不写注释可以减少代码量,大批量的注释会显得十分冗余,我出的 Canvas 教程如果大家认真阅读、练习的话,读懂这些代码不成问题。就好像对着官方文档我可以手写JQuery

weixin_45820444的博客 4057

用ADS2023手把手仿真SKYWORKS SMA1234变容二极管:从Datasheet到S参数结果全流程

本文详细介绍了如何使用ADS2023仿真SKYWORKS SMA1234变容二极管的全流程,从Datasheet参数解析到S参数结果验证。通过等效电路建模、关键公式编写和仿真设置,帮助工程师掌握变容二极管在射频电路设计中的应用技巧,提升仿真精度和工程实践能力。

weixin_29233333的博客 502

【canvas 动态时钟】

画一个动态时钟,显示 当前时间 <!DOCTYPE html> <html> <body> <canvas id="canvas" width="350" height="350" style="border:1px solid"> Your browser does not support the canvas element. ...

Hey_Coder 387

电子结构设计(EMD)十年知识总结

客官,你的面相是做结构设计的奇才~1. 材料选择【一出手的0.1s就败了】2. 钣金件设计【折来折去有啥难】3. 塑胶件设计【看着好复杂】4. 型材件设计【凭啥不让我设计】5. 电子结构(PCBA)设计【静电肿么要我背锅】6. 包装设计【要的就是金玉其外,败絮其中】7. 外观(工业)设计【好不好看,谁说了算】8. 标签设计【】9. 标准件选择【一个螺丝难倒英雄汉/提起螺丝,英雄气短】10. 计算仿...

wfeng86的博客 1569

从Excel到Power Pivot:构建你的第一个商业智能分析模型

本文详细介绍了如何从Excel升级到Power Pivot,构建你的第一个商业智能分析模型。通过激活Power Pivot功能、导入数据、建立表关系、创建智能度量值以及打造交互式仪表盘,帮助用户高效处理百万行级别的数据,实现数据自动关联和动态分析,大幅提升商业决策效率。

weixin_30629653的博客 255

Canvas 画时钟

前言不管学习什么,不动手去做,永远不能熟练掌握。学习了 canvas API,会觉得只要按照直线、圆等画法去画,canvas 太简单了。可是,当你真正去画的时候,会遇到许多的问题。下面介绍的是 canvas 时钟,主要是与大家分享我的学习过程。 不懂 canvas 的同学,请先学习:Canvas 画布 一、相关几何知识钟面是一个圆,主要包含每个小时数字、以及刻度,它们的位置坐标应该如何计

destiny'Note 6174

用canvas制作一个时钟

我想熟悉一下canvas的使用,参考一个例子做了一个能动态展示当前时刻的canvas时钟。 先看效果: 实现思路: 使用canvas绘图第一步肯定是先获取canvas元素对象,并定义上下文。 var clock = document.getElementById("clock"); clock.style.backgroundColor = "black"; var graph = n...

实用的博客 3651

推荐一个直接用于项目开发的PID库!很好用,很稳定

关注、星标公众号,不错过精彩内容大家好,我是小麦。最近有朋友问到有没有现成的C语言PID库。当然有了!现在我就准备给大家安利一下了。一般同学会去某度上搜,看到各种各样版本的PID示例,或者...

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 9023

通过Langchain实现大模型完成测试用例生成的代码(可集成到各种测试平台)

代码中使用的是讯飞spark3.0版本,其中版本在的控制已经封装到了langchain对应的讯飞的iflytek的类中,可以在调用的时候显示控制,默认是spark2.0版本。

Criss@陈磊 2362

canvas时钟

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>canvas 时钟</title> <style> * { margin: 0; padding: 0; } .main { width: 1000px; ...

liu_xiaoru的博客 297

Vivado报错-4 [Routed 35-3424] SLL Assignment failed ILP VU19P

Vivado报错[Routed 35-3424] SLL Assignment failed ILP VU19P

weixin_39896700的博客 1408

canvas之时钟

在画时钟之前,我们先来聊一聊canvas动画。 驱动动画的方法有以下三种:那么我们制作canvas动画使用哪种更好呢?所以在制作canvas动画时,更推荐使用。制作canvas动画的步骤:那么就让我们看看时钟的动画制作吧: 效果如下:

时光清浅处,一步一安然 411

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

用 js canvas 做一个优雅的模拟时钟, canvas 教程实例

用 js canvas 做一个优雅的模拟时钟, canvas 教程实例有很多次,我都想找到一个比较不错的,可以查看模拟时钟的网页。 有时候是想看下距离某个时间点还有多长时间,有时候是想看一下,两个时间点之间的间隔是多少。因为模拟时钟的排布比数字时钟要更直观。 但一直没有找到。这些天闲的时候就想做个 canvas 模拟时钟玩...

cnzzs的博客 965

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: Range、Selection、TextRange对象的区别与关系
下一篇: Canvas save、restore方法
chentian888
博客等级 码龄11年 16粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值