ホームページ ウェブフロントエンド H5 チュートリアル HTML5_html5 を使用したデジタル時計の作成に関するチュートリアル チュートリアルのヒント

HTML5_html5 を使用したデジタル時計の作成に関するチュートリアル チュートリアルのヒント

May 16, 2016 pm 03:46 PM
html5

2015511172231746.png (836×306)

それはこのデジタル時計でした。当時は良いアイデアだと思いましたが、気にしませんでした。昨日まで同僚がこの事例をネットで見てとても素敵だと思ったので、実装方法を考えて少し興味を持ち、真似してみました。それを作りました。違いは、Cen An が div を使用して作成していることです。そしてキャンバスを使って作りました。各ポイントの動きを制御するだけの場合、js を使用して dom の style 属性を制御するのは、js を使用してキャンバスの描画を制御する場合に比べてパフォーマンスが明らかに不足するため、パフォーマンスの面では Canvas を使用した方が良いでしょう。

最初に私が作成したデモを見て、次にこれを行う方法を簡単に説明します。デモを見るために私をつついてください。

これを行うアイデアは非常に簡単で、文字列を通じて各数値の位置を保存することです:
コードをコピー

XML/HTML コードコンテンツをクリップボードにコピー
  1. var numData = [
  2. "1111/1001/1001/1001/1001/1001/1111", //0
  3. "0001/0001/0001/0001/0001/0001/0001", //1
  4. "1111/0001/0001/1111/1000/1000/1111", //2
  5. "1111/0001/0001/1111/0001/0001/1111", //3
  6. "1010/1010/1010/1111/0010/0010/0010", //4
  7. "1111/1000/1000/1111/0001/0001/1111", //5
  8. "1111/1000/1000/1111/1001/1001/1111", //6
  9. "1111/0001/0001/0001/0001/0001/0001", //7
  10. "1111/1001/1001/1111/1001/1001/1111", //8
  11. "1111/1001/1001/1111/0001/0001/1111", //9
  12. "0000/0000/0010/0000/0010/0000/0000", //:
  13. ]

0 はピクセルがないことを意味し、1 はピクセルがあることを意味します。 / は見栄えを良くするためのもので、簡単に言うと、たとえば 0 は次のとおりです。

XML/HTML コードコンテンツをクリップボードにコピー
  1. 1 1 1 1
  2. 1 0 0 1
  3. 1 0 0 1
  4. 1 0 0 1
  5. 1 0 0 1
  6. 1 0 0 1
  7. 1 1 1 1

これで非常に明確になるはずです。文字列で表される : 0 ~ 9 の数値もあります。

次に、ピクセルであるパー​​ティクル オブジェクトを書き込みます。

XML/HTML コードコンテンツをクリップボードにコピー
  1. var P_radius = 8,重力 = 9.8;   
  2. var 粒子 = 関数(){
  3. this.x = 0;   
  4. this.y = 0;   
  5. this.vx = 0;   
  6. this.vy = 0;   
  7. this.color = "";   
  8. this.visible = false;   
  9. this.drop = false;   
  10. }
  11. Particle.prototype = {
  12. コンストラクター:パーティクル、
  13. paint:function(){ //绘自己制
  14. ctx.fillStyle = this.color;   
  15. ctx.beginPath();   
  16. ctx.arc(this.x,this.y,P_radius,0,2*Math.PI);   
  17. ctx.fill();   
  18. },
  19. reset:function(x,y,color){ // 重置
  20. this.x = x;   
  21. this.y = y;   
  22. this.vx = 0;   
  23. this.vy = 0;   
  24. this.color = 色;   
  25. this.visible = true;   
  26. this.drop = false;   
  27. }、
  28. isDrop:function(){ //勾配
  29. this.drop = true;   
  30. var vx = Math.random()*20 15
  31. this.vx = Math.random()> =0.5?-vx : vx;   
  32. },
  33. update:function(time){ //每一帧的アニメーション
  34. if(this.drop){
  35. this.x = this.vx*time;   
  36. this.y = this.vy*time;   
  37. var vy = this.vy Gravity*time;   
  38. if(this.y>=canvas.height-P_radius){
  39. this.y = canvas.height-P_radius
  40. vy = -vy*0.7;   
  41. }
  42. this.vy = vy;   
  43. if(this.x<-P_radius||this.x>canvas.width P_radius||this.y<-P_radius||this.y>canvas.height P_radius){
  44. this.visible = false;   
  45. }
  46. }
  47. }
  48. }

粒子オブジェクトのプロパティは、位置、速度、および可視かどうかというより単純なものです。つまり、各フレームがパーティクルの動作を更新し、更新中にパーティクルがキャンバスの制限領域を超えて移動する場合、その可用性は false に設定され、パーティクル コンテナ内に保持され、次の使用を待ちます。

良い粒子オブジェクトを書き込んだ後、粒子の位置に応じてどのように移動するかを検討し、同時に粒子が不要なときに自由落体のアニメーションを実行できるようにします。

先画背景(也就是那没像素的白点):


XML/HTML コード复制コンテンツ到剪贴板
  1. function drawBg(){
  2. var tx = (canvas.width-((P_radius*2 X_J)*4*8 7*xjg))/2;   
  3. for(var i=0;i<8;i ){
  4. var ty = (canvas.height-((P_radius yjg)*6))/2;   
  5. for(var j=0;j<numData[0].length;j ){
  6. var tt = numData[0].charAt(j);   
  7. if(tt==="/"){
  8. ty =yjg;   
  9. }else {
  10. var x = tx j%5*(P_radius*2 X_J),
  11. y = ty;   
  12. bgctx.fillStyle = "#FFF";   
  13. bgctx.beginPath();   
  14. bgctx.arc(x,y,P_radius,0,2*Math.PI);   
  15. bgctx.fill();   
  16. }
  17. }
  18. tx =xjg 4*(P_radius*2 X_J);   
  19. }
  20. }

まず、背景をオフスクリーン キャンバスに描画し、それをキャッシュします。その後、各フレームを再描画するときに論理計算は必要ありません。オフスクリーン キャンバスを直接描画します。上記のロジックは、2 つのループで 8 つの数値をループし、各数値をポイントごとに描画するというもので、「/」が出現すると新しい行が必要であることを意味し、描画される ty は難しくありません。改行間隔を追加し、txをリセットしてから描画します。このようにして、すべての点を描くことができます。レンダリングは次のとおりです:
2015511172757389.png (1282×350)

背景を描画した後、各秒の時間に従ってデジタル ピクセルの描画を開始します。主なメソッドは次のとおりです:

XML/HTML コードコンテンツをクリップボードにコピー
  1. 関数 setTime(時間){
  2. var h = time.getHours() "",
  3. m = 時間.getMinutes() "",
  4. s = 時間.getSeconds() "";   
  5. hh = h.length===1?"0"時:時;   
  6. mm = m.length===1?"0"分:分;   
  7. ss = s.length===1?"0" s:s;   
  8. var nowdate = h ":" m ":" s;   
  9. var tx = (canvas.width-((P_radius*2 X_J)*4*8 7*xjg))/2, = "";   
  10. for(var i=0;i<nowdate.length;i ){
  11. var n = nowdate.charAt(i)===":"?10:parseInt( nowdate.charAt(i))、
  12. テキスト = numData[n];   
  13. var ty = (canvas.height-((P_radius yjg)*6))/2;   
  14. スイッチ(i){
  15. case 0:color = "#4DCB74";break;   
  16. case 2:color = "#4062E0";break;   
  17. case 3:color = "#D65050";break;   
  18. case 5:color = "#4062E0";break;   
  19. case 6:color = "#797C17";break;   
  20. }
  21. for(var j=0;j<text.length;j ){
  22. var tt = text.charAt(j);   
  23. if(tt==="/"){
  24. ty =yjg;   
  25. }else{
  26. var x = tx j%5*(P_radius*2 X_J),
  27. y = ty
  28. pp = null
  29. usefullp = null;   
  30. particles.forEach(function(p){
  31. if(p.visible&p.x===x&p.y===y){
  32. ppp = p;   
  33. }else if(!p.visible&usefullp===null){
  34. usefullp = p;   
  35. }
  36. });   
  37. if(pp!==null&tt==="0"){
  38. pp.isDrop();   
  39. else if(pp===null&tt==="1"){
  40. usefullp.reset(x , y , color);   
  41. }
  42. }
  43. }
  44. tx =xjg 4*(P_radius*2 X_J);   
  45. }
  46. }

原理も不难、また跟上面画背景差不多、遍在すべての点、その後当時点の数字変換成る文字列に基づいて判断、当時点がこの点であるか否かを判断する、如果有像素が当時点であるかどうかを判断する粒子オブジェクトが存在する場合には、処理は直ちにスキップされ、粒子オブジェクトが存在しない場合には、再び粒子コンテナ内の使用されていない粒子がその位置にリセットされる。現在、この点には画素はありませんが、粒子が存在するので、この粒子を取得し、この粒子が自由落下するとみなします。

時間設定も写好、就可舞台更新的代了:


XML/HTML コード复制コンテンツ到剪贴板
  1. var timeCount_0 = 0,timeCount_1 = 0 粒子 = [];   
  2. 関数 initAnimate(){
  3. for(var i=0;i<200;i ){
  4. var p = new Particle();   
  5. particles.push(p);   
  6. }
  7. timeCount_0 = new Date();   
  8. timeCount_1 = new Date();   
  9. drawBg();   
  10. setTime(timeCount_0)
  11. animate();   
  12. }
  13. 関数 animate(){
  14. ctx.clearRect(0,0,canvas.width,canvas.height);   
  15. ctx.drawImage(bgcanvas,0,0);   
  16. var timeCount_2 = new Date();   
  17. if(timeCount_1-timeCount_0>=1000){
  18. setTime(timeCount_1);   
  19. timeCount_0 = timeCount_1;   
  20. }
  21. particles.forEach(function(p){
  22. if(p.visible){
  23. p.update((timeCount_2-timeCount_1)/70);   
  24. p.paint();   
  25. }
  26. });
  27. timeCount_1 = timeCount_2;
  28. RAF(アニメーション)
  29. initAnimate でアニメーションの初期化を実行します。初期化とは、まず 200 個のパーティクル オブジェクトをインスタンス化し、それらをパーティクル コンテナに入れて保存し、次にタイムスタンプを更新し、背景をキャッシュし、現在の時間を設定して、アニメーション ループ本体を呼び出します。アニメーションを開始します。
animate のロジックも非常に単純です。2 つのタイムスタンプ間の時間差が 1 秒以上の場合、setTime が実行されます。次のステップでは、パーティクル コンテナ内の可視化されたパーティクルをすべてトラバースして再描画します。
これで完了です:


この効果に関して最適化できる領域はまだ多くあります。時計と分は比較的めったに移動しないため、これら 2 つはキャッシュでき、アクションがない場合はキャッシュされたデータを直接描画するだけで済みます。これにより、時間を削減できます。ステージの各フレームの描画 API 呼び出しの数が増加し、パフォーマンスが確実に向上します。ただし、現時点ではパーティクルの数はそれほど多くなく、最適化が行われていない場合でも、200 ~ 300 個のパーティクル オブジェクトで十分です。つまり、オリジナルのポスターはちょっと怠けていたんです。
2015511172909169.png (1263×507) ソースコードのアドレス:

https://github.com/whxaxes/canvas-test/blob/gh-pages/src/Funny-demo/coolClock/index.html

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

HTMLの表の境界線 HTMLの表の境界線 Sep 04, 2024 pm 04:49 PM

HTML の表の境界線に関するガイド。ここでは、HTML でのテーブルの境界線の例を示しながら、テーブル境界線を定義する複数の方法について説明します。

HTML のネストされたテーブル HTML のネストされたテーブル Sep 04, 2024 pm 04:49 PM

これは、HTML でのネストされたテーブルのガイドです。ここでは、テーブル内にテーブルを作成する方法をそれぞれの例とともに説明します。

HTML 左マージン HTML 左マージン Sep 04, 2024 pm 04:48 PM

HTML マージン左のガイド。ここでは、HTML margin-left の概要とその例、およびそのコード実装について説明します。

HTML テーブルのレイアウト HTML テーブルのレイアウト Sep 04, 2024 pm 04:54 PM

HTML テーブル レイアウトのガイド。ここでは、HTML テーブル レイアウトの値と例および出力について詳しく説明します。

HTML入力プレースホルダー HTML入力プレースホルダー Sep 04, 2024 pm 04:54 PM

HTML 入力プレースホルダーのガイド。ここでは、コードと出力とともに HTML 入力プレースホルダーの例について説明します。

HTML 順序付きリスト HTML 順序付きリスト Sep 04, 2024 pm 04:43 PM

HTML 順序付きリストのガイド。ここでは、HTML 順序付きリストと型の導入とその例についても説明します。

HTML の onclick ボタン HTML の onclick ボタン Sep 04, 2024 pm 04:49 PM

HTML オンクリック ボタンのガイド。ここでは、それらの紹介、動作、例、およびさまざまなイベントでの onclick イベントについてそれぞれ説明します。

HTML 内のテキストの移動 HTML 内のテキストの移動 Sep 04, 2024 pm 04:45 PM

HTML でのテキストの移動に関するガイド。ここでは、概要、マーキー タグが構文でどのように機能するか、および実装例について説明します。

See all articles