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 相关文章推荐
如何做到打开一个页面,过几分钟自动转到另一页面
Apr 20 Javascript
jquery checkbox全选、取消全选实现代码
Mar 05 Javascript
JQuery实现简单时尚快捷的气泡提示插件
Dec 20 Javascript
为开发者准备的10款最好的jQuery日历插件
Feb 04 Javascript
js实现类似菜单风格的TAB选项卡效果代码
Aug 28 Javascript
js小数运算出现多位小数如何解决
Oct 08 Javascript
Node.js中使用jQuery的做法
Aug 17 Javascript
js实现HashTable(哈希表)的实例分析
Nov 21 Javascript
React Native使用百度Echarts显示图表的示例代码
Nov 07 Javascript
JS生成随机打乱数组的方法示例
Dec 23 Javascript
Jquery Fade用法详解
Nov 06 jQuery
vue.js watch经常失效的场景与解决方案
Jan 07 Vue.js
解决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实现的获取网页中的图片并保存到本地的代码
2010/01/05 PHP
php中memcache 基本操作实例
2015/05/17 PHP
XP折叠菜单&amp;仿QQ2006菜单
2006/12/16 Javascript
非常有用的40款jQuery 插件推荐(系列二)
2011/12/25 Javascript
js日历功能对象
2012/01/12 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
Javascript操作dom对象之select全面解析
2017/04/24 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
在vue中使用jointjs的方法
2018/03/24 Javascript
jQuery子选择器与可见性选择器实例分析
2019/06/28 jQuery
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
win10系统中安装scrapy-1.1
2016/07/03 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
Python实现的简单线性回归算法实例分析
2018/12/26 Python
浅谈Python基础—判断和循环
2019/03/22 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
简单了解python的break、continue、pass
2019/07/08 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
Python编程快速上手——PDF文件操作案例分析
2020/02/28 Python
浅谈Python里面None True False之间的区别
2020/07/09 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
2020/08/20 Python
详解用 python-docx 创建浮动图片
2021/01/24 Python
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
食堂个人先进事迹
2014/01/22 职场文书
运动会5000米加油稿
2015/07/21 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
导游词之广州陈家祠
2019/10/21 职场文书