ホームページ ウェブフロントエンド H5 チュートリアル HTML5 キャンバスを使用してクールな時計効果を実現する

HTML5 キャンバスを使用してクールな時計効果を実現する

Feb 23, 2017 pm 02:25 PM

H5 の最大の特徴とも言えるキャンバスを使用すると、Web ページ上にさまざまなグラフィックを自由に描画したり、小さなゲームを作成したりできます。 Canvasタグの使い方についてはインターネット上にたくさんあるので、ここでは紹介しません。今日はキャンバスを使って小さな時計を作ります。

そこでまず、このページでは 2 つのキャンバスを使用し、1 つは静止した時計の文字盤と目盛りを描画し、もう 1 つは時計の 3 つの針を描画し、位置決めを使用してそれらを重ね合わせました。それから、ここで言うことは何もありません。コードは以下に添付されています。

<canvas id="plate">   

            画表盘   

    </canvas>   

    <canvas id="needles">   

            画时针   

    </canvas>
ログイン後にコピー



var plate=document.getElementById(&#39;plate&#39;);   

    var needles=document.getElementById(&#39;needles&#39;);   

    needles.setAttribute(&#39;style&#39;,&#39;position:absolute;top:8px;left:8px;&#39;);  //这里因为chrome里面,body的magin值为8px,所以我这里就没设为0了。   

    var cntP=plate.getContext(&#39;2d&#39;);   

    var cntH=needles.getContext(&#39;2d&#39;);   

    plate.width=800;   

    plate.height=500;   

    needles.width=800;   

    needles.height=500;
ログイン後にコピー



ここまで来て、準備作業が完了し、時計を描く準備が整いました。まず、時計の文字盤を描画するコンストラクターを定義しました。

function drawclock(cnt,radius,platelen,linewidth,numLen,NUMLEN){   

                this.cnt=cnt;   

                this.radius=radius;   

                this.platelen=platelen;   

                this.linewidth=linewidth;   

                this.numLen=numLen;   

                this.NUMLEN=NUMLEN;   

                this.getCalibCoor=function(i){     

                    //获得表盘刻度两端的坐标   

                    var X=200+this.radius*Math.sin(6*i*Math.PI/180);   

                    var Y=200-this.radius*Math.cos(6*i*Math.PI/180);   

                    var x=200+(this.radius-this.platelen)*Math.sin(6*i*Math.PI/180);   

                    var y=200-(this.radius-this.platelen)*Math.cos(6*i*Math.PI/180);   

      

                    // 获得分钟数字的坐标   

                    var numx=200+(this.radius-this.platelen-this.numLen)*Math.sin(6*i*Math.PI/180);   

                    var numy=200-(this.radius-this.platelen-this.numLen)*Math.cos(6*i*Math.PI/180);   

                    //获得小时数字的坐标   

                    var numX=200+(this.radius-this.platelen-this.NUMLEN)*Math.sin(6*i*Math.PI/180);     

                    var numY=200-(this.radius-this.platelen-this.NUMLEN)*Math.cos(6*i*Math.PI/180);   

                    return {X:X,Y:Y,x:x,y:y,numx:numx,numy:numy,numX:numX,numY:numY};   

                };   

                this.drawCalibration=function(){ //画刻度   

                    for(var i=0,coorObj;i<60;i++){   

                        coorObj=this.getCalibCoor(i);   

                        this.cnt.beginPath();   

                        this.cnt.moveTo(coorObj.X,coorObj.Y);   

                        this.cnt.lineTo(coorObj.x,coorObj.y);   

                        this.cnt.closePath();   

      

                        this.cnt.lineWidth=this.linewidth;   

                        this.cnt.strokeStyle=&#39;#ddd&#39;;   

                        i%5==0&&(this.cnt.strokeStyle=&#39;#aaa&#39;)   

                        &&(this.cnt.lineWidth=this.linewidth*2);   

                        i%15==0&&(this.cnt.strokeStyle=&#39;#999&#39;)   

                        &&(this.cnt.lineWidth=this.linewidth*3);   

                        this.cnt.stroke();   

      

                        this.cnt.font=&#39;10px Arial&#39;;   

                        this.cnt.fillStyle=&#39;rgba(0,0,0,.2)&#39;;   

                        this.cnt.fillText(i,coorObj.numx-7,coorObj.numy+3);   

                        i%5==0&&(this.cnt.fillStyle=&#39;rgba(0,0,0,.5)&#39;)   

                            &&(this.cnt.font=&#39;18px Arial&#39;)   

                            &&(this.cnt.fillText(i/5,coorObj.numX-5,coorObj.numY+5));   

                    }   

                };   

            }   

      

          var clock=new drawclock(cntP,200,5,1,10,25); //实例化一个表盘对象   

          clock.drawCalibration();
ログイン後にコピー



ここで最も重要な部分は、スケールとデジタル図面の座標を取得することです。目盛りの始点を文字盤の端に置き、文字盤の半径から目盛りの長さを引いて目盛りの終点の位置を求め、角度と三角関数を使用して2 点の座標。最後に、文字盤の目盛りを描画できます。下の文字盤にも同じ方法で数字が描かれています。ここでの文字盤の中心は(200,200)の位置にあります。この時点で、静的な時計の文字盤が描画されました。

以下では、時計の針を描画するためのコンストラクターを定義します。

function clockNeedle(cnt,R,lineWidth,strokeStyle,lineCap,obj){   

                this.R=R;   

                this.cnt=cnt;   

                this.lineWidth=lineWidth;   

                this.strokeStyle=strokeStyle;   

                this.lineCap=lineCap;   

                this.obj=obj;   

                this.getNeedleCoor=function(i){   

                    var X=200+this.R*0.8*Math.sin(i); //起点的坐标   

                    var Y=200-this.R*0.8*Math.cos(i);   

      

                    var x=200-20*Math.sin(i); //终点的坐标   

                    var y=200+20*Math.cos(i);   

                    return {X:X,Y:Y,x:x,y:y};   

                };   

                this.drawNeedle=function(){   

                    var d=new Date().getTime();   

                    var angle;   

                    switch(this.obj){   

                        case 0:   

                        angle=(d/3600000%24+8)/12*360*Math.PI/180;   

                        break;   

                        case 1:   

                        angle=d/60000%60/60*360*Math.PI/180;   

                        break;   

                        case 2:   

                        angle=d/1000%60/60*360*Math.PI/180;   

                        break;   

                    }   

                    var coorobj=this.getNeedleCoor(angle);   

                    this.cnt.beginPath();   

                    this.cnt.moveTo(coorobj.x,coorobj.y);   

                    this.cnt.lineTo(coorobj.X,coorobj.Y);   

                    // this.cnt.closePath();   

      

                    this.cnt.lineWidth=this.lineWidth;   

                    this.cnt.strokeStyle=this.strokeStyle;   

                    this.cnt.lineCap=this.lineCap;   

                    this.cnt.stroke();   

                }   

            }
ログイン後にコピー



ここで言及する必要があることが 2 つあります: 1. 現在時刻のミリ秒を取得し、それを時間に変換するとき、モジュロ 24 を使用して 1 日の時間を計算するとき、ここでAdd 8 が必要です。 2. lineCap 属性を使用したい場合は、上記のパスを設定するときに closePath() を使用しないでください。

この時点では、ポインタを描画して回転できるように見せるメソッドがまだ必要です:

function draw(){   

                cntH.clearRect(0,0,needles.width,needles.height);   

                var mzneedle=new clockNeedle(cntH,200,1,&#39;rgba(0,0,0,.5)&#39;,&#39;round&#39;,2);   

                //最后一个参数0代表画时针,1画分针,2画秒针   

                var fzneedle=new clockNeedle(cntH,80,3,&#39;rgba(0,0,0,.4)&#39;,&#39;round&#39;,0);   

                var szneedle=new clockNeedle(cntH,140,2,&#39;rgba(0,0,0,.3)&#39;,&#39;round&#39;,1);   

                mzneedle.drawNeedle();   

                fzneedle.drawNeedle();   

                szneedle.drawNeedle();   

                cntH.arc(200,200,5,0,2*Math.PI);   

                cntH.fillStyle=&#39;rgba(0,0,0,.5)&#39;;   

                cntH.fill();   

     }   

     setInterval(draw,1);
ログイン後にコピー



時計の写真を以下に添付します:

HTML5 キャンバスを使用してクールな時計効果を実現する

上記はHTML5 を使用したキャンバス クールな時計効果を実現するには、PHP 中国語 Web サイト (www.php.cn) に注目して関連コンテンツを参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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:48 PM

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

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

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

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 内のテキストの移動 HTML 内のテキストの移動 Sep 04, 2024 pm 04:45 PM

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

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

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

See all articles