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 相关文章推荐
用javascript getComputedStyle获取和设置style的原理
Oct 10 Javascript
JavaScript 函数式编程的原理
Oct 16 Javascript
JQuery1.6 使用方法三
Nov 23 Javascript
JavaScript中的私有/静态属性介绍
Jul 26 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
Aug 26 Javascript
Express的路由详解
Dec 10 Javascript
js改变css样式的三种方法推荐
Jun 28 Javascript
js数组去重的hash方法
Dec 22 Javascript
BootStrapTable 单选及取值的实现方法
Jan 10 Javascript
node.js 利用流实现读写同步,边读边写的方法
Sep 11 Javascript
泛谈JS逻辑判断选择器 || &amp;&amp;
May 24 Javascript
如何基于viewport vm适配移动端页面
Nov 13 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
php面向对象的方法重载两种版本比较
2008/09/08 PHP
php面向对象值单例模式
2016/05/03 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
jQuery实现tab选项卡效果的方法
2015/07/08 Javascript
vuejs指令详解
2017/02/07 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
Nodejs调用WebService的示例代码
2017/09/29 NodeJs
js 原生判断内容区域是否滚动到底部的实例代码
2017/11/15 Javascript
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
Vue初始化中的选项合并之initInternalComponent详解
2020/06/11 Javascript
跟老齐学Python之编写类之二方法
2014/10/11 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
Python随机数函数代码实例解析
2020/02/09 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
什么是跨站脚本攻击
2014/12/11 面试题
咖啡店的创业计划书,让你hold不住
2014/01/03 职场文书
信访工作者先进事迹
2014/01/17 职场文书
留学自荐信写作方法
2014/01/27 职场文书
应聘文员自荐信范文
2014/03/11 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
英文邀请函
2015/02/02 职场文书
教师辞职信范文
2015/02/28 职场文书
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis
分析Python list操作为什么会错误
2021/11/17 Python
《废话连篇——致新手》——chinapizza
2022/04/05 无线电