效果如下:
代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>canvas时钟</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
</style>
<script>
window.onload = function(){
var WINDOW_WIDTH = document.body.scrollWidth;
var WINDOW_HEIGHT = document.body.scrollHeight-10;
var RADIUS = 7; //球半径
var NUMBER_GAP = 10; //数字之间的间隙
var u = 0.65; //碰撞能量损耗系数
var context; //Canvas绘制上下文
var balls = []; //存储彩色的小球
const colors = ["#33B5E5", "#0099CC", "#AA66CC", "#9933CC", "#99CC00", "#669900", "#FFBB33", "#FF8800", "#FF4444", "#CC0000"]; //彩色小球的颜色
var currentNums = []; //屏幕显示的8个字符
var digit = [
[
[0, 0, 1, 1, 1, 0, 0],
[0, 1, 1, 0, 1, 1, 0],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[0, 1, 1, 0, 1, 1, 0],
[0, 0, 1, 1, 1, 0, 0]
], //0
[
[0, 0, 0, 1, 1, 0, 0],
[0, 1, 1, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 0, 0],
[1, 1, 1, 1, 1, 1, 1]
], //1
[
[0, 1, 1, 1, 1, 1, 0],
[1, 1, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 1, 1, 0, 0],
[0, 0, 1, 1, 0, 0, 0],
[0, 1, 1, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 1, 1, 1, 1, 1]
], //2
[
[1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[0, 1, 1, 1, 1, 1, 0]
], //3
[
[0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 1, 1, 1, 0],
[0, 0, 1, 1, 1, 1, 0],
[0, 1, 1, 0, 1, 1, 0],
[1, 1, 0, 0, 1, 1, 0],
[1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 1, 1, 1, 1]
], //4
[
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[0, 1, 1, 1, 1, 1, 0]
], //5
[
[0, 0, 0, 0, 1, 1, 0],
[0, 0, 1, 1, 0, 0, 0],
[0, 1, 1, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 0],
[1, 1, 0, 1, 1, 1, 0],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[0, 1, 1, 1, 1, 1, 0]
], //6
[
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 1, 1, 0, 0],
[0, 0, 1, 1, 0, 0, 0],
[0, 0, 1, 1, 0, 0, 0],
[0, 0, 1, 1, 0, 0, 0],
[0, 0, 1, 1, 0, 0, 0]
], //7
[
[0, 1, 1, 1, 1, 1, 0],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[0, 1, 1, 1, 1, 1, 0],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[0, 1, 1, 1, 1, 1, 0]
], //8
[
[0, 1, 1, 1, 1, 1, 0],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1],
[0, 1, 1, 1, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 1, 1, 0, 0],
[0, 1, 1, 0, 0, 0, 0]
], //9
[
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 1, 1, 0],
[0, 1, 1, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 1, 1, 0],
[0, 1, 1, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]
] //:
];
function drawDatetime(cxt) {
var nums = [];
var date = new Date();
var hours = date.getHours();
var num1 = Math.floor(hours / 10);
var num2 = hours % 10;
context.fillStyle = colors[(date.getSeconds()%10)];
var offsetX = WINDOW_WIDTH/4,
offsetY = 30;
nums.push({
num: num1
});
nums.push({
num: num2
});
nums.push({
num: 10
}); //冒号
var minutes = date.getMinutes();
var num1 = Math.floor(minutes / 10);
var num2 = minutes % 10;
nums.push({
num: num1
});
nums.push({
num: num2
});
nums.push({
num: 10
}); //冒号
var seconds = date.getSeconds();
var num1 = Math.floor(seconds / 10);
var num2 = seconds % 10;
nums.push({
num: num1
});
nums.push({
num: num2
});
for(var x = 0; x < nums.length; x++) {
nums[x].offsetX = offsetX;
offsetX = drawSingleNumber(offsetX, offsetY, nums[x].num, cxt);
//两个数字连一块,应该间隔一些距离
if(x < nums.length - 1) {
if((nums[x].num != 10) && (nums[x + 1].num != 10)) {
offsetX += NUMBER_GAP;
}
}
}
//说明这是初始化
if(currentNums.length == 0) {
currentNums = nums;
} else {
//进行比较
for(var index = 0; index < currentNums.length; index++) {
if(currentNums[index].num != nums[index].num) {
//不一样时,添加彩色小球
addBalls(nums[index]);
currentNums[index].num = nums[index].num;
}
}
}
renderBalls(cxt);
updateBalls();
return date;
}
function addBalls(item) {
var num = item.num;
var numMatrix = digit[num];
for(var y = 0; y < numMatrix.length; y++) {
for(var x = 0; x < numMatrix[y].length; x++) {
if(numMatrix[y][x] == 1) {
var ball = {
offsetX: item.offsetX + RADIUS + RADIUS * 2 * x,
offsetY: 30 + RADIUS + RADIUS * 2 * y,
color: colors[Math.floor(Math.random() * colors.length)],
g: 1.5 + Math.random(),
vx: Math.pow(-1, Math.ceil(Math.random() * 10)) * 4 + Math.random(),
vy: -5
}
balls.push(ball);
}
}
}
}
function renderBalls(cxt) {
for(var index = 0; index < balls.length; index++) {
cxt.beginPath();
cxt.fillStyle = balls[index].color;
cxt.arc(balls[index].offsetX, balls[index].offsetY, RADIUS, 0, 2 * Math.PI);
cxt.fill();
}
}
function updateBalls() {
var i = 0;
for(var index = 0; index < balls.length; index++) {
var ball = balls[index];
ball.offsetX += ball.vx;
ball.offsetY += ball.vy;
ball.vy += ball.g;
if(ball.offsetY > (WINDOW_HEIGHT - RADIUS)) {
ball.offsetY = WINDOW_HEIGHT - RADIUS;
ball.vy = -ball.vy * u;
}
if(ball.offsetX > RADIUS && ball.offsetX < (WINDOW_WIDTH - RADIUS)) {
balls[i] = balls[index];
i++;
}
}
//去除出边界的球
for(; i < balls.length; i++) {
balls.pop();
}
}
function drawSingleNumber(offsetX, offsetY, num, cxt) {
var numMatrix = digit[num];
for(var y = 0; y < numMatrix.length; y++) {
for(var x = 0; x < numMatrix[y].length; x++) {
if(numMatrix[y][x] == 1) {
cxt.beginPath();
cxt.arc(offsetX + RADIUS + RADIUS * 2 * x, offsetY + RADIUS + RADIUS * 2 * y, RADIUS, 0, 2 * Math.PI);
cxt.fill();
}
}
}
cxt.beginPath();
offsetX += numMatrix[0].length * RADIUS * 2;
return offsetX;
}
var canvas = document.getElementById("canvas");
canvas.width = WINDOW_WIDTH;
canvas.height = WINDOW_HEIGHT;
context = canvas.getContext("2d");
//记录当前绘制的时刻
var currentDate = new Date();
setInterval(function() {
//清空整个Canvas,重新绘制内容
context.clearRect(0, 0, context.canvas.width, context.canvas.height);
drawDatetime(context);
}, 50)
}
</script>
</head>
<body>
<canvas id="canvas"></canvas>
</body>
</html>
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# canvas
# 时钟
# canvas实现粒子时钟效果
# canvas绘制表盘时钟
# js Canvas实现的日历时钟案例分享
# js Canvas实现圆形时钟教程
# JavaScript学习小结之使用canvas画“哆啦A梦”时钟
# JS+Canvas绘制时钟效果
# js+html5实现canvas绘制网页时钟的方法
# JavaScript html5 canvas绘制时钟效果(二)
# javascript结合Canvas 实现简易的圆形时钟
# html5 canvas js(数字时钟)实例代码
# 这是
# 清空
# 球半
# NUMBER_GAP
# RADIUS
相关文章:
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
图册素材网站设计制作软件,图册的导出方式有几种?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
如何零基础在云服务器搭建WordPress站点?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
大型企业网站制作流程,做网站需要注册公司吗?
Swift中swift中的switch 语句
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何通过远程VPS快速搭建个人网站?
建站之星代理平台如何选择最佳方案?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
高性价比服务器租赁——企业级配置与24小时运维服务
建站之星如何保障用户数据免受黑客入侵?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
如何用PHP快速搭建高效网站?分步指南
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
nginx修改上传文件大小限制的方法
如何选择香港主机高效搭建外贸独立站?
创业网站制作流程,创业网站可靠吗?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
,购物网站怎么盈利呢?
如何正确下载安装西数主机建站助手?
如何批量查询域名的建站时间记录?
表情包在线制作网站免费,表情包怎么弄?
网站制作话术技巧,网站推广做的好怎么话术?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
浅析上传头像示例及其注意事项
Swift中switch语句区间和元组模式匹配
广东企业建站网站优化与SEO营销核心策略指南
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
如何在阿里云ECS服务器部署织梦CMS网站?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
家庭建站与云服务器建站,如何选择更优?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
建站之星后台密码遗忘如何找回?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
自助网站制作软件,个人如何自助建网站?
高端网站建设与定制开发一站式解决方案 中企动力
简单实现Android验证码
*请认真填写需求信息,我们会在24小时内与您取得联系。