js キャンバスで円形の水のアニメーションを実現

js キャンバスで円形の水のアニメーションを実現

この記事の例では、円形の水のアニメーションを実現するためのキャンバスの具体的なコードを参考までに共有しています。具体的な内容は次のとおりです。

序文

特殊効果表示

エフェクト表示

コードショーケース

インデックス.html

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
    <メタ文字セット="UTF-8">
    <meta http-equiv="X-UA-compatible" content="IE=edge">
    <meta name="viewport" content="width=デバイス幅、初期スケール=1.0">
    <title>ドキュメント</title>
    <!-- <link rel="スタイルシート" href="style.css" > -->
</head>
<本文>
    <script src="main.js"></script>
</本文>
</html>

メイン.js

/*
 * ノエル・デルガド - @pixelia_me
 */

(関数() {
  var ctx、w、h、cx、cy、PI、PI_HALF、cos、sin、ランダム、lineWidth、C、 
      リング、リングの長さ、データ;

  ctx = document.createElement('canvas').getContext('2d');
  600 です
  600;
  cx = (w / 2);
  cy = (h / 2);
  リング = [];
  リングの長さ = 0;
  
  PI = Math.PI;
  PI_HALF = PI / 2;
  cos = Math.cos;
  sin = Math.sin;
  ランダム = Math.random;

  線幅 = 0.2;
  C = ["#ABF8FF"、"#E76B76"、"#1D2439"、"#4F3762"、"#67F9FF"、"#0C0F18"];
  
  データ = [
    /* リング {t:粒子の総数、r:半径、d:距離、s:速度、c:色} */
    [
      {t:80, r:(cx-10), d:40, s:30, c:C[1]},
      {t:60, r:(cx-20), d:40, s:80, c:C[2]},
      {t:20, r:(cx-30), d:20, s:80, c:C[2]},
    ]、
    [
     {t:80, r:(cx-80), d:40, s:40, c:C[4]},
       {t:80, r:(cx-90), d:20, s:40, c:C[4]},
       {t:20, r:(cx-100), d:20, s:40, c:C[2]},
       {t:40, r:(cx-110), d:20, s:40, c:C[2]},
    ]、
    [
     {t:60, r:(cx-160), d:40, s:20, c:C[2]},
       {t:20, r:(cx-170), d:30, s:60, c:C[2]},
       {t:40, r:(cx-180), d:40, s:60, c:C[2]},
    ]、
    [
     {t:40, r:(cx-230), d:40, s:20, c:C[5]},
       {t:20, r:(cx-240), d:20, s:10, c:C[5]},
    ]、
    [
       {t:10, r:(cx-290), d:10, s:10, c:C[4]}
    ]
  ];
 
  /* */
  ctx.canvas.width = w;
  ctx.canvas.height = h;
  document.body.appendChild(ctx.canvas);

  data.forEach(関数(グループ) {
    var リング = [];
    
    グループ.forEach(関数(軌道、i) {
      var total_particles、インデックス;
      
      合計粒子数 = orbit.t;
      インデックス = 0;
      
      for (; インデックス < total_particles; インデックス++) {
        var 半径、距離、速度、色、不透明度;

        半径 = orbit.r;
        距離 = orbit.d;
        速度 = ランダム() / 軌道.s;
        速度 = i % 2 ? 速度 : 速度 * -1;
        色 = orbit.c;
        不透明度 = orbit.o;

        ring.push(新しいP(半径、距離、速度、色、不透明度));

        半径 = 距離 = 速度 = 色 = 不透明度 = null;
      }
    });
    
    リングをプッシュします。
  });

  リングの長さ = リング.長さ;
 
  /* */
  関数 P(半径, 距離, 速度, 色) {
    this.a = PI / 180;
    this.d = 距離;
    this.d2 = (this.d * this.d);
    this.x = cx + 半径 * cos(this.a);
    this.y = cy + 半径 * sin(this.a);
    色を変更する
    ランダムな値を8に増やす
    this.R = random() > 0.5 ? 半径: 半径 - 5;
    this.s = 速度;
    this.pos = ランダム() * 360;
  }
  
  関数draw() {
    変数 i、j、k、xd、yd、d、リング、リングの長さ、リングの長さ2、粒子、p2;

    ctx.beginPath();
    ctx.globalCompositeOperation = "ソースオーバー";
    ctx.rect(0, 0, w, h);
    ctx.fillStyle = "#151a28";
    ctx.fill();
    ctx.closePath();

    (i = 0; i < リングの長さ; i++) {
      リング = rings[i];
      リングの長さ = リング.長さ;
      リングの長さ2 = リングの長さ - 100;
      
      (j = 0; j < リングの長さ; j++) {
        粒子 = リング[j];

        粒子.x = cx + 粒子.R * sin(PI_HALF + 粒子.pos);
        粒子.y = cy + 粒子.R * cos(PI_HALF + 粒子.pos);
        粒子.pos += 粒子.s;

        ctx.beginPath();
        ctx.globalAlpha = 0.12;
        ctx.globalCompositeOperation = "軽量";
        ctx.fillStyle = 粒子.c;
        ctx.arc(粒子.x、粒子.y、粒子.r、PI * 2、false);
        ctx.fill();
        ctx.closePath();

        (k = 0; k < リングの長さ2; k++) の場合 {
          p2 = リング[k];

          yd = p2.y - 粒子.y;
          xd = p2.x - 粒子.x;
          d = ((xd * xd) + (yd * yd));

          (d < 粒子.d2)の場合{
            ctx.beginPath();
            ctx.globalAlpha = 1;
            ctx.lineWidth = 線幅;
            ctx.moveTo(粒子.x、粒子.y);
            ctx.lineTo(p2.x, p2.y);
            ctx.strokeStyle = p2.c;
            ctx.stroke();
            ctx.closePath();
          }
        }
      }
    }
  }

  関数ループ() {
    描く();
    アニメーションフレームをリクエストします(ループ)。
  }

  ループ();
  
})();

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • 流れる水のような Js テキスト背景線特殊効果
  • JavaScript アニメーションの円運動、マウスの周りをボールのように動く

<<:  Linuxでmore、less、catコマンドを使用してファイルの内容を表示します

>>:  MySQL の最適化: サブクエリの代わりに結合を使用する

推薦する

HTML の基礎_一般的なタグ、共通タグ、表

パート 1 HTML <html> -- 開始タグ<ヘッド>ウェブページ上の...

HTML DOM入門_PowerNode Javaアカデミー

DOMとは何ですか? JavaScript を使用すると、HTML ドキュメント全体を再構築できます...

Vue の新しいおもちゃ VueUse の具体的な使い方

目次序文VueUseとは使いやすいおなじみの手ぶれ補正やスロットル機能もありますグローバル状態を共有...

実行中のDockerコンテナのポートマッピングを変更する方法

序文docker run がコンテナを作成して実行するときに、-p を使用してポート マッピング ル...

MySQL の組み込み関数 find_in_set を使用した効率的なあいまい検索の詳細な説明

一般的に使用される方法は次の 4 つです。 1.locate()メソッドを使用する一般的な使用法: ...

MySQL でよく使用されるステートメントの包括的な概要 (必読)

以下にまとめたナレッジポイントはどれもよく使われる貴重な情報ばかりですので、ぜひ上手に集めてください...

携帯電話番号が合法かどうかを判断するWeChatアプレットのサンプルコード

目次シナリオ効果コード要約するシナリオ登録ページに携帯電話番号を入力し、登録インターフェイスを要求す...

CSS3を使用してプログレスバー効果を実現し、動的にパーセンテージを追加する

プロジェクト中、プログレスバーを実装するために js の requestAnimationFrame...

MySQL 8.0.22 zip圧縮パッケージ版(無料インストール)のダウンロード、インストール、および構成手順の詳細

目次最初のステップはMySQLをダウンロードすることですステップ2: ダウンロードした圧縮パッケージ...

幅の比率に応じて高さを変えるCSSを実装するいくつかの方法

[解決策1: パディングの実装]原理:要素の padding の値がパーセンテージの場合、このパーセ...

CentOS 7 で Docker のポート転送をファイアウォールと互換性のあるように設定する方法

CentOS 7 では、次のようなコマンドを使用してホスト ポートをコンテナー ポートにマッピングす...

TypeScript の条件型に関する詳細な読書と実践記録

目次ジェネリック型での条件型の使用ツールタイプ脱出ポッド矢印関数で条件型を使用する型推論による条件型...

CSS属性のマージンの理解について話す

1.マージンとは何ですか?マージンは、要素の周囲のスペースの間隔を制御するために使用され、視覚的にス...

MySQL の不正な文字列値の解決方法

MySQL を使用して中国語の文字を挿入すると、多くの友人から次のエラーが報告されます。 これは、文...

Vue ミックスインの詳しい説明

目次ローカルミックスイングローバル ミックスイン要約するローカルミックスイン <テンプレート&...