javascript结合Canvas 实现简易的圆形时钟


Posted in Javascript onMarch 11, 2015

之前学习了下html5中的canvas元素,为了练练手就实现了一个简易的时钟。时钟本身并不复杂,也没有使用图片进行美化,不过麻雀虽小五脏俱全,下面就与大家分享一下:

演示效果:

javascript结合Canvas 实现简易的圆形时钟

html代码:

<!DOCTYPE html>

<html>

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title>Clock</title>

    <style type="text/css">

    *{

        margin: 0;

        padding: 0;

    }

    .canvas{

        margin-left: 20px;

        margin-top: 20px;

        border: solid 1px;

    }

    </style>

</head>

<body onload= "main()">

<canvas class = "canvas" id="canvasId" width = '500px' height = '400px'></canvas>

<script type= "text/javascript" src = "Clock.js"></script>

</body>

</html>

JS代码:

var Canvas = {};

Canvas.cxt = document.getElementById('canvasId').getContext('2d');

Canvas.Point = function(x, y){

    this.x = x;

    this.y = y;

};

/*擦除canvas上的所有图形*/

Canvas.clearCxt = function(){

    var me = this;

    var canvas = me.cxt.canvas;

       me.cxt.clearRect(0,0, canvas.offsetWidth, canvas.offsetHeight);

};

/*时钟*/

Canvas.Clock = function(){

    var me = Canvas,

        c = me.cxt,

        radius = 150, /*半径*/

        scale = 20, /*刻度长度*/

        minangle = (1/30)*Math.PI, /*一分钟的弧度*/

        hourangle = (1/6)*Math.PI, /*一小时的弧度*/

        hourHandLength = radius/2, /*时针长度*/

        minHandLength = radius/3*2, /*分针长度*/

        secHandLength = radius/10*9, /*秒针长度*/

        center = new me.Point(c.canvas.width/2, c.canvas.height/2); /*圆心*/

    /*绘制圆心(表盘中心)*/

    function drawCenter(){

        c.save();

        c.translate(center.x, center.y); 

        c.fillStyle = 'black';

        c.beginPath();

        c.arc(0, 0, radius/20, 0, 2*Math.PI);

        c.closePath();

        c.fill();

        c.stroke();

        c.restore();

    };

    /*通过坐标变换绘制表盘*/

    function drawBackGround(){

        c.save();

        c.translate(center.x, center.y); /*平移变换*/

        /*绘制刻度*/

        function drawScale(){

           c.moveTo(radius - scale, 0);

           c.lineTo(radius, 0); 

        };

        c.beginPath();

        c.arc(0, 0, radius, 0, 2*Math.PI, true);

        c.closePath();

        for (var i = 1; i <= 12; i++) {

           drawScale();

           c.rotate(hourangle); /*旋转变换*/

        };

        /*绘制时间(3,6,9,12)*/

        c.font = " bold 30px impack"

        c.fillText("3", 110, 10);

        c.fillText("6", -7, 120);

        c.fillText("9", -120, 10);

        c.fillText("12", -16, -100);

        c.stroke();

        c.restore();

    };

    /*绘制时针(h: 当前时(24小时制))*/

    this.drawHourHand = function(h){

        h = h === 0? 24: h;

        c.save();

        c.translate(center.x, center.y); 

        c.rotate(3/2*Math.PI);

        c.rotate(h*hourangle);

        c.beginPath();

        c.moveTo(0, 0);

        c.lineTo(hourHandLength, 0);

        c.stroke();

        c.restore();

    };

    /*绘制分针(m: 当前分)*/

    this.drawMinHand = function(m){

        m = m === 0? 60: m;

        c.save();

        c.translate(center.x, center.y); 

        c.rotate(3/2*Math.PI);

        c.rotate(m*minangle);

        c.beginPath();

        c.moveTo(0, 0);

        c.lineTo(minHandLength, 0);

        c.stroke();

        c.restore();

    };

    /*绘制秒针(s:当前秒)*/

    this.drawSecHand = function(s){

        s = s === 0? 60: s;

        c.save();

        c.translate(center.x, center.y); 

        c.rotate(3/2*Math.PI);

        c.rotate(s*minangle);

        c.beginPath();

        c.moveTo(0, 0);

        c.lineTo(secHandLength, 0);

        c.stroke();

        c.restore();

    };

    /*依据本机时间绘制时钟*/

    this.drawClock = function(){

        var me = this;

        function draw(){

           var date = new Date();

           Canvas.clearCxt();

           drawBackGround();

           drawCenter();

           me.drawHourHand(date.getHours() + date.getMinutes()/60);

           me.drawMinHand(date.getMinutes() + date.getSeconds()/60);

           me.drawSecHand(date.getSeconds());

        }

        draw();

        setInterval(draw, 1000);

    };  

};

 var main = function(){

    var clock = new Canvas.Clock();

    clock.drawClock();

};

代码中涉及到了一些简单的canvas元素API 大家度娘一下即可

以上就是本文的全部内容了,希望对大家学习canvas能够有所帮助。

Javascript 相关文章推荐
jquery.validate使用攻略 第一部
Jul 01 Javascript
table对象中的insertRow与deleteRow使用示例
Jan 26 Javascript
Javascript图片上传前的本地预览实例
Jun 16 Javascript
JS Ajax请求如何防止重复提交
Jun 13 Javascript
Bootstrap源码解读下拉菜单(4)
Dec 23 Javascript
深入理解vue中的$set
Jun 01 Javascript
JQuery 获取多个select标签option的text内容(实例)
Sep 07 jQuery
Angular2监听页面大小变化的解决方法
Oct 09 Javascript
JS引用传递与值传递的区别与用法分析
Jun 01 Javascript
浅谈webpack 构建性能优化策略小结
Jun 13 Javascript
Vuejs 实现简易 todoList 功能 与 组件实例代码
Sep 10 Javascript
详解vue引入子组件方法
Feb 12 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
Mar 11 #Javascript
javascript与css3动画结合使用小结
Mar 11 #Javascript
jquery实现textarea 高度自适应
Mar 11 #Javascript
jQuery简单实现禁用右键菜单
Mar 10 #Javascript
jQuery判断数组是否包含了指定的元素
Mar 10 #Javascript
js控制文本框只输入数字和小数点的方法
Mar 10 #Javascript
jQuery实现当前页面标签高亮显示的方法
Mar 10 #Javascript
You might like
一个oracle+PHP的查询的例子
2006/10/09 PHP
php函数的常用方法及注意之处小结
2011/07/10 PHP
php 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
解析PHP的session过期设置
2013/06/29 PHP
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
PHP实现将textarea的值根据回车换行拆分至数组
2015/06/10 PHP
jquery的颜色选择插件实例代码
2008/10/02 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
详解JavaScript跨域总结与解决办法
2016/10/31 Javascript
jQuery控制元素隐藏和显示
2017/03/03 Javascript
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
2018/08/08 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
在vs code 中如何创建一个自己的 Vue 模板代码
2020/11/10 Javascript
Python功能键的读取方法
2015/05/28 Python
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
Python中规范定义命名空间的一些建议
2016/06/04 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
python+numpy+matplotalib实现梯度下降法
2018/08/31 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
Python类和实例的属性机制原理详解
2020/03/21 Python
python包的导入方式总结
2021/03/02 Python
卡塔尔航空官方网站:Qatar Airways
2017/02/08 全球购物
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
公司年终奖分配方案
2014/06/16 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
2014年话务员工作总结
2014/11/19 职场文书
2014年绿化工作总结
2014/12/09 职场文书
浅谈Nginx 中的两种限流方式
2021/03/31 Servers
Python异常类型以及处理方法汇总
2021/06/05 Python