公告栏添加时钟——利用canvas画出一个时钟
前言
最近在学习HTML5标签,学到Canvas,觉得很有趣。便在慕课网找了个demo练手。就是Canvas时钟。
对于canvas,w3shcool上是这么描述的:
HTML5 <canvas> 标签用于绘制图像(通过脚本,通常是 JavaScript)。
不过,<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用脚本来完成实际的绘图任务。
getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性。
示例

动态可看公告栏状态
正文
1.代码部分
html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Time</title>
<style type="text/css">
#clockdiv{
text-align: center;
}
</style>
</head>
<body>
<div id="clockdiv">
<canvas id="dom" width="200" height="200">您的浏览器不兼容canvas</canvas>
<script type="text/javascript" src="Clock.js"></script>
</body>
</html>
js代码
var canvas = document.getElementById('dom');
var context = canvas.getContext('2d');
var height = context.canvas.height;
var width = context.canvas.width;
var r = width / 2;
var rem = width/200;
//时钟背景
function drawBackground() {
context.save();
context.translate(r, r);
context.beginPath();
context.lineWidth = 8*rem;
context.strokeStyle = "#000"
context.arc(0, 0, r - 5*rem, 0, 2 * Math.PI, false);
context.stroke();
context.closePath();
//遍历小时数
var houseNumble = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2];
houseNumble.forEach(function (number, i) {
context.textAlign = 'center';
context.textBaseline = 'middle'
context.font = 18*rem+'px Arial'
var rad = 2 * Math.PI / 12 * i;
var x = Math.cos(rad) * (r - 30*rem);
var y = Math.sin(rad) * (r - 30*rem);
context.fillText(number, x, y);
})
//定义刻度
for (var i = 0; i < 60; i++) {
var rad = 2 * Math.PI / 60 * i;
var x = Math.cos(rad) * (r - 18*rem);
var y = Math.sin(rad) * (r - 18*rem);
context.beginPath();
if (i % 5 == 0) {
context.fillStyle = "#000"
context.arc(x, y, 2*rem, 0, 2 * Math.PI);
} else {
context.fillStyle = "#ccc"
context.arc(x, y, 2*rem, 0, 2 * Math.PI);
}
context.fill();
context.closePath();
}
}
//定义时针
function drawHour(hour,minute) {
context.save();
context.beginPath();
context.lineWidth = 6*rem;
context.lineCap = 'round'
var rad = 2 * Math.PI / 12 * hour;
var mrad = 2* Math.PI/12/60 * minute;
context.rotate(rad+mrad);
context.moveTo(0, 10*rem);
context.lineTo(0, -r / 2);
context.stroke();
context.restore();
}
//定义分针
function drawMinute(minute) {
context.save();
context.beginPath();
context.lineWidth = 3*rem;
context.lineCap = 'round';
var rad = 2 * Math.PI / 60 * minute;
context.rotate(rad);
context.moveTo(0, 15*rem);
context.lineTo(0, -r + 34)
context.stroke();
context.restore();
}
//定义秒钟
function drawSecond(second) {
context.save();
context.beginPath();
context.lineWidth = 2*rem;
context.lineCap = 'round';
context.fillStyle = "red"
var rad = 2 * Math.PI / 60 * second;
context.rotate(rad);
context.moveTo(-2 ,20);
context.lineTo( 2, 20);
context.lineTo( 1, -r + 18);
context.lineTo( -1, -r + 18);
context.fill();
context.restore();
}
//画中心点
function drawDot() {
context.beginPath();
context.fillStyle = "#fff"
context.arc(0, 0, 4*rem, 0, 2 * Math.PI, false);
context.fill();
}
//时间函数,让时钟根据当前时间跳动
function Draw() {
context.clearRect(0,0,width,height);
var time= new Date();
var hour =time.getHours();
var minute = time.getMinutes();
var second = time.getSeconds();
drawBackground();
drawHour(hour,minute);
drawMinute(minute);
drawSecond(second);
drawDot();
context.restore()
}
Draw();
//刷新时钟
setInterval(Draw,1000);
注意事项:1.有可能浏览器不现实效果,原因一:浏览器不兼容,会显示您的浏览器不兼容canvas。原因二:代码出错。
2.<canvas>标签最好不要使用CSS来定义长度大小。
3.js中函数顺序不能乱,否则会被清除而没有效果。
4.代码里高度宽度均为具体px值,画布大小会影响时钟美观(解决方案:设置一个比例变量,其值为 rem=width/200 ,将高度宽度用变量值 rem 来代替)。
2.给博客园公告栏添加时钟样式
1.公告栏先需要申请JS权限。(点击管理—设置—申请JS权限)
2.将自己的JS文件上传到博客的文件(点击管理—文件)里,得到地址,以下是我文件里的地址。(大家可以直接使用)
http://files.cnblogs.com/files/abao0/Clock.js
3.将下面代码贴入博客侧边栏公告。
<div id="clockdiv">
<canvas id="dom" width="200" height="200">您的浏览器不兼容canvas</canvas>
</div>
<script type="text/javascript" src="Clock.js"></script>
4.将下面代码贴入页面定制CSS代码。(加个DIV是为了使时钟在不同博客样式中的公告栏中居中显示)
#clockdiv {
text-align: center;
}
5.自定义你的样式,显示不同风格。
后记
动手做完一个demo会让自己更有收获,赶紧动起手来吧。
公告栏添加时钟——利用canvas画出一个时钟的更多相关文章
- 利用LineRenderer画出一个圆,类似于lol中的攻击范围
http://www.unity蛮牛.com/blog-5945-1409.html 本人大四狗,学unity半年有余,写此文章纯粹记录自己的心得. 废话不多说,进入主题.... 效果如图: 首先要理 ...
- 10分钟,利用canvas画一个小的loading界面
首先利用定义下canvas得样式 <canvas width="1024" height="720" id="canvas" styl ...
- 如何在canvas中画出一个太极图
先放一个效果图: 代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /&g ...
- Android利用canvas画各种图形
Android利用canvas画各种图形(点.直线.弧.圆.椭圆.文字.矩形.多边形.曲线.圆角矩形) 本文链接:https://blog.csdn.net/rhljiayou/article/det ...
- 樱花的季节,教大家用canvas画出飞舞的樱花树
又到了樱花的季节,教大家使用canvas画出飞舞的樱花树效果. 废话少说,先看效果. 演示效果地址:http://suohb.com/work/tree4.htm 查看演示效果 第一步,我们先画出一棵 ...
- 利用python画出动态高优先权优先调度
之前写过一个文章. 利用python画出SJF调度图 动态高度优先权优先调度 动态优先权调度算法,以就绪队列中各个进程的优先权作为进程调度的依据.各个进程的优先权在创建进程时所赋予,随着进程的推进或其 ...
- WPF Blend 脑洞大开的问题:如何用Blend得到或画出一个凹槽、曲面。
原文:WPF Blend 脑洞大开的问题:如何用Blend得到或画出一个凹槽.曲面. 目标图: 步骤一(放置一个矩形,填充蓝色): 步骤二(复制该矩形,并调整边角,填充粉红色): 第三部:让图形部分重 ...
- 用HTML+CSS画出一个同心圆
参加web前端校招的同学们经常会遇到这样的面试题:用HTML+CSS画出一个同心圆. 例如: 这道题主要考验的是基础盒模型布局能力和倒圆角属性的巧用. 1.html代码 <body> &l ...
- Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形) .
1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, ...
随机推荐
- Java中,&&与&,||与|的区别
在java的逻辑运算符中,有这么四类:&&(短路与),&,|,||(短路或). &&和&都是表示与,区别是&&只要第一个条件不满足,后面 ...
- Future Clalback使用案例
目前知道可以实现线程按照顺序的java原生方法有 join(),CountDownLatch,Executors.newSingleThreadExecutor(),FutureTask.. Futu ...
- 【BUG记录】记一次游戏越来越卡的BUG
U3D的MOBA项目,测试过程中,10分钟以后,游戏帧率开始缓慢下降,约3-5分钟后,由60帧下降到小于10帧,编辑器模式. 打开profiler,看到CPU占用非常高,每帧都有24K的GC, 时间占 ...
- Linux find命令使用方法
Linux中find命令用来在指定目录下查找文件.通过组合不同参数可以在linux系统中快速查找需要的文件或目录. find命令语法 格式:find pathname -options [ -pr ...
- RTX二次开发SDK需要注意的地方
1.如果是ASP.net二次开发调用的,线程池必须开发 Enable 32-bit Applications设置为true. 因为RTX的调用接口很多是32位的.否则会报一下错误 RootObj = ...
- redmine安装-BitNami 提供的一键安装程序
redmine安装-BitNami 提供的一键安装程序 博客分类: REDMINE redmine安装redmine一键安装bitNami redmine BitNami 提供re ...
- 吴裕雄 14-MySQL DELETE 语句
以下是 SQL DELETE 语句从 MySQL 数据表中删除数据的通用语法:DELETE FROM table_name [WHERE Clause]如果没有指定 WHERE 子句,MySQL 表中 ...
- js基础-运算符
100 * "20" 字符串转数字 5 * "ss" NAN "ss" 转数字返回NAN 任何数字与NAN +-*/ 都返回NAN 5/N ...
- SPSS-因子分析
因子分析 有可能用较少的综合指标分析存在于各变量中的各类信息,而各综合指标之间彼此是不相关的,代表各类信息的综合指标称为因子.定义:因子分析就是用少数几个因子来描述许多指标或因素之间的联系,以较少几个 ...
- 前端路由两种模式:hash、history
随着 ajax 的使用越来越广泛,前端的页面逻辑开始变得越来越复杂,特别是spa的兴起,前端路由系统随之开始流行. 从用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下): 记 ...