
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.
まとめ
今回紹介した波形アニメーションをサイトに取り入れることで、視覚的な魅力をグッと上げることができます。
簡単に実装できるので、是非サイトに取り入れてみてください!
弊社では、サイトの運営に手が回らないという方のために、更新代行作業も承っております。同じ手順でやったけどうまくいかない場合は、ぜひ一度ご相談ください。
この記事が少しでも皆さまのお役に立てば幸いです。最後までお読みいただき、ありがとうございました。