この記事では、花火効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します。具体的な内容は次のとおりです。 このエフェクトはオブジェクト指向プログラミングを使用しています 分析する非公式
上へ飛ぶ OOD クラス FireWork{ コンストラクタ(){ } バインドイベント(){ _this = this とします。 ele.onclick = 関数(){ //fly が終了したら、boom を呼び出します function_this.fly(_this.boom); } } 飛ぶ(ブーム){ } ブーム(){ } } CSSデザインの実装 CSSコード *{ マージン: 0; パディング: 0; } #箱{ 幅:800ピクセル; 高さ:600px; 位置: 相対的; マージン: 100px 自動; 背景:#000000; border:2px 赤一色; オーバーフロー: 非表示; } 。ボール{ 幅: 40px; 高さ: 40px; 境界線の半径: 50%; 位置: 絶対; 下部: 0; } JSプログラミング実装 JavaScript コード <script src="./utils.js"></script> <スクリプト> // クラス FireWork{ コンストラクタ(){ this.box = document.getElementById("box"); this.box_offset = { 左: box.offsetLeft、 上: box.offsetTop } } バインドイベント(){ _this = this とします。 this.box.onclick = 関数(e){ e = e || イベント; _this.x = e.clientX - _this.box_offset.left; _this.y = e.clientY - _this.box_offset.top; _this.fly(_this.boom); } } 飛ぶ(ブーム){ ele = this.createEle() とします。 _this = this とします。 //ボックスに入れます。 ele.style.left = this.x + "px"; _left = this.x とします。 _top = this.y とします。 アニメーション(ele, { トップ : this.y } 、 関数(){ 要素を削除します。 _this.boom( _left 、 _top ); }); } ブーム(x,y){ r = 100 とします。 count = 0 とします。 _this = this とします。 for(i = 0 ; i < 20 ; i++){ ele = this.createEle() とします。 ele.style.left = x + "px"; ele.style.top = y + "px"; _left = parseInt(Math.cos( Math.PI / 10 * i ) * r ) + x とします。 _top = parseInt(Math.sin( Math.PI / 10 * i ) * r) + y とします。 アニメーション(ele, { 左 : _左、 トップ: _top, 不透明度: 0 } 、 関数(){ 要素を削除します。 }) } } 要素を作成します(){ ele = document.createElement("div"); とします。 ele.className = "ボール"; ele.style.backgroundColor = `rgb(${parseInt(Math.random() * 255)},${parseInt(Math.random() * 255)},${parseInt(Math.random() * 255)})`; this.box.appendChild(ele); 要素を返します。 } } 新しい FireWork().bindEvent(); </スクリプト> 参照される utils.js ファイル 関数 on(dom, イベント名, ハンドラーセレクター, 委任ハンドラー) { if( typeof handler_selector === "文字列" && typeof delegation_handler === "関数"){ delegation(dom、event_name、handler_selector、delegation_handler) を返します。 } // DOM オブジェクトにイベント名を作成します。イベント処理関数に対応する配列です。 // 現在のイベント処理関数が DOM オブジェクト内にあるかどうかを判断します。 var イベントタイプ = "_" + イベント名; if (event_type in dom) { dom[イベントタイプ].push(ハンドラセレクタ); } それ以外 { dom[イベントタイプ] = [ハンドラセレクタ]; } // オブジェクトのキー値としてイベント名を直接使用すると、元の DOM 関数名と競合します。 // 特殊なイベント名を使用するとイベントがトリガーされなくなるため、ここでイベント名を分割する必要があります。 dom.addEventListener(イベント名.split(".")[0], ハンドラーセレクター) } 関数 off(dom, イベント名) { // DOM オブジェクト内のイベント名に対応するイベント処理関数のセットを取得します。 var callback_list = dom["_" + イベント名]; // リスト内のすべての関数に従ってイベントを削除します。 callback_list.forEach(関数 (イベントハンドラ) { dom.removeEventListener(イベント名.split(".")[0], イベントハンドラ); }) // DOM オブジェクト内のイベント処理関数グループをクリアします。 dom["_" + イベント名].length = 0; } 関数トリガー(dom, イベントタイプ) { dom.dispatchEvent(新しいイベント(event_type)); } 関数委任(dom, イベント名, セレクター, イベントハンドラー) { dom.addEventListener(イベント名、関数(e) { e = e || イベント; var ターゲット = e.target || e.srcElement; while (ターゲット !== dom) { スイッチ(セレクタ[0]){ 場合 "。": if (selector.slice(1) === target.className) { イベントハンドラの呼び出し(ターゲット、e) 戻る; } 場合 "#": if (selector.slice(1) === target.id) { イベントハンドラの呼び出し(ターゲット、e) 戻る; } デフォルト: if (selector.toUpperCase() === target.nodeName) { イベントハンドラの呼び出し(ターゲット、e) 戻る; } } ターゲット = target.parentNode; } }) } 関数 animate( dom , attrs , callback , transition = "buffer", speed = 10 ){ // 遷移: アニメーション モードには「バッファ」と「ライナー」の 2 つがあります var _style = getComputedStyle(dom); // - 1. データの変形; for(var attr in attrs){ attrs[属性] = { ターゲット: attrs[attr], 現在:_style[属性] } // - 2. 速度: 等速運動の正または負の速度。 if( 遷移 === "ライナー" ){ attrs[attr].speed = attrs[attr].target > attrs[attr].now ? speed : - speed; } if( attr === "不透明度"){ attrs[attr].target *= 100 attrs[attr].now *= 100 }それ以外{ attrs[attr].now = parseInt(attrs[attr].now) } } // - 開始タイマーをオフにします。 間隔をクリアします(dom.interval); dom.interval = setInterval( 関数() { for(var attr in attrs){ // 現在の値と属性値を取得します。 // attrs[attr].target: ターゲット値; // attrs[attr].now: 現在の値; {target, now} = attrs[attr]とします。 // バッファリング速度; if( 遷移 === "バッファ" ){ var speed = (ターゲット - 現在) / 10 ; 速度 = 速度 > 0 ? Math.ceil( 速度 ) : Math.floor( 速度 ); }else if(transition === "liner"){ var speed = attrs[attr].speed; } if( Math.abs(ターゲット - 現在) <= Math.abs(速度) ){ if( attr === "不透明度"){ dom.style[attr] = ターゲット / 100; }それ以外{ dom.style[attr] = ターゲット + "px"; } attrs[attr]を削除します。 for(var attr in attrs){ // データがある場合、ループは少なくとも 1 回実行されます。 false を返します。 } dom.interval をクリアします。 typeof callback === "function" ? callback() : ""; }それ以外{ 今 += 速度; if( attr === "不透明度"){ dom.style[attr] = 現在 / 100; }それ以外{ dom.style[attr] = now + "px"; } // オブジェクトに値を割り当てます。 attrs[attr].now = now; } } } 、30) } 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Linux 面接で最もよく聞かれる 10 の質問のまとめ
>>: MySQL データベースの最適化: インデックスの実装原則と使用状況の分析
序文私は、Web サイトのフロントエンド パフォーマンス最適化のための JavaScript と C...
実験環境: MYSQL 5.7.22バイナリログを有効にするログ形式 MIXED実験プロセス: 1....
まず、空気質データと地図データを組み合わせる必要があります。マップデータには属性名があるさまざまな都...
apache: ポートに基づいて仮想ホストを作成する仮想ホスト(a、b、c)の作成を例に挙げます1)...
序文スクロールやサイズ変更などのスクロール イベントがトリガーされると、トリガーの頻度が非常に高くな...
各ブラウザの select タグのプロパティと各ブラウザのサポートが多少異なるため、各ブラウザでの選...
初回の読み込みを高速化できるルートの遅延読み込みをどうして忘れられるでしょうか?ルーティングの遅延読...
関連記事:初心者が学ぶ HTML タグ (5)導入された HTML タグは、必ずしも XHTML 仕...
MySQL マルチテーブルクエリ (直積原理)まず、データが使用するテーブルを決定します。デカルト...
目次序文プロミスチェーンMDN エラー連鎖デフォルト処理略語非同期待機序文この記事を書いた理由は、ユ...
目次1. html2Canvasをインストールする2. 必要なVueコンポーネントを導入する3. ス...
1. 背景インターネット アプリケーションの急速な更新と反復という状況では、従来の手作業や単純なスク...
序文この記事では主にMySQLのメモリ使用量に関する関連コンテンツを紹介し、皆さんの参考と学習のため...
MySQL を頻繁に使用する人は、次のような状況に遭遇する可能性があります。 1. フィールド タ...
コンテナデータボリュームとはデータがコンテナ内にある場合、コンテナを削除するとデータは失われます。例...