花火効果を実現するJavaScript(オブジェクト指向)

花火効果を実現するJavaScript(オブジェクト指向)

この記事では、花火効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します。具体的な内容は次のとおりです。

このエフェクトはオブジェクト指向プログラミングを使用しています

分析する

非公式

  • クリックトリガーイベント
  • 花火大会は2つのステージに分かれています

上へ飛ぶ
爆発する

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 を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • 花火効果を実現するための js シミュレーション
  • 花火効果を実現するネイティブJS
  • とても美しいjs花火効果
  • クリック花火効果を実現する js
  • クールな花火効果を実現するjs
  • JavaScript でサウンド効果付きの花火効果を実装する
  • JavaScriptは5つの異なる花火効果を実装します

<<:  Linux 面接で最もよく聞かれる 10 の質問のまとめ

>>:  MySQL データベースの最適化: インデックスの実装原則と使用状況の分析

推薦する

フロントエンドパフォーマンス最適化に関する補足記事

序文私は、Web サイトのフロントエンド パフォーマンス最適化のための JavaScript と C...

誤って削除されたデータを復元するための mysqlbinlog コマンドを使用した mysql の実装

実験環境: MYSQL 5.7.22バイナリログを有効にするログ形式 MIXED実験プロセス: 1....

Javascript Echarts 空気質マップ効果の詳細な説明

まず、空気質データと地図データを組み合わせる必要があります。マップデータには属性名があるさまざまな都...

Apache ポートに基づいて仮想ホストを作成する例

apache: ポートに基づいて仮想ホストを作成する仮想ホスト(a、b、c)の作成を例に挙げます1)...

CSS フロントエンドページレンダリング最適化属性 will-change の具体的な使用法

序文スクロールやサイズ変更などのスクロール イベントがトリガーされると、トリガーの頻度が非常に高くな...

すべてのブラウザとの完全な互換性を実現するために最適なプリセットを選択してください

各ブラウザの select タグのプロパティと各ブラウザのサポートが多少異なるため、各ブラウザでの選...

Vue 実践における実用的な小さな魔法のまとめ

初回の読み込みを高速化できるルートの遅延読み込みをどうして忘れられるでしょうか?ルーティングの遅延読...

HTML チュートリアル: よく使われる HTML タグのコレクション (6)

関連記事:初心者が学ぶ HTML タグ (5)導入された HTML タグは、必ずしも XHTML 仕...

デカルト積原理を使用してMySQLで複数のテーブルをクエリする方法を簡単に説明します。

MySQL マルチテーブルクエリ (直積原理)まず、データが使用するテーブルを決定します。デカルト...

JS 非同期コードユニットテストの魔法 Promise

目次序文プロミスチェーンMDN エラー連鎖デフォルト処理略語非同期待機序文この記事を書いた理由は、ユ...

Vue を使用して Web ページのスクリーンショットを撮る方法をご存知ですか?

目次1. html2Canvasをインストールする2. 必要なVueコンポーネントを導入する3. ス...

Docker+Jenkins+Gitlab+Djangoアプリケーションデプロイ実践の詳細な説明

1. 背景インターネット アプリケーションの急速な更新と反復という状況では、従来の手作業や単純なスク...

MySQLのメモリ使用量を表示する方法の詳細な説明

序文この記事では主にMySQLのメモリ使用量に関する関連コンテンツを紹介し、皆さんの参考と学習のため...

MySQL の null 可能フィールドは NULL に設定する必要がありますか、それとも NOT NULL に設定する必要がありますか?

MySQL を頻繁に使用する人は、次のような状況に遭遇する可能性があります。 1. フィールド タ...

Dockerコンテナデータボリュームの原理と使用法の分析

コンテナデータボリュームとはデータがコンテナ内にある場合、コンテナを削除するとデータは失われます。例...