亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

用HTML5制作數字時鐘的教程

2020-03-24 17:28:30
字體:
來源:轉載
供稿:網友
就是這個數字時鐘,當時覺得這個創意不錯,但是也沒去折騰。直到昨天同事又在網上看到這個案例,他覺得很酷炫,就跑過來問我,這個是怎么實現的,然后我大概想了一下實現方法后也來了點興趣,就花了一點時間模仿做出來了一個。不同的是,岑安用的是div來做的。而我就是用canvas來實現的。用canvas來做性能方面會更好,因為就單單操控每個點的運動,用js控制dom的style屬性跟用js控制canvas繪圖相比性能方面肯定是有所欠缺的。 先上個我做的DEMO吧,然后再簡述一下做這個的方法: 看DEMO請戳我 。 做這個思路很簡單,就是通過字符串保存各個數字的位置:
復制代碼XML/HTML Code復制內容到剪貼板
varnumData=[ 1111/1001/1001/1001/1001/1001/1111 ,//0 0001/0001/0001/0001/0001/0001/0001 ,//1 1111/0001/0001/1111/1000/1000/1111 ,//2 1111/0001/0001/1111/0001/0001/1111 ,//3 1010/1010/1010/1111/0010/0010/0010 ,//4 1111/1000/1000/1111/0001/0001/1111 ,//5 1111/1000/1000/1111/1001/1001/1111 ,//6 1111/0001/0001/0001/0001/0001/0001 ,//7 1111/1001/1001/1111/1001/1001/1111 ,//8 1111/1001/1001/1111/0001/0001/1111 ,//9 0000/0000/0010/0000/0010/0000/0000 ,//: ]
0代表沒像素,1代表有像素,/是為了更好看些,就是分行嘛,簡單說起來:比如0就是: XML/HTML Code復制內容到剪貼板
這樣就很清楚了吧。從0到9還有一個:號都用字符串表示好。 然后就寫個粒子對象,也就是像素點:
XML/HTML Code復制內容到剪貼板
varP_radius=8,Gravity=9.8; varParticle=function(){ this.x=0; this.y=0; this.vx=0; this.vy=0; this.color= ; this.visible=false; this.drop=false; } Particle.prototype={ constructors:Particle, paint:function(){//繪制自身 ctx.fillStyle=this.color; ctx.beginPath(); ctx.arc(this.x,this.y,P_radius,0,2*Math.PI); ctx.fill(); }, reset:function(x,y,color){//重置 this.x=x; this.y=y; this.vx=0; this.vy=0; this.color=color; this.visible=true; this.drop=false; }, isDrop:function(){//落下 this.drop=true; varvx=Math.random()*20+15 this.vx=Math.random() =0.5?-vx:vx; }, update:function(time){//每一幀的動作 if(this.drop){ this.x+=this.vx*time; this.y+=this.vy*time; varvy=this.vy+Gravity*time; if(this.y =canvas.height-P_radius){ this.y=canvas.height-P_radius vy=-vy*0.7; } this.vy=vy; if(this.x -P_radius||this.x canvas.width+P_radius||this.y -P_radius||this.y canvas.height+P_radius){ this.visible=false; } } } }
粒子對象的屬性比較簡單,就位置,速度,以及是否可視化。方法的話,paint是繪制方法,reset是重置(因為粒子要循環利用的,提升性能),isDrop是粒子落下方法,update就是每一幀更新粒子的動作,update中當粒子運動超出canvas的繪制區域時,就把它的可視化置為false,在粒子容器中保存起來等待下一次調用。 寫好粒子對象后,就要考慮如何讓粒子按照位置畫上去,同時當粒子不需要用時能夠讓他做自由落體的動畫了。 先畫背景(也就是那沒有像素的白點):
XML/HTML Code復制內容到剪貼板
functiondrawBg(){ vartx=(canvas.width-((P_radius*2+X_J)*4*8+7*xjg))/2; for(vari=0;i 8;i++){ varty=(canvas.height-((P_radius+yjg)*6))/2; for(varj=0;j numData[0].length;j++){ vartt=numData[0].charAt(j); if(tt=== / ){ ty+=yjg; }else{ varx=tx+j%5*(P_radius*2+X_J), y=ty; bgctx.fillStyle= #FFF ; bgctx.beginPath(); bgctx.arc(x,y,P_radius,0,2*Math.PI); bgctx.fill(); } } tx+=xjg+4*(P_radius*2+X_J); } }
先把背景畫到一個離屏canvas中緩存起來,接下來每一幀重畫的時候就不需要邏輯計算了,直接把那個離屏canvas畫上去就行了。上面的邏輯應該不難理解,就是通過兩個循環,循環8個數字,然后再對每個數字一個點一個點進行繪制,當遇到 / 時,就說明要換行了,把繪制的ty加個換行間隔,再把tx重置,再進行繪制。就這樣,點就可以都畫出來了。效果圖如下:
背景畫好了,就開始根據每一秒的時間,畫數字像素吧。方法主要是這個:
XML/HTML Code復制內容到剪貼板
functionsetTime(time){ varh=time.getHours()+ , m=time.getMinutes()+ , s=time.getSeconds()+ hh=h.length===1? 0 +h:h; mm=m.length===1? 0 +m:m; ss=s.length===1? 0 +s:s; varnowdate=h+ : +m+ : +s; vartx=(canvas.width-((P_radius*2+X_J)*4*8+7*xjg))/2,color= ; for(vari=0;i nowdate.length;i++){ varn=nowdate.charAt(i)=== : ?10:parseInt(nowdate.charAt(i)), text=numData[n]; varty=(canvas.height-((P_radius+yjg)*6))/2; switch(i){ case0:color= #4DCB74 ;break; case2:color= #4062E0 ;break; case3:color= #D65050 ;break; case5:color= #4062E0 ;break; case6:color= #797C17 ;break; } for(varj=0;j text.length;j++){ vartt=text.charAt(j); if(tt=== / ){ ty+=yjg; }else{ varx=tx+j%5*(P_radius*2+X_J), y=ty, pp=null, usefullp=null; particles.forEach(function(p){ if(p.visible p.x===x p.y===y){ ppp=p; }elseif(!p.visible usefullp===null){ usefullp=p; } }); if(pp!==null tt=== 0 ){ pp.isDrop(); }elseif(pp===null tt=== 1 ){ usefullp.reset(x,y,color); } } } tx+=xjg+4*(P_radius*2+X_J); } }
原理也不難,也是跟上面畫背景差不多,遍歷所有點,然后根據當前時間的數字轉換成的字符串來判斷,當前點是否應該有像素,如果有像素就再判斷當前這個點是否已經有粒子對象在了,如果已經有粒子對象在了,就直接跳出不處理,如果沒有粒子對象在,就再粒子容器中找一個沒有被使用的粒子reset到這個位置。還有一種情況,就是當前這個點是不應該有像素的,但是卻有粒子,那就獲取這個粒子,讓這個粒子進行自由落體。 時間設置也寫好了,就可以寫舞臺更新的代碼了:
XML/HTML Code復制內容到剪貼板
vartimeCount_0=0,timeCount_1=0,particles=[]; functioninitAnimate(){ for(vari=0;i 200;i++){ varp=newParticle(); particles.push(p); } timeCount_0=newDate(); timeCount_1=newDate(); drawBg(); setTime(timeCount_0) animate(); } functionanimate(){ ctx.clearRect(0,0,canvas.width,canvas.height); ctx.drawImage(bgcanvas,0,0); vartimeCount_2=newDate(); if(timeCount_1-timeCount_0 =1000){ setTime(timeCount_1); timeCount_0=timeCount_1; } particles.forEach(function(p){ if(p.visible){ p.update((timeCount_2-timeCount_1)/70); p.paint(); } }); timeCount_1=timeCount_2; RAF(animate) }
在initAnimate進行動畫初始化,初始化也就是先實例化兩百個粒子對象放到粒子容器中保存起來,再更新時間戳,緩存背景,設置當前時間,然后調用animate動畫循環主體開始動畫。 animate中的邏輯也很簡單了,獲取時間戳,如果兩個時間戳之間的時間差大于或等于1秒,就進行setTime。而再下面的就是對粒子容器里的所有可視化的粒子進行遍歷循環重繪了。
然后就做好啦:
個效果還是有很多可以優化的地方的,因為時鐘和分鐘都是動的比較少的,所以可以把這兩個緩存起來,當沒有動作的時候就直接將緩存數據畫上去就行了,這樣就可以減少舞臺每一幀的繪圖API調用量,肯定是能提高性能的。不過現在畢竟粒子不多,兩三百個粒子對象也就夠用了,如果不去做優化,動畫也還是能很流暢的運行的。所以樓主就偷個小懶啦。 源碼地址:http://github.com/whxaxes/canvas-test/blob/gh-pages/src/Funny-demo/coolClock/index.html
html教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美极品少妇xxxxⅹ喷水| 国产v综合v亚洲欧美久久| 亚洲欧美综合图区| 尤物九九久久国产精品的特点| 日韩av最新在线| 欧美一级高清免费| 日韩精品在线第一页| 亚洲欧美自拍一区| 国产日韩在线免费| 欧美日韩国产丝袜另类| 国产噜噜噜噜噜久久久久久久久| 欧美激情一区二区三区成人| 久久久噜噜噜久久| 国产成人精品在线视频| 国产精品成人一区二区三区吃奶| 富二代精品短视频| 国产精品美女免费| 欧美日韩免费网站| 国产成人综合久久| 福利一区福利二区微拍刺激| 久久久久久久999| 久久这里有精品| 久热精品视频在线观看| 亚洲精品久久久久久久久久久久| 国产99久久精品一区二区| 黑人巨大精品欧美一区二区一视频| 亚洲国产精品va| 日韩电影免费观看在线| 国产丝袜视频一区| 51视频国产精品一区二区| 亚洲精品国产精品乱码不99按摩| 久久久久国色av免费观看性色| 国产精品va在线播放我和闺蜜| 亚洲精品一区av在线播放| 久久av红桃一区二区小说| 亚洲激情视频网站| 亚洲一区二区三区在线视频| 久久久久北条麻妃免费看| 热门国产精品亚洲第一区在线| 97欧美精品一区二区三区| 亚洲毛茸茸少妇高潮呻吟| 日韩在线视频免费观看高清中文| 麻豆一区二区在线观看| 92裸体在线视频网站| 国产在线视频2019最新视频| 热久久免费视频精品| 高清欧美电影在线| 欧美激情综合亚洲一二区| 国产狼人综合免费视频| 国模精品视频一区二区三区| 亚洲视频欧洲视频| 2018中文字幕一区二区三区| 亚洲国产精品大全| 国产精品久久久久久久app| 国产精品久久久久久久av电影| 精品五月天久久| 亚洲精品福利资源站| 中文字幕国产日韩| 92福利视频午夜1000合集在线观看| 国产欧美久久久久久| 国产精品女视频| 国产精品视频永久免费播放| 亚洲一区精品电影| 视频在线观看一区二区| 91精品久久久久久久久不口人| 伊人久久免费视频| 自拍偷拍免费精品| 国产专区欧美专区| 国产在线视频欧美| 亚洲国产精品高清久久久| 九九热在线精品视频| 国模精品视频一区二区三区| 日韩中文字幕第一页| 成人久久18免费网站图片| 亚洲欧美国产日韩天堂区| 成人有码在线视频| 亚洲国产一区二区三区四区| 欧美麻豆久久久久久中文| 精品国内亚洲在观看18黄| 久久久女人电视剧免费播放下载| 4388成人网| 欧美日韩国产精品| 日本久久久久亚洲中字幕| 久久久天堂国产精品女人| 免费91麻豆精品国产自产在线观看| 亚洲天堂av在线免费观看| 亚洲无av在线中文字幕| 川上优av一区二区线观看| 亚洲日韩欧美视频| 国产一区私人高清影院| 国产在线a不卡| 欧美激情网友自拍| 欧美一乱一性一交一视频| 国产成人一区二区| 国产精品国产三级国产aⅴ浪潮| 久久这里只有精品视频首页| 69久久夜色精品国产69| 国产精品露脸自拍| 91禁外国网站| 欧美日本中文字幕| 91最新在线免费观看| 国产成人福利视频| 国产精品爽爽ⅴa在线观看| 欧美日韩爱爱视频| 4438全国亚洲精品在线观看视频| 久久97精品久久久久久久不卡| 亚洲国产成人精品一区二区| 少妇高潮 亚洲精品| 8090成年在线看片午夜| 人人做人人澡人人爽欧美| 奇门遁甲1982国语版免费观看高清| 91在线直播亚洲| 97视频在线观看免费高清完整版在线观看| 在线观看免费高清视频97| 午夜精品久久久久久久99热浪潮| 成人性生交大片免费观看嘿嘿视频| 国产主播喷水一区二区| 欧美日韩裸体免费视频| 日韩风俗一区 二区| 亚洲a成v人在线观看| 91视频国产精品| 在线观看不卡av| 日韩精品福利在线| 欧美在线性爱视频| 亚洲国内高清视频| 成人乱人伦精品视频在线观看| 综合激情国产一区| 亚洲丁香婷深爱综合| 美女久久久久久久| 欧美在线观看一区二区三区| 91免费看国产| 日韩av在线免费播放| 日韩精品高清视频| 国产成人久久久精品一区| 色妞色视频一区二区三区四区| 亲子乱一区二区三区电影| 国产美女精品免费电影| 亚洲激情视频网| 黑人狂躁日本妞一区二区三区| 亚洲一区二区三区成人在线视频精品| 成人黄色免费看| 中文字幕精品网| 日韩美女主播视频| 日韩精品视频在线观看免费| 懂色av一区二区三区| 最好看的2019的中文字幕视频| 日韩精品视频免费专区在线播放| 欧美日韩免费看| 亚州精品天堂中文字幕| 91久久中文字幕| 欧美亚洲成人网| 欧美日韩国产综合视频在线观看中文| 91午夜理伦私人影院| 精品国产一区二区三区久久| 成人久久18免费网站图片| 国模吧一区二区三区| 国产精品手机播放| 91网在线免费观看| 91av视频在线| 久久91亚洲人成电影网站| 亚洲精品视频在线观看视频| 国内伊人久久久久久网站视频| 一区国产精品视频| 欧美激情第6页|