花火効果を実現する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 データベースの最適化: インデックスの実装原則と使用状況の分析

推薦する

CSS フォーム検証機能の実装コード

レンダリング原理フォーム要素には、正規表現(携帯電話番号、メールアドレス、IDカードなど)をカスタマ...

MySql のグループ化と各グループからランダムに 1 つのデータを取得する

アイデア: 最初にランダムに並べ替えてからグループ化します。 1. テーブルを作成します。 テーブル...

WeChatアプレット学習ノート: ページ構成とルーティング

最近、小さなプログラムの開発を勉強して見直しており、学習結果のいくつかをメモしています。公式の We...

Dockerイメージをプライベートリポジトリにアップロードする方法の例

イメージは、GitHub と同様に Docker パブリック リポジトリに直接簡単にプッシュできます...

MySQL 8.0.15 のインストールと設定のグラフィックチュートリアル

この記事ではMySQL 8.0.15のインストールと設定方法を参考までに記録します。具体的な内容は以...

Linux でアップロードされたファイルのスケジュールされたバックアップと増分バックアップを実装する方法

導入Alibaba Cloud のような OSS ストレージ サービスを使用している場合は、サービス...

DockerコンテナでLNMPをコンパイルする例

目次1. プロジェクトの説明2. Nginxイメージの作成3. MySQLイメージの作成4. PHP...

Centos 7 64 ビット デスクトップ バージョンのインストール グラフィック チュートリアル

システムが遅いと感じてソースを変更したい場合は、別の記事で整理しました https://blog.c...

Vueプロジェクトのフロントエンドを最適化およびパッケージ化するための必須のボーナスアイテム

目次序文1. ルーティングの遅延読み込み1. ルートの遅延読み込みが必要なのはなぜですか? 2. ル...

CSS スタイルを変更してグレーの Web ページ (色なし、明るい白黒のみ) を実現するいくつかの方法

通常、清明節、国哀悼日、大地震の日、影響力のある偉人の死去または命日には、ウェブマスターとして、故人...

Vue バッチ更新 DOM 実装手順

目次シーン紹介深い応答性トリガーゲッターDep.targetを探すゲッターセッター要約するシーン紹介...

本をめくる効果を実現するネイティブJS

この記事では、ネイティブ JS で実装された本をめくる効果の図を紹介します。効果は次のとおりです。 ...

Vueナンバープレート入力コンポーネントの使い方の詳しい説明

参考までに、シンプルなナンバープレート入力コンポーネント(vue)です。具体的な内容は次のとおりです...

div タグ内の要素の margin-top が無効である場合の解決策

タイトル通りです。その質問は非常に奇妙です。要素の親タグはdivで、幅や高さなどの属性は設定されてい...

CentOS 7.x のマスターおよびスレーブ DNS サーバーの展開

1. 準備例: 2 台のマシン: 192.168.219.146 (マスター)、192.168.21...