Webサイトにほんの少し動きを加えるだけで、デザインの印象は大きく変わります。
今回は、背景やコンテンツのアクセントにぴったりな「波形アニメーション」を、コピペだけで簡単に実装できる方法をご紹介します。

今回の記事で分かること
背景やコンテンツの装飾として使える波形アニメーションを、コピペで簡単に実装する方法と、そのカスタマイズ方法がわかります。

完成デモの紹介

まずはデモをご覧ください。

See the Pen 波形アニメーション by はなはな氏 (@wxftomuu-the-selector) on CodePen.

ソースコードについて

HTML

波を描画したい場所にcanvasタグを置いてください。

<h3>波形アニメーション</h3>

<canvas id="waveCanvas"></canvas>

CSS

今回は親要素のボトムに配置しています。必要に応じてカスタマイズしてください。

/* コンテンツスタイル
-------------------------*/
body {
  background: #1a8093;
}
h3 {
  text-align: center;
  color: #fff;
}
/* 波形スタイル
-------------------------*/
canvas#waveCanvas { 
  position: absolute; 
  bottom: 0; 
  left: 0; 
} 

JS

下記コードをそのまま貼り付けるだけで、白から水色へグラデーションする滑らかな波を1本描画できます。

// 波形アニメーション
// ----------------------------------
var unit = 100,               // 波の高さ
    waves = [],               // キャンバスと波設定の配列
    info = { seconds: 0, t: 0 }, // アニメーション時間の管理
    lastTime = performance.now(); // 前フレームの時間

// 初期化処理
function init() {
  // --- キャンバスと波設定を登録 ---
  waves.push({
    canvas: document.getElementById("waveCanvas"), // キャンバス要素
    settings: [
      // [透明度, 波長倍率, 位相差, 上色, 下色]
      [1, -1, 0, '#ffffff', '#78e1ff']
    ]
  });

  resizeCanvas(); // 初期サイズ設定

  // リサイズ時にもキャンバス幅を更新
  window.addEventListener("resize", resizeCanvas);

  // 描画ループ開始
  requestAnimationFrame(update);
}

// キャンバスサイズを画面幅に合わせる
function resizeCanvas() {
  for (var i = 0; i < waves.length; i++) {
    var canvas = waves[i].canvas;
    canvas.width = document.documentElement.clientWidth; // 画面幅
    canvas.height = 100; // キャンバスの高さ(波の高さを超えない範囲で変更可)
    canvas.contextCache = canvas.getContext("2d"); // コンテキストを保存
  }
}

// 描画ループ
function update(now) {
  // 経過時間(秒)
  var dt = (now - lastTime) / 1000;
  lastTime = now;

  // 時間を進める(波の位相計算用)
  info.seconds += dt;
  info.t = info.seconds * Math.PI;

  // 各キャンバスを描画
  for (var i = 0; i < waves.length; i++) {
    draw(waves[i].canvas, waves[i].settings);
  }

  requestAnimationFrame(update); // 次フレーム
}

// 単一キャンバスの波をすべて描画
function draw(canvas, settings) {
  var context = canvas.contextCache;
  context.clearRect(0, 0, canvas.width, canvas.height); // 一旦クリア

  for (var i = 0; i < settings.length; i++) {
    var alpha = settings[i][0];       // 透明度
    var zoomSetting = settings[i][1]; // 波長倍率(-1は自動調整)
    var delay = settings[i][2];       // 位相差
    var colorTop = settings[i][3];    // 上の色
    var colorBtm = settings[i][4];    // 下の色

    // zoom = -1 の場合はデバイス幅で可変
    var zoom = (zoomSetting === -1)
      ? (canvas.width <= 768 ? 2 : 3) // スマホ:2, PC:3
      : zoomSetting;

    drawWave(canvas, colorTop, colorBtm, alpha, zoom, delay);
  }
}

// 波形塗りつぶし
function drawWave(canvas, topColor, bottomColor, alpha, zoom, delay) {
  var context = canvas.contextCache;

  // 縦グラデーション作成
  var gradient = context.createLinearGradient(0, 0, 0, canvas.height);
  gradient.addColorStop(0, topColor);
  gradient.addColorStop(1, bottomColor);

  context.fillStyle = gradient;
  context.globalAlpha = alpha; // 透明度適用
  context.beginPath();

  // 波形のパスを作成
  drawSine(canvas, info.t, zoom, delay);

  // 下端を閉じる
  context.lineTo(canvas.width + 10, canvas.height);
  context.lineTo(0, canvas.height);
  context.closePath();
  context.fill();

  context.globalAlpha = 1; // 透明度をリセット
}

// サイン波パスの生成
function drawSine(canvas, t, zoom, delay) {
  var xAxis = Math.floor(canvas.height / 2); // 波の中心高さ
  var yAxis = 0;
  var context = canvas.contextCache;

  var x = t;
  var y = Math.sin(x) / zoom;
  context.moveTo(yAxis, unit * y + xAxis);

  // 10px ごとに座標を計算して線をつなぐ
  for (var i = yAxis; i <= canvas.width + 10; i += 10) {
    x = t + (-yAxis + i) / unit / zoom;
    y = Math.sin(x - delay) / 3; // delayで波の位置をずらす
    context.lineTo(i, unit * y + xAxis);
  }
}

init();

下記の項目を調整することで、好みに合わせた波形アニメーションにカスタマイズできます。

パラメータ 役割 説明
unit 波の高さを決める基準値 大きくすると高い波、小さくすると穏やかな波になる。
info.t 波の動く速さを決める時間係数(位相) 値を大きくすると波が速く、小さくするとゆっくり動く。
具体的には info.seconds * Math.PI * 2 とすると2倍の速さとなる。
透明度(alpha) 波の透明度(0〜1) settingsの第1引数。0~1の範囲で指定。0に近づくにつれ透明になる。
波長倍率(zoom) 波の横方向の間隔 settingsの第2引数。大きくすると細かい波、小さくするとゆったりした波になる。
-1に設定すると、画面幅に応じて波長を変えることができる。
位相差(delay) 波を描くタイミングのずれ 値を変えると山と谷の位置がずれ、重ねても自然な動きになる。
デモのように波が1つの場合は、位置をずらす必要がないため0に設定している。
上色(colorTop) 波の上端の色 波の上の色を設定する。グラデーションが必要ない時は同色を設定。
下色(colorBtm) 波の下端の色 波の下の色を設定する。グラデーションが必要ない時は上色と同色を設定。

完成デモ2の紹介

最後に、複数の波を重ねたデモをご紹介いたします。

See the Pen 波形アニメーション(複数の波) by はなはな氏 (@wxftomuu-the-selector) on CodePen.

まとめ

今回紹介した波形アニメーションをサイトに取り入れることで、視覚的な魅力をグッと上げることができます。
簡単に実装できるので、是非サイトに取り入れてみてください!

弊社では、サイトの運営に手が回らないという方のために、更新代行作業も承っております。同じ手順でやったけどうまくいかない場合は、ぜひ一度ご相談ください。

この記事が少しでも皆さまのお役に立てば幸いです。最後までお読みいただき、ありがとうございました。

おすすめの記事