canvas小球 时间倒计时demo-优化
- <!DOCTYPE html>
- <html>
- <head lang="en">
- <meta charset="UTF-8">
- <title></title>
- <style>
- *{
- margin: 0;
- padding: 0;
- }
- html,body{
- height: 100%;
- }
- </style>
- </head>
- <body>
- <canvas id="canvas" style="height: 99%"></canvas>
- </body>
- <script src="digit.js"></script>
- <script src="countdown.js"></script>
- <script></script>
- </html>
- 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,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]
- ],//
- [
- [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]
- ],//
- [
- [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]
- ],//
- [
- [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]
- ],//
- [
- [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]
- ],//
- [
- [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]
- ],//
- [
- [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]
- ],//
- [
- [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]
- ],//
- [
- [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]
- ],//
- [
- [0,0,0,0,0,0,0],
- [0,0,1,1,1,0,0],
- [0,0,1,1,1,0,0],
- [0,0,1,1,1,0,0],
- [0,0,0,0,0,0,0],
- [0,0,0,0,0,0,0],
- [0,0,1,1,1,0,0],
- [0,0,1,1,1,0,0],
- [0,0,1,1,1,0,0],
- [0,0,0,0,0,0,0]
- ]//:
- ];
digit.js
- var window_width=1024,
- window_height=768,
- RADIUS= 8,
- MARGIN_TOP=60,
- MARGIN_LEFT=30,
- //endTime=new Date(2017,5,10,12,47,52),//第二个参数是月份,值为0-11,表示1月 11表示12月
- endTime=new Date();
- endTime.setTime(endTime.getTime()+3*24*3600*1000);//设置为距离当前时间还有3天
- curShowTimeSeconds=0;
- var balls=[],
- colors=["#33B5E5","#0099CC","#AA66CC","#9933CC","#99CC00","#669900","#FFBB33","#FF8800","#FF6666","#C01110"];
- window.onload=function(){
- window_width=document.body.clientWidth;
- window_height=document.body.clientHeight;
- MARGIN_LEFT=Math.round(window_width/10);
- RADIUS=Math.round(window_width*4/5/108)-1;
- var canvas=document.getElementById("canvas");
- var context=canvas.getContext("2d");
- canvas.width=window_width;
- canvas.height=window_height;
- curShowTimeSeconds=getCurrentShowTimeSeconds();
- setInterval(function(){
- render(context);
- update();
- },50);
- };
- function getCurrentShowTimeSeconds(){
- var curTime=new Date(),ret=endTime.getTime()-curTime.getTime();
- ret=Math.round(ret/1000);
- return ret >=0?ret:0;
- }
- function update(){
- var nextShowTimeSeconds=getCurrentShowTimeSeconds(),
- nextHours=parseInt(nextShowTimeSeconds/3600),
- nextMinutes=parseInt((nextShowTimeSeconds-nextHours*3600)/60),
- nextSeconds=parseInt(nextShowTimeSeconds%60),
- curHours=parseInt(curShowTimeSeconds/3600),
- curMinutes=parseInt((curShowTimeSeconds-curHours*3600)/60),
- curSeconds=parseInt(curShowTimeSeconds%60);
- if(nextSeconds != curSeconds){
- if(parseInt(curHours/10) != parseInt(nextHours/10)){
- addBalls(MARGIN_LEFT+0,MARGIN_TOP,parseInt(curHours/10));
- }
- if(parseInt(curHours%10) != parseInt(nextHours%10)){
- addBalls(MARGIN_LEFT+15*(RADIUS+1),MARGIN_TOP,parseInt(curHours/10));
- }
- if(parseInt(curMinutes/10) != parseInt(nextMinutes/10)){
- addBalls(MARGIN_LEFT+39*(RADIUS+1),MARGIN_TOP,parseInt(curMinutes/10));
- }
- if(parseInt(curMinutes%10) != parseInt(nextMinutes%10)){
- addBalls(MARGIN_LEFT+54*(RADIUS+1),MARGIN_TOP,parseInt(curMinutes%10));
- }
- if(parseInt(curSeconds/10) != parseInt(nextSeconds/10)){
- addBalls(MARGIN_LEFT+78*(RADIUS+1),MARGIN_TOP,parseInt(curSeconds/10));
- }
- if(parseInt(curSeconds%10) != parseInt(nextSeconds%10)){
- addBalls(MARGIN_LEFT+93*(RADIUS+1),MARGIN_TOP,parseInt(nextSeconds%10));
- }
- curShowTimeSeconds=nextShowTimeSeconds;
- }
- updateBalls();
- }
- function updateBalls(){
- for(var i=0;i<balls.length;i++){
- balls[i].x+=balls[i].vx;
- balls[i].y+=balls[i].vy;
- balls[i].vy+=balls[i].g;
- if(balls[i].y>=window_height-RADIUS){
- balls[i].y=window_height-RADIUS;
- balls[i].vy=-balls[i].vy*0.75;
- }
- }
- var cnt=0;
- for(var i=0;i<balls.length;i++){
- if(balls[i].x+RADIUS>0 && balls[i].x - RADIUS<window_width){
- balls[cnt++]=balls[i];
- }
- }
- while(balls.length>Math.min(300,cnt)){
- balls.pop();
- }
- }
- function addBalls(x,y,num){
- for(var i=0;i<digit[num].length;i++){
- for(var j=0;j<digit[num][i].length;j++){
- if(digit[num][i][j] == 1){
- var aBall={
- x:x+j*2*(RADIUS+1)+(RADIUS+1),
- y:y+i*2*(RADIUS+1)+(RADIUS+1),
- g:1.5+Math.random(),
- vx:Math.pow(-1,Math.ceil(Math.random()*1000))*4,//取-4或者正4
- vy:-5,
- color:colors[Math.floor(Math.random()*colors.length)]
- };
- balls.push(aBall);
- }
- }
- }
- }
- function render(ctx){
- ctx.clearRect(0,0,window_width,window_height);
- var hours=parseInt(curShowTimeSeconds/3600),minutes=parseInt((curShowTimeSeconds-hours*3600)/60),seconds=parseInt(curShowTimeSeconds%60);
- renderDigit(MARGIN_LEFT,MARGIN_TOP,parseInt(hours/10),ctx);
- renderDigit(MARGIN_LEFT+15*(RADIUS+1),MARGIN_TOP,parseInt(hours%10),ctx);
- renderDigit(MARGIN_LEFT+28*(RADIUS+1),MARGIN_TOP,10,ctx);
- renderDigit(MARGIN_LEFT+39*(RADIUS+1),MARGIN_TOP,parseInt(minutes/10),ctx);
- renderDigit(MARGIN_LEFT+54*(RADIUS+1),MARGIN_TOP,parseInt(minutes%10),ctx);
- renderDigit(MARGIN_LEFT+67*(RADIUS+1),MARGIN_TOP,10,ctx);
- renderDigit(MARGIN_LEFT+78*(RADIUS+1),MARGIN_TOP,parseInt(seconds/10),ctx);
- renderDigit(MARGIN_LEFT+93*(RADIUS+1),MARGIN_TOP,parseInt(seconds%10),ctx);
- for(var i=0;i<balls.length;i++){
- ctx.fillStyle=balls[i].color;
- ctx.beginPath();
- ctx.arc(balls[i].x,balls[i].y,RADIUS,0,2*Math.PI,true);
- ctx.closePath();
- ctx.fill();
- }
- }
- function renderDigit(x,y,num,ctx){//绘制数字
- ctx.fillStyle="rgb(0,102,153)";
- for(var i=0;i<digit[num].length;i++){//i是行数 j是列数
- for(var j=0;j<digit[num][i].length;j++){
- if(digit[num][i][j] == 1){
- ctx.beginPath();//圆心的位置centerX:x+j*2*(R+1)+(R+1) centerY:y+i*2*(R+1)+(R+1)
- ctx.arc(x+j*2*(RADIUS+1)+(RADIUS+1),y+i*2*(RADIUS+1)+(RADIUS+1),RADIUS,0,2*Math.PI);
- ctx.closePath();
- ctx.fill()
- }
- }
- }
- }
countdown.js
- var window_width=1024,
- window_height=768,
- RADIUS= 8,
- MARGIN_TOP=60,
- MARGIN_LEFT=30,
- //endTime=new Date(2017,5,10,12,47,52),//第二个参数是月份,值为0-11,表示1月 11表示12月
- /* endTime=new Date();
- endTime.setTime(endTime.getTime()+3*24*3600*1000);//设置为距离当前时间还有3天*/
- curShowTimeSeconds=0;
- var balls=[],
- colors=["#33B5E5","#0099CC","#AA66CC","#9933CC","#99CC00","#669900","#FFBB33","#FF8800","#FF6666","#C01110"];
- window.onload=function(){
- window_width=document.body.clientWidth;
- window_height=document.body.clientHeight;
- MARGIN_LEFT=Math.round(window_width/10);
- RADIUS=Math.round(window_width*4/5/108)-1;
- var canvas=document.getElementById("canvas");
- var context=canvas.getContext("2d");
- canvas.width=window_width;
- canvas.height=window_height;
- curShowTimeSeconds=getCurrentShowTimeSeconds();
- setInterval(function(){
- render(context);
- update();
- },50);
- };
- function getCurrentShowTimeSeconds(){
- var curTime=new Date(),
- //ret=endTime.getTime()-curTime.getTime();
- ret=curTime.getHours()*3600*1000+curTime.getMinutes()*60*1000+curTime.getSeconds()*1000;
- ret=Math.round(ret/1000);
- return ret >=0?ret:0;
- }
- function update(){
- var nextShowTimeSeconds=getCurrentShowTimeSeconds(),
- nextHours=parseInt(nextShowTimeSeconds/3600),
- nextMinutes=parseInt((nextShowTimeSeconds-nextHours*3600)/60),
- nextSeconds=parseInt(nextShowTimeSeconds%60),
- curHours=parseInt(curShowTimeSeconds/3600),
- curMinutes=parseInt((curShowTimeSeconds-curHours*3600)/60),
- curSeconds=parseInt(curShowTimeSeconds%60);
- if(nextSeconds != curSeconds){
- if(parseInt(curHours/10) != parseInt(nextHours/10)){
- addBalls(MARGIN_LEFT+0,MARGIN_TOP,parseInt(curHours/10));
- }
- if(parseInt(curHours%10) != parseInt(nextHours%10)){
- addBalls(MARGIN_LEFT+15*(RADIUS+1),MARGIN_TOP,parseInt(curHours/10));
- }
- if(parseInt(curMinutes/10) != parseInt(nextMinutes/10)){
- addBalls(MARGIN_LEFT+39*(RADIUS+1),MARGIN_TOP,parseInt(curMinutes/10));
- }
- if(parseInt(curMinutes%10) != parseInt(nextMinutes%10)){
- addBalls(MARGIN_LEFT+54*(RADIUS+1),MARGIN_TOP,parseInt(curMinutes%10));
- }
- if(parseInt(curSeconds/10) != parseInt(nextSeconds/10)){
- addBalls(MARGIN_LEFT+78*(RADIUS+1),MARGIN_TOP,parseInt(curSeconds/10));
- }
- if(parseInt(curSeconds%10) != parseInt(nextSeconds%10)){
- addBalls(MARGIN_LEFT+93*(RADIUS+1),MARGIN_TOP,parseInt(nextSeconds%10));
- }
- curShowTimeSeconds=nextShowTimeSeconds;
- }
- updateBalls();
- }
- function updateBalls(){
- for(var i=0;i<balls.length;i++){
- balls[i].x+=balls[i].vx;
- balls[i].y+=balls[i].vy;
- balls[i].vy+=balls[i].g;
- if(balls[i].y>=window_height-RADIUS){
- balls[i].y=window_height-RADIUS;
- balls[i].vy=-balls[i].vy*0.75;
- }
- }
- var cnt=0;
- for(var i=0;i<balls.length;i++){
- if(balls[i].x+RADIUS>0 && balls[i].x - RADIUS<window_width){
- balls[cnt++]=balls[i];
- }
- }
- while(balls.length>Math.min(300,cnt)){
- balls.pop();
- }
- }
- function addBalls(x,y,num){
- for(var i=0;i<digit[num].length;i++){
- for(var j=0;j<digit[num][i].length;j++){
- if(digit[num][i][j] == 1){
- var aBall={
- x:x+j*2*(RADIUS+1)+(RADIUS+1),
- y:y+i*2*(RADIUS+1)+(RADIUS+1),
- g:1.5+Math.random(),
- vx:Math.pow(-1,Math.ceil(Math.random()*1000))*4,//取-4或者正4
- vy:-5,
- color:colors[Math.floor(Math.random()*colors.length)]
- };
- balls.push(aBall);
- }
- }
- }
- }
- function render(ctx){
- ctx.clearRect(0,0,window_width,window_height);
- var hours=parseInt(curShowTimeSeconds/3600),minutes=parseInt((curShowTimeSeconds-hours*3600)/60),seconds=parseInt(curShowTimeSeconds%60);
- renderDigit(MARGIN_LEFT,MARGIN_TOP,parseInt(hours/10),ctx);
- renderDigit(MARGIN_LEFT+15*(RADIUS+1),MARGIN_TOP,parseInt(hours%10),ctx);
- renderDigit(MARGIN_LEFT+28*(RADIUS+1),MARGIN_TOP,10,ctx);
- renderDigit(MARGIN_LEFT+39*(RADIUS+1),MARGIN_TOP,parseInt(minutes/10),ctx);
- renderDigit(MARGIN_LEFT+54*(RADIUS+1),MARGIN_TOP,parseInt(minutes%10),ctx);
- renderDigit(MARGIN_LEFT+67*(RADIUS+1),MARGIN_TOP,10,ctx);
- renderDigit(MARGIN_LEFT+78*(RADIUS+1),MARGIN_TOP,parseInt(seconds/10),ctx);
- renderDigit(MARGIN_LEFT+93*(RADIUS+1),MARGIN_TOP,parseInt(seconds%10),ctx);
- for(var i=0;i<balls.length;i++){
- ctx.fillStyle=balls[i].color;
- ctx.beginPath();
- ctx.arc(balls[i].x,balls[i].y,RADIUS,0,2*Math.PI,true);
- ctx.closePath();
- ctx.fill();
- }
- }
- function renderDigit(x,y,num,ctx){//绘制数字
- ctx.fillStyle="rgb(0,102,153)";
- for(var i=0;i<digit[num].length;i++){//i是行数 j是列数
- for(var j=0;j<digit[num][i].length;j++){
- if(digit[num][i][j] == 1){
- ctx.beginPath();//圆心的位置centerX:x+j*2*(R+1)+(R+1) centerY:y+i*2*(R+1)+(R+1)
- ctx.arc(x+j*2*(RADIUS+1)+(RADIUS+1),y+i*2*(RADIUS+1)+(RADIUS+1),RADIUS,0,2*Math.PI);
- ctx.closePath();
- ctx.fill()
- }
- }
- }
- }
countdown.js显示当前时间版
canvas小球 时间倒计时demo-优化的更多相关文章
- canvas小球 时间demo
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 使用canvas编写时间轴插件
使用canvas编写时间轴插件 背景 项目中有一个视频广场的功能,需要一个时间轴类似视频播放中进度条功能一样显示录像情况,并且可以点击.拖动.放大缩小展示时间轴,获取到时间轴的某个时间.原来的时间轴是 ...
- js时间倒计时
看了网上的其他的例子,觉得写的都有点复杂,不好理解,于是自己动手写了个. 本来想封装成jquery插件,但是觉得因为功能很简单,没有必要做成jquery插件,引用的时候不需要引入jqery库,这里直接 ...
- h5 canvas 小球移动
h5 canvas 小球移动 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- 原生js 当前时间 倒计时代码
源:https://www.oschina.net/code/snippet_2318153_54763 <!DOCTYPE html> <html> <head> ...
- Vue的实时时间转换Demo
Vue的实时时间转换Demo time.html: <!DOCTYPE html> <html lang="en"> <head> <me ...
- Java 获取当前时间及实现时间倒计时功能
引言 在一些项目中或是一些特殊的业务场景中,需要用到显示系统的当前时间,以及一些固定的时间倒计时,时间到后做一些什么事情的业务 .接下来咱们就具体看看代码是怎么实现的: <%@ page lan ...
- js+canvas(H5)实现小球移动小demo
*canvas提供画布,大小自定义,js得到画布,从画布对象通过getContext('2d')来得到画笔,然后就可以开始画了 代码: <!DOCTYPE html> <html l ...
- canvas小球动画原理
随着html5发展,canvas标签作为h5革命性的发展标志也越来越流行.canvas标签的强大之处,不仅在于它可以作为一个独立的画布,也可以利用canvas做一些动画而不用导入flash文件.同时, ...
随机推荐
- android系统权限的管理
被权限搞了好久,决定好好的研究一下: 参考资料 http://blog.csdn.net/xieyan0811/article/details/6083019?reload http://blog.c ...
- [译]用R语言做挖掘数据《三》
决策树和随机森林 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到 ...
- Python——第一个python程序helloworld
安装了Python的环境之后,就是编写Python的代码了. 首先,我们来写一个简单的“hello world” 新建一个空白的txt文本,将后缀改为.py 改了后缀之后即变为Python程序的图标 ...
- iOS开发笔记18:一些编译、开发调试、打包的细节整理
1.以链库的方式引用第三方库 一些特殊场景可能会要求使用链库的方式使用第三方库,大体设置如下: ①Other Linker Flags里进行设置,格式为-l+库名称 ②Libray Search Pa ...
- docker 安装ElasticSearch 6.x
首先是拉去镜像(或者直接创建容器自然会拉去) docker pull elasticsearch:6.5.4 创建容器 docker run --name elasticsearch --net ho ...
- Servlet学习系列1
一.引言: 1.什么是Servlet? JavaWeb 开发规范中的一个组成部分. 服务器端的一段小程序(代码) 2.什么是服务器?→ 安装了服务器软件的计算机. 硬件:电脑 --->高性能 ...
- spss C# 二次开发 学习笔记(五)——Spss系统集成模式
Spss官方不支持Server2008R2等Server系列,但做Spss的二次开发,调用Spss的Web系统,一般部署在Server系列上,例如Server2008R2. 起初,在Server上安装 ...
- <Android 应用 之路> MPAndroidChart~ScatterChart
简介 MPAndroidChart是PhilJay大神给Android开发者带来的福利.MPAndroidChart是一个功能强大并且使用灵活的图表开源库,支持Android和IOS两种,这里我们暂时 ...
- 【vue入门】日志demo,增删改查的练习(无vuex版本)
安装 1. 确定电脑已装node和npm 出现版本号则说明电脑已经安装好node和npm2. 创建一个基于webpack的项目 3. 在项目里安装依赖 4. 运行 配置路由为了动态渲染各个页面的组 ...
- Android学习笔记(5)----启动 Theme.Dialog 主题的Activity时程序崩溃的解决办法
新建了一个Android Studio工程,在MainActivity的主界面中添加了两个按钮,点击其中一个按钮用来启动 NormalActivity,点击另一按钮用来启动DialogActivity ...