源自慕课网

效果如下:

全部代码:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <title> new document </title>
  5. <meta name="generator" content="editplus" />
  6. <meta name="author" content="" />
  7. <meta name="keywords" content="" />
  8. <meta name="description" content="" />
  9. </head>
  10. <style type="text/css">
  11. html,body{height:100%}
  12. </style>
  13. <body>
  14. <canvas id="canvas" style="height:100%">
  15. 当前浏览器不支持Canvas
  16. </canvas>
  17. </body>
  18. </html>
  19. <script type="text/javascript" src="digit.js"></script>
  20. <script type="text/javascript" src="clockdown.js"></script>

逻辑代码:clockdown.js

  1. var WINDOW_WIDTH=1024;
  2. var WINDOW_HEIGHT=600;
  3. var MARGIN_TOP=60;
  4. var MARGIN_LEFT=30;
  5. //存放彩色小球
  6. var balls=[];
  7.  
  8. const colors=["#33B5E5","#0099CC","#AA66CC","#669900","#FFBB33","#FF8800","#FF4444","CC0000"];
  9. var r=8;//圆半径
  10. window.onload=function(){
  11. WINDOW_WIDTH=document.body.clientWidth;
  12. WINDOW_HEIGHT=document.body.clientHeight;
  13. MARGIN_LEFT=Math.round(WINDOW_WIDTH/10);
  14. r=Math.round(WINDOW_WIDTH*4/5/108)-1;
  15. var canvas=document.getElementById("canvas");
  16. var context=canvas.getContext("2d");
  17. canvas.width=WINDOW_WIDTH;
  18. canvas.height=WINDOW_HEIGHT;
  19.  
  20. window.setInterval(function(){
  21. var curr=new Date();
  22. var curHours=curr.getHours();
  23. var curMinutes=curr.getMinutes();
  24. var curSeconds=curr.getSeconds();
  25.  
  26. //当时间的秒数改变时添加彩色小球
  27. if(preSeconds!=curSeconds)
  28. {
  29.  
  30. if(parseInt(curHours/10)!=parseInt(preHours/10)){
  31. addBall(MARGIN_LEFT,MARGIN_TOP,parseInt(curHours/10));
  32. }
  33. if(parseInt(curHours%10)!=parseInt(preHours%10)){
  34. addBall(MARGIN_LEFT+15*(r+1),MARGIN_TOP,parseInt(curHours%10));
  35. }
  36. if(parseInt(curMinutes/10)!=parseInt(preMinutes/10)){
  37. addBall(MARGIN_LEFT+39*(r+1),MARGIN_TOP,parseInt(curMinutes/10));
  38. }
  39. if(parseInt(curMinutes%10)!=parseInt(preMinutes%10)){
  40. addBall(MARGIN_LEFT+54*(r+1),MARGIN_TOP,parseInt(curMinutes%10));
  41. }
  42.  
  43. if(parseInt(curSeconds/10)!=parseInt(preSeconds/10)){
  44. addBall(MARGIN_LEFT+78*(r+1),MARGIN_TOP,parseInt(curSeconds/10));
  45. }
  46. if(parseInt(curSeconds%10)!=parseInt(preSeconds%10)){
  47. addBall(MARGIN_LEFT+93*(r+1),MARGIN_TOP,parseInt(curSeconds%10));
  48. }
  49. }
  50. render(context);
  51.  
  52. },50);
  53.  
  54. }
  55.  
  56. //添加小球(数字num上的彩色小球,x,y:数字方块容器的左上角顶点坐标)
  57. function addBall(x,y,num){
  58. for (var i=0;i<digit[num].length ;i++ )
  59. {
  60. for (var j=0;j<digit[num][i].length ;j++ )
  61. {
  62. if(digit[num][i][j]==1){
  63.  
  64. var ball={
  65. x:x+j*2*(r+1)+r+1,
  66. y:y+i*2*(r+1)+r+1,
  67. g:1.5+Math.random(),
  68. vx:Math.pow(-1,Math.ceil(Math.random()*1000))*9,//结果为-10/10
  69. vy:-10,
  70. color:colors[Math.floor(Math.random()*colors.length)]
  71. };
  72. balls.push(ball);
  73.  
  74. }
  75. }
  76. }
  77. }
  78. //----画彩色小球
  79. function renderBalls(context){
  80. //context.clearRect(0,0,WINDOW_WIDTH,WINDOW_HEIGHT)
  81. for (var i=0;i<balls.length ;i++ )
  82. {
  83. context.beginPath();
  84. context.arc(balls[i].x,balls[i].y,r,0,2*Math.PI,false);
  85. context.fillStyle=balls[i].color;
  86. context.fill();
  87. context.closePath();
  88. }
  89. }
  90.  
  91. //----更新彩色小球位置
  92. function UpdateBalls(){
  93. var count=0;
  94. for (var i=0;i<balls.length ;i++ )
  95. {
  96. balls[i].x+=balls[i].vx;
  97. balls[i].y+=balls[i].vy;
  98. balls[i].vy+=balls[i].g;
  99. if(balls[i].y+r>=WINDOW_HEIGHT){
  100. balls[i].y=WINDOW_HEIGHT-r;
  101. balls[i].vy=-balls[i].vy*0.7;
  102. }
  103.  
  104. if(balls[i].x+r>0&&balls[i].x-r<WINDOW_WIDTH){
  105. balls[count++]=balls[i];}
  106.  
  107. }
  108. //移除溢出的小球
  109. while(balls.length>count){balls.pop();}
  110. }
  111.  
  112. var preHours;
  113. var preMinutes;
  114. var preSeconds;
  115.  
  116. //渲染整个画布
  117. function render(context)
  118. {
  119. context.clearRect(0,0,WINDOW_WIDTH,WINDOW_HEIGHT)
  120. var now=new Date();
  121. var hours=now.getHours();
  122. var minutes=now.getMinutes();
  123. var seconds=now.getSeconds();
  124. preHours=hours;
  125. preMinutes=minutes;
  126. preSeconds=seconds;
  127. //---时
  128. renderDigit(MARGIN_LEFT,MARGIN_TOP,parseInt(hours/10),context);
  129. renderDigit(MARGIN_LEFT+15*(r+1),MARGIN_TOP,hours%10,context);
  130. renderDigit(MARGIN_LEFT+30*(r+1),MARGIN_TOP,10,context);
  131. //---分
  132. renderDigit(MARGIN_LEFT+39*(r+1),MARGIN_TOP,parseInt(minutes/10),context);
  133. renderDigit(MARGIN_LEFT+54*(r+1),MARGIN_TOP,minutes%10,context);
  134. renderDigit(MARGIN_LEFT+69*(r+1),MARGIN_TOP,10,context);
  135. //---秒
  136. renderDigit(MARGIN_LEFT+78*(r+1),MARGIN_TOP,parseInt(seconds/10),context);
  137. renderDigit(MARGIN_LEFT+93*(r+1),MARGIN_TOP,seconds%10,context);
  138. //---画小球
  139. renderBalls(context);
  140. //---改变小球路径
  141. UpdateBalls();
  142.  
  143. console.log(balls.length);
  144.  
  145. }
  146. //渲染每个数字
  147. function renderDigit(x,y,num,context)
  148. {
  149. context.fillStyle="green";
  150. for (var i=0;i<digit[num].length ; i++)
  151. {
  152. for (var j=0;j<digit[num][i].length ;j++ )
  153. {
  154. if(digit[num][i][j]==1){
  155. context.beginPath();
  156. context.arc(x+j*2*(r+1)+r+1,y+i*2*(r+1)+r+1,r,0,2*Math.PI,false);
  157. context.closePath();
  158. context.fill();
  159. }
  160. }
  161. }
  162. }

  

数字的结构定义:digit.js

  1. digit =
  2. [
  3. [
  4. [0,0,1,1,1,0,0],
  5. [0,1,1,0,1,1,0],
  6. [1,1,0,0,0,1,1],
  7. [1,1,0,0,0,1,1],
  8. [1,1,0,0,0,1,1],
  9. [1,1,0,0,0,1,1],
  10. [1,1,0,0,0,1,1],
  11. [1,1,0,0,0,1,1],
  12. [0,1,1,0,1,1,0],
  13. [0,0,1,1,1,0,0]
  14. ],//0
  15. [
  16. [0,0,0,1,1,0,0],
  17. [0,1,1,1,1,0,0],
  18. [0,0,0,1,1,0,0],
  19. [0,0,0,1,1,0,0],
  20. [0,0,0,1,1,0,0],
  21. [0,0,0,1,1,0,0],
  22. [0,0,0,1,1,0,0],
  23. [0,0,0,1,1,0,0],
  24. [0,0,0,1,1,0,0],
  25. [1,1,1,1,1,1,1]
  26. ],//1
  27. [
  28. [0,1,1,1,1,1,0],
  29. [1,1,0,0,0,1,1],
  30. [0,0,0,0,0,1,1],
  31. [0,0,0,0,1,1,0],
  32. [0,0,0,1,1,0,0],
  33. [0,0,1,1,0,0,0],
  34. [0,1,1,0,0,0,0],
  35. [1,1,0,0,0,0,0],
  36. [1,1,0,0,0,1,1],
  37. [1,1,1,1,1,1,1]
  38. ],//2
  39. [
  40. [1,1,1,1,1,1,1],
  41. [0,0,0,0,0,1,1],
  42. [0,0,0,0,1,1,0],
  43. [0,0,0,1,1,0,0],
  44. [0,0,1,1,1,0,0],
  45. [0,0,0,0,1,1,0],
  46. [0,0,0,0,0,1,1],
  47. [0,0,0,0,0,1,1],
  48. [1,1,0,0,0,1,1],
  49. [0,1,1,1,1,1,0]
  50. ],//3
  51. [
  52. [0,0,0,0,1,1,0],
  53. [0,0,0,1,1,1,0],
  54. [0,0,1,1,1,1,0],
  55. [0,1,1,0,1,1,0],
  56. [1,1,0,0,1,1,0],
  57. [1,1,1,1,1,1,1],
  58. [0,0,0,0,1,1,0],
  59. [0,0,0,0,1,1,0],
  60. [0,0,0,0,1,1,0],
  61. [0,0,0,1,1,1,1]
  62. ],//4
  63. [
  64. [1,1,1,1,1,1,1],
  65. [1,1,0,0,0,0,0],
  66. [1,1,0,0,0,0,0],
  67. [1,1,1,1,1,1,0],
  68. [0,0,0,0,0,1,1],
  69. [0,0,0,0,0,1,1],
  70. [0,0,0,0,0,1,1],
  71. [0,0,0,0,0,1,1],
  72. [1,1,0,0,0,1,1],
  73. [0,1,1,1,1,1,0]
  74. ],//5
  75. [
  76. [0,0,0,0,1,1,0],
  77. [0,0,1,1,0,0,0],
  78. [0,1,1,0,0,0,0],
  79. [1,1,0,0,0,0,0],
  80. [1,1,0,1,1,1,0],
  81. [1,1,0,0,0,1,1],
  82. [1,1,0,0,0,1,1],
  83. [1,1,0,0,0,1,1],
  84. [1,1,0,0,0,1,1],
  85. [0,1,1,1,1,1,0]
  86. ],//6
  87. [
  88. [1,1,1,1,1,1,1],
  89. [1,1,0,0,0,1,1],
  90. [0,0,0,0,1,1,0],
  91. [0,0,0,0,1,1,0],
  92. [0,0,0,1,1,0,0],
  93. [0,0,0,1,1,0,0],
  94. [0,0,1,1,0,0,0],
  95. [0,0,1,1,0,0,0],
  96. [0,0,1,1,0,0,0],
  97. [0,0,1,1,0,0,0]
  98. ],//7
  99. [
  100. [0,1,1,1,1,1,0],
  101. [1,1,0,0,0,1,1],
  102. [1,1,0,0,0,1,1],
  103. [1,1,0,0,0,1,1],
  104. [0,1,1,1,1,1,0],
  105. [1,1,0,0,0,1,1],
  106. [1,1,0,0,0,1,1],
  107. [1,1,0,0,0,1,1],
  108. [1,1,0,0,0,1,1],
  109. [0,1,1,1,1,1,0]
  110. ],//8
  111. [
  112. [0,1,1,1,1,1,0],
  113. [1,1,0,0,0,1,1],
  114. [1,1,0,0,0,1,1],
  115. [1,1,0,0,0,1,1],
  116. [0,1,1,1,0,1,1],
  117. [0,0,0,0,0,1,1],
  118. [0,0,0,0,0,1,1],
  119. [0,0,0,0,1,1,0],
  120. [0,0,0,1,1,0,0],
  121. [0,1,1,0,0,0,0]
  122. ],//9
  123. [
  124. [0,0,0,0],
  125. [0,0,0,0],
  126. [0,1,1,0],
  127. [0,1,1,0],
  128. [0,0,0,0],
  129. [0,0,0,0],
  130. [0,1,1,0],
  131. [0,1,1,0],
  132. [0,0,0,0],
  133. [0,0,0,0]
  134. ]//:
  135. ];

  

【HTML5】炫丽的时钟效果Canvas绘图与动画基础练习的更多相关文章

  1. 炫丽的倒计时效果Canvas绘图与动画基础

    前言 想要在自己做的网页中,加入canvas动画效果,但是发现模板各种调整不好,觉得还是要对canvas有所了解,才可以让自己的网页变得狂拽炫酷吊炸天! 一.绘制基础 1 <!DOCTYPE h ...

  2. canvas-炫丽的倒计时效果Canvas绘图与动画基础

    canvas 是基于转台来绘制的 来了解一下canvas的浏览器兼容性问题,如下图所示.(截图自can i use) tips:刚刚拿去ie8下测了一下,什么反应都没有,提前设定好的,如果该浏览器不支 ...

  3. >炫酷的计时器效果Canvas绘图与动画<

    >炫丽的计时器效果Canvas绘图与动画< 虽然我是学习java的,但是因为最近使用html5的关系,多学习了一下前端知识. 现在,我要介绍的计时器是十分炫酷的,使用画布完成. 喜欢htm ...

  4. 学习Canvas绘图与动画基础 制作弧和圆(五)

    1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="U ...

  5. 学习Canvas绘图与动画基础 绘制多条路径(四)

    1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="U ...

  6. 学习Canvas绘图与动画基础 为多边形着色(三)

    1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="U ...

  7. 学习Canvas绘图与动画基础 绘制直线(二)

    1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="U ...

  8. 学习Canvas绘图与动画基础 canvas入门(一)

    一.创建canvas 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta char ...

  9. HTML5中video标签与canvas绘图的使用

    video标签的使用 video标签定义视频, 它是html5中的新标签, 它的属性如下(参考自文档): domo01 <!DOCTYPE html> <html lang=&quo ...

随机推荐

  1. leetcode279. Perfect Squares

    learn from DP class Solution { public: int numSquares(int n) { if(n<=0)return 0; int * dp = new i ...

  2. 网络设备模拟器 GNS3

    https://www.gns3.com/support/docs/linux-installation sudo dpkg --add-architecture i386 sudo add-apt- ...

  3. 委托delegate使用方法

    允许传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作参数传递. class Program { //delegate的使用方法一 public del ...

  4. JS基础学习1——什么是基础js类和原型?

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. vue.js插件使用(02) vue-router

    概述 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来.传统的 ...

  6. discuz 模拟批量上传附件发帖

    discuz 模拟批量上传附件发帖 简介 对于很多用discuz做资源下载站来说,一个个上传附件,发帖是很繁琐的过程.如果需要批量上传附件发帖,就需要去模拟discuz 上传附件的流程. 插件地址 h ...

  7. js控制文本框只能输入数字 及 常用字符对应ASCII码值

    方法一: <INPUT TYPE='text' NAME=text onkeypress="a()"><script language=javascript> ...

  8. Delphi 的运算符列表

    分类 运算符 操作 操作数 结果类型 范例 算术运算符 + 加 整数,实数 整数,实数 X + Y - 减 整数,实数 整数,实数 Result - 1 * 乘 整数,实数 整数,实数 P * Int ...

  9. linux的一点小随笔

    随意写的一些东西,也就为以后自己可能看看... 1.vim安装,sudo apt-get install vim-gtk,于是vim就安装好了.当然在我电脑上还出现了gvim,简单的vim配置(etc ...

  10. java和python根据对象某一个属性排序

    最近在学习java,目前看到java如何对一个对象列表进行排序. 我有一个Member类: public Member(String name,Calendar birthday,Sex gender ...