HTML5で雪の効果を実現する方法
キャンバスを使用して雪のエフェクトを作成しましょう:
まずこのエフェクトを分析してみましょう:
2. 雪の結晶は同時に生成されません。
3. 雪の結晶をどのように表現しますか4. 雪はどのようにして降り続けるのですか5. 雪の結晶は大きくても小さくても構いませんまず、この効果は次のとおりです。これは、キャンバスを動的に作成し、ブラウザ全体の幅と高さをキャンバスに割り当てますvar Canvas = function (w, h) { this.width = w; this.height = h; } Canvas.prototype = { init: function () { var oC = document.createElement("canvas"); oC.setAttribute('width', this.width); oC.setAttribute('height', this.height); oC.setAttribute('id', 'canvas'); oC.style.backgroundColor = '#000'; document.body.appendChild(oC); } } var curWinWidth = window.innerWidth, curWinHeight = window.innerHeight; var oCanvas = new Canvas(curWinWidth, curWinHeight); oCanvas.init();
。oCanvas オブジェクトの init メソッドを呼び出した後、キャンバスが末尾に追加されます。ボディはキャンバス、幅は 、高さはブラウザの幅と高さと同じ、背景は黒、夜の雪の効果です
次に、ステージでは、俳優の時間です。ステージに上がってください、雪の結晶を生成するにはどうすればよいですか?ここで、雪関連の操作はクラスにカプセル化されます。その基本構造は次のとおりです。 var Snow = function(){}
Snow.prototype = {
init : function(){},
draw : function( cxt ) {},
update : function(){}
}
init: 雪の結晶の位置を初期化します (x)。 、y 座標)、速度、半径 (雪の結晶のサイズ。ここでは雪の結晶を表すために異なる半径の円を使用します)
function random(min, max) { return Math.random() * (max - min) + min; } init: function () { this.x = random(0, width); this.y = 0; this.r = random(1, 5); this.vy = random(3, 5); }
その後、init にこのランダム関数を加えて雪の結晶の初期化を完了できます
1 雪の結晶が出てくると、それらは雪の結晶になります。通常、画面の上部に表示されるため、雪の結晶の y 座標はすべて 0 になります。次に、雪の結晶の x 座標は、画面の左から右までランダムであるため、0 になります。 ~ width この幅は、ブラウザの幅です
2、雪の結晶の半径r、1〜5の任意の値に設定します
3、雪の結晶の落下速度は3〜5の間でランダムな速度に設定します。ここでは雪を垂直方向に降らせます。拡張して風の影響を考慮することができます(このとき水平方向の速度が必要です)
これらの初期化パラメータを使用すると、描画メソッドを改良して雪の結晶を描画します:
draw: function (cxt) { cxt.beginPath(); cxt.fillStyle = 'white'; cxt.arc(this.x, this.y + this.r, this.r, 0, Math.PI * 2, false); cxt.fill(); cxt.closePath(); this.update(cxt); },
パラメータ cxt はキャンバスのコンテキストで、この関数は最後に円 (雪の結晶) を描画するために init に設定された値を呼び出す非常に単純な関数です。このメソッドでは、update メソッドが呼び出され、何をするのでしょうか?雪の結晶の垂直方向の速度を更新します
update: function (cxt) { if (this.y < height - this.r) { this.y += this.vy; } else { this.init(); } }
更新メソッドでは、雪の結晶が下に落ちると必ず消えるという境界判断を行います。 消えた後はどうするか。国境に達していない場合はどうすればよいですか?
キャンバスの高さから雪の結晶の半径を引いたものです。これは雪の結晶が消えようとするときの境界であるため、 this.y < height - this.r この条件が true の場合、雪の結晶が消えたことを意味します。浮いているので、雪の結晶を変更する必要があります。y 方向の位置が更新され、雪の結晶は次のようになります (「雪が降っています」)。雪の結晶が消えそうになったら、最初の位置に移動します。雪の結晶を再描画することなく、雪が円状に降り続いているようにします (これを行うと、間違いなくパフォーマンスに影響し、この特殊効果は最終的に確実に行き詰まってしまいます。この小さなトリックは、多くの同様の特殊効果で使用されています)。 。この時点で、主要なプロセスは完了しました。次に、大量の雪の結晶を生成します。
var snow = []; for (var i = 0; i < 500; i++) { setTimeout(function () { var oSnow = new Snow(); oSnow.init(); snow.push(oSnow); }, 10 * i); }
同時にではなく 500 個の雪の結晶を生成し、これらの雪の結晶を配列 Snow に保存します。
その後、タイマーを開始して雪の結晶が降り続けるようにします
requestAnimationFrame の使用については、を参照してください。私の記事 記事: [JS Master's Road] HTML5 の新しいタイマー requestAnimationFrame 実際のプログレスバー
(function move() { oGc.clearRect(0, 0, width, height); for (var i = 0; i < snow.length; i++) { snow[i].draw(oGc); } requestAnimationFrame(move); })();
完全なデモコード:
雪花效果 - by ghostwu <script> window.onload = function () { var Canvas = function (w, h) { this.width = w; this.height = h; } Canvas.prototype = { init: function () { var oC = document.createElement("canvas"); oC.setAttribute(&#39;width&#39;, this.width); oC.setAttribute(&#39;height&#39;, this.height); oC.setAttribute(&#39;id&#39;, &#39;canvas&#39;); oC.style.backgroundColor = &#39;#000&#39;; document.body.appendChild(oC); } } var curWinWidth = window.innerWidth, curWinHeight = window.innerHeight; var oCanvas = new Canvas(curWinWidth, curWinHeight); oCanvas.init(); var oC = document.querySelector('#canvas'); var width = oC.width, height = oC.height, oGc = oC.getContext('2d'); function random(min, max) { return Math.random() * (max - min) + min; } var Snow = function () { } Snow.prototype = { init: function () { this.x = random(0, width); this.y = 0; this.r = random(1, 5); this.vy = random(3, 5); }, draw: function (cxt) { cxt.beginPath(); cxt.fillStyle = &#39;white&#39;; cxt.arc(this.x, this.y + this.r, this.r, 0, Math.PI * 2, false); cxt.fill(); cxt.closePath(); this.update(cxt); }, update: function (cxt) { if (this.y < height - this.r) { this.y += this.vy; } else { this.init(); } } } var snow = []; for (var i = 0; i < 500; i++) { setTimeout(function () { var oSnow = new Snow(); oSnow.init(); snow.push(oSnow); }, 10 * i); } (function move() { oGc.clearRect(0, 0, width, height); for (var i = 0; i < snow.length; i++) { snow[i].draw(oGc); } requestAnimationFrame(move); })(); } </script>
以上がHTML5で雪の効果を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

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