HTML5 の雪の結晶が飛ぶ効果を示す表示をインターネット上でたくさん見てきましたが、これは確かに非常に魅力的であり、誰もが私と同じように興奮しており、コードの実装方法を研究したいと考えていると思います。これらのソースコードはさまざまな場所からダウンロードできますが、他の人のアイデアやそのようなアニメーションを作成する際の困難さの分析は知りません。
私は最近たまたま勉強することが多く、需要分析から知識ポイント、プログラミングまで段階的に分析しています。あなた、笑わないでください。
最終的なレンダリングは次のとおりです:
写真 1
1. 需要分析
1. 丸い雪の結晶
この例の雪の結晶の形状は円を使用しています
2.雪の結晶の数は固定です
図 1 に従って、白い雪の結晶の数を注意深く観察してください。落下プロセス中に、画像全体の雪の結晶の数は、観察と分析を通じて取得される必要があります。これは、私たちが実際に見る、空一面に雪が舞う光景と一致しています。
3. 雪の結晶のサイズが一定ではありません
各雪片のサイズは異なります。つまり、雪片の半径はランダムです。これは、現実の空に雪の結晶が飛んでいるのを見るシーンと一致しています。
4. 雪の結晶の位置が移動します
雪の結晶が降ってきて、当然その位置も移動します。
2. 知識のポイント
1. Html5 Canvas JavaScript を使用して円を描き、円形の雪の結晶を形成します
HTML5 では、Canvas を使用し、JavaScript を使用して円を描いて円形のスノーフレークを形成する必要があります - arc(x, y, r, start, stop);
2. 乱数 - 異なる半径と座標を持つ円形の雪の結晶を生成します
この例では、Web ページが初めて読み込まれるときに、半径と位置が異なる一定数の雪の結晶を生成する必要があるため、雪の結晶が降っている間の半径と座標は乱数になります。は変化せず、座標は一定の範囲内で変化するため、この時点でも座標は乱数になります—Math.random()
3. プログラミング
1.準備
キャンバスを置き、全体の背景色を黒に設定します
HTML コード:
XML/HTML コードコンテンツをクリップボードにコピー
- <キャンバス id="mycanvas" >
- お使いのブラウザはキャンバスをサポートしていません
- キャンバス>
-
CSS コード:
CSS コードコンテンツをクリップボードにコピーします
-
* {
- マージン:
- パディング: 0;
}
-
-
#mycanv
- as {
背景
- : 黒;
}
-
- この時の効果は以下の通りです:
注: キャンバスの高さと幅はデフォルトで初期化されているため、心配する必要はありません
2. キャンバスが画面いっぱいに表示されます
JavaScript コードは次のとおりです:
JavaScript コード
コンテンツをクリップボードにコピーします
-
-
var can = document.getElementById("mycanvas" );
-
var ctx = can.getContext("2d");
//キャンバス幅 -
var-
wid = window.innerWidth;
//キャンバスの高さ
-
var
hei = window.innerHeight;
-
can.width=wid;
can.height=hei
-
この時の効果は以下の通りです: -
3. 初期化により一定数の雪の結晶が生成されます
上記の需要分析と知識ポイントの解釈によると、まず雪の結晶の数は固定されているため、変数 var Snow = 100 を定義する必要があります。ここでは雪の結晶の数が 100 であると仮定します。
雪の結晶を生成するとき、各雪の結晶の半径と位置は異なります。各雪の結晶をオブジェクトとみなします。このオブジェクトのプロパティには半径、座標 (X、Y) が含まれます。雪の結晶オブジェクトは次のように記述できます。 var SnowOject={x:1,y:10,r:5} は、座標 (1,10) と半径 5 の円形の雪の結晶を表します。この例では、半径と座標が乱数であるため、Math が使用されます。 random() は 100 個の雪片の半径と座標 (X, Y) を生成します
ここには 100 個の雪の結晶があるため、後続の操作を容易にするために、配列を使用してこれら 100 個の雪の結晶オブジェクトを保存します。
JavaScript コードは次のとおりです:
JavaScript コード
コンテンツをクリップボードにコピーします
//雪の結晶の数
- var 雪 = 100;
-
//スノーフレークの座標、半径
-
var//各円の座標と半径を保存
-
forvar
i = 0; i
arr.push({
x: Math.random() * wid,
y: Math.random() * hei, -
r: Math.random() * 10 1 -
}) -
} -
-
4. 雪の結晶を描く-
上記で 100 個の雪の結晶の半径と座標 (X, Y) を生成しました。次は、canvas を使用して雪の結晶を描画します (ここでは、円を描画します)。
JavaScript コードは次のとおりです:
JavaScript コードコンテンツをクリップボードにコピーします
-
-
関数 DrawSnow() {
-
ctx.fillStyle="白";
ctx.beginPath(); -
-
for (var i = 0; i
-
var p = arr[i];
ctx.moveTo(p.x,p.y);
- ctx.arc(p.x,p.y,p.r,0,2*Math.PI,
false-
);
}
ctx.fill(); -
-
ctx.closePath(); -
-
-
次に、DrawSnow() 関数を呼び出します。結果は次のようになります。
Web ページを複数回更新して、さまざまなサイズと位置の雪の結晶が生成されるかどうかを確認できます (通常はこれが可能です)。
注: ここでは 100 個の円を描画する必要があるため、円を描画するたびに描画開始座標が再定義されます。 ctx.moveTo(p.x,p.y); そうしないと、奇妙な効果が発生します。試してみてください
5. 雪の結晶が舞う
上では 100 個の雪の結晶を描画しましたが、残念なことに、変化する効果は Web ページを更新することでしか確認できませんが、達成する必要があるのは、雪の結晶が動き続けることです。
まず、setInterval 関数を使用して雪片を継続的に再描画する必要があります。ここでの間隔は 50 ミリ秒です: setInterval(DrawSnow,50);
同時に、各雪の結晶の座標(X,Y)を(一定の範囲内で)常に変更する必要があります。ここでの雪の結晶は左上から右下に向かって降下するため、XとYの座標値は変化します。各雪の結晶は増加し続けます。次に、関数 SnowFall() を使用して雪の結晶の落下ルールを定義します
関数コードは次のとおりです:
JavaScript コード
コンテンツをクリップボードにコピーします
-
-
関数 SnowFall() {
-
for (var i = 0; i < snow; i ) {
- var p = arr[i];
- p.y = Math.random() * 2 1;
- if (p.y > hei) {
- p.y = 0;
- }
- p.x = Math.random() * 2 1;
- if (p.x > wid) {
-
p.x = 0;
-
"white-space:pre"> }
-
}
-
}
その後该関数数放入DrawSnow()执行,注意:我们每隔50毫毛重画雪花,必须擦除画布,所以DrawSnow()関数内必须在前面执行clearRect()関数数,すなわち: ctx.clearRect(0, 0, wid, hei);
今回はDrawSnow関数数定义如下:
JavaScript コード复制コンテンツ到剪贴板
-
-
関数 DrawSnow() {
-
ctx.clearRect(0, 0, wid, hei);
-
ctx.fillStyle = "白";
-
ctx.beginPath();
-
for (var i = 0; i < snow; i ) {
- var p = arr[i];
- ctx.moveTo(p.x, p.y);
- ctx.arc(p.x, p.y, p.r, 0, 2 * Math.PI, false);
- }
- ctx.fill();
- SnowFall();
- ctx.closePath();
- }
最後に実行setInterval(DrawSnow, 50);
OK、上記の手順を経て、小さなパートナーはすべての手順と技術が完了したかどうかを確認しました。
完整代码如下(大家可以直接自己项目中行,测试下効果):
XML/HTML コード复制コンテンツ到剪贴板
- >
- <html>
-
-
<頭>
-
<meta charset="utf- 8" />
- <タイトル>タイトル>
-
<script src="js/ jquery-1.8.3.min.js">スクリプト>
-
<スタイル タイプ="text/ css">
-
* {
-
マージン: 0;
-
パディング: 0;
-
}
-
-
#mycanvas {
-
背景: 黒。
-
}
-
スタイル>
-
頭>
-
- <ボディ>
- <canvas id="mycanvas" >
- お使いのブラウザはキャンバスをサポートしていません
- キャンバス>
-
<スクリプト>
-
//mycanvas キャンバスを取得
-
var can = ドキュメント.getElementById("mycanvas");
var -
ctx = can.getContext("2d");
//キャンバス幅
- var
wid-
= window.innerWidth;
//キャンバスの高さ
var - hei
= -
ウィンドウ.innerHeight;
can.width = wid;
-
can.height = ヘイ
//雪の結晶の数 -
var 雪
= -
100
;
-
//スノーフレークの座標、半径
var arr = [] //各円の座標と半径を保存します
;
- for (var
i-
= 0; i
<- 雪 ) { ;
arr.push({
x: Math.random() * wid,
- y: Math.random() * hei,
- r: Math.random() * 10 1
- })
- }
- //画雪花
- function DrawSnow() {
- ctx.clearRect(0, 0, wid, hei);
- ctx.fillStyle = "white";
- ctx.beginPath();
- for (var i = 0; i < snow; i ) {
- var p = arr[i];
- ctx.moveTo(p.x, p.y);
- ctx.arc(p.x, p.y, p.r, 0, 2 * Math.PI, false);
- }
- ctx.fill();
- SnowFall();
- ctx.closePath();
- }
- //雪花飘落
- function SnowFall() {
- for (var i = 0; i < snow; i ) {
- var p = arr[i];
- p.y = Math.random() * 2 1;
- if (p.y > hei) {
-
p.y = 0;
-
}
-
p.x = Math.random() * 2 1;
-
if (p.x > wid) {
-
p.x = 0;
-
}
-
}
-
}
-
setInterval(DrawSnow, 50);
-
script>
-
body>
-
-
html>
-
好了,今天分享就到这里,希望对大家的学习有所帮助。
原文:http://www.cnblogs.com/tangyifeng/p/5253629.html