
【JavaScript入門】DOM操作:CSSの変更によるアニメーション
ここでは、時間経過に合わせてスタイル値を書き換えることで、要素の見た目が徐々に変化するアニメーションを実装する方法を、主に【requestAnimationFrame】と【.animate()】という2つのアプローチを例示しながら説明します。なお、サンプルコードでは背景に「泡」が上方向に移動するアニメーションを例として採用し、画面タイトルには絵文字を入れて簡易的なCSSによる装飾を施しています。また、プログラム内に日本語のメッセージやコメントを記載しており、各処理の詳細な解説を付けています。

1. CSSの値変更によるアニメーションの基本原理
1.1. アニメーションタイミング制御のためのメソッド
アニメーション処理は、一定時間ごとに要素のスタイルを更新することで実現されます。従来は setInterval() を用いた方法もありますが、現在ではブラウザの描画タイミングに合わせた requestAnimationFrame() を用いることで、よりスムーズなアニメーションが可能です。下記の表に、アニメーション制御の代表的なメソッドをまとめます。
メソッド | 説明 |
---|---|
requestAnimationFrame(f) | ブラウザの描画タイミングでコールバック関数を実行し、アニメーションを効率的に更新する。requestID を返す。 |
cancelAnimationFrame(id) | 指定した requestID に対応するアニメーション処理をキャンセルする。 |
1.2. サンプルコードによる実例:泡が上に流れるアニメーション
以下のコードでは、まずダミーテキストを生成してページ下部に配置し、その後、複数の「泡」要素(丸い div 要素)をランダムな初期位置に配置します。次に、requestAnimationFrame() を使って各泡の位置を毎フレーム更新し、ゆっくり上に移動させることで、画面上で泡が浮かび上がるようなアニメーションを実現しています。
ファイル名: cssChangeAnimation.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>✨ CSS変更アニメーション入門</title>
<style>
/* 泡要素用のスタイル */
.bubble {
position: fixed; /* 固定位置 */
z-index: -99; /* 背景に表示 */
width: 80px; /* 幅 */
height: 80px; /* 高さ */
border-radius: 40px; /* 丸い形状 */
background: #3498db; /* 青系の背景色 */
opacity: 0.3; /* 半透明 */
}
/* ダミーテキスト用のスタイル(任意) */
body {
font-family: sans-serif;
margin: 0;
padding: 10px;
background: #f7f9fc;
}
</style>
</head>
<body>
<script>
// STEP 1: ダミーテキストの生成と追加
// 「あふれるインスピレーション」を500回繰り返して、ページ内にテキストノードとして追加
const dummyText = 'あふれるインスピレーション '.repeat(500);
const textNode = document.createTextNode(dummyText);
document.body.appendChild(textNode);
// STEP 2: 泡要素の生成
// 画面に表示する泡の数を決定し、各要素を作成する
const bubbleCount = 20;
const bubbles = [];
for (let i = 0; i < bubbleCount; i++) {
const bubble = document.createElement('div');
bubble.classList.add('bubble');
// x, y 座標は画面内のランダムな位置(泡サイズを考慮)
const x = Math.random() * window.innerWidth - 40;
const y = Math.random() * window.innerHeight - 40;
bubble.style.left = `${x}px`;
bubble.style.top = `${y}px`;
bubbles.push(bubble);
document.body.appendChild(bubble);
}
// STEP 3: requestAnimationFrame() を用いたアニメーション処理
// 前回のフレーム時刻を記録する変数を用意
let lastTime = performance.now();
// アニメーション関数:各フレームごとに泡の位置を更新する
function animate(currentTime) {
// 前回からの経過時間(ミリ秒)
let deltaTime = currentTime - lastTime;
lastTime = currentTime;
// 各泡の位置を更新
bubbles.forEach(bubble => {
// 現在の y 座標を取得(文字列を数値に変換)
let currentY = parseFloat(bubble.style.top);
// deltaTime に応じて上方向へ移動(ここでは100で割って速度を調整)
let newY = currentY - deltaTime / 100;
// 画面の上端を超えた場合は、下端に再配置
if (newY < -80) {
newY = window.innerHeight;
}
bubble.style.top = newY + "px";
});
// 次のフレームをリクエストして、再び animate 関数を呼び出す
requestAnimationFrame(animate);
}
// STEP 4: アニメーション開始
requestAnimationFrame(animate);
</script>
</body>
</html>
1.3. 動作例の解説
初期状態
このプログラムをブラウザで実行すると、以下のような動作が観察できます。
- ページ内には、背景にダミーテキストが表示され、画面上には20個の半透明な青色の泡がランダムな位置に配置されています。

アニメーション中
- requestAnimationFrame() により、各フレームごとに各泡の y 座標が減算され、泡がゆっくりと上方向に移動します。
- もし泡が画面上端(-80px)を超えると、即座に画面下端(window.innerHeight)に再配置され、連続的な上昇アニメーションが実現されます。
プログラム解説
performance.now() メソッド
performance.now()
は、現在の時刻をミリ秒単位(小数点以下も含む)で返すメソッドです。例えば、戻り値は 1234.5678 のような数値となり、時間計測を非常に高い精度で行いたいときに利用されます。
2. Web Animations API を用いたアプローチの概要
近年では、要素に対するアニメーション処理をより宣言的に記述できる .animate() メソッドが登場しています。以下の表に、.animate() に関する基本的なメソッドとプロパティについてまとめます。
メソッド | 説明 |
---|---|
.animate(a, b) | 引数 a で変化させるスタイル設定、b でタイミングなどの詳細設定を指定し、Animationオブジェクトを返す。 |
プロパティ | 説明 |
---|---|
duration | アニメーションにかける時間(ミリ秒) |
delay | アニメーション開始前の遅延時間(ミリ秒) |
easing | イージング(変化の滑らかさなどの動作の指定) |
endDelay | アニメーション終了後に待機する時間(ミリ秒) |
※ .animate() を使った場合、要素はキー フレームごとに指定したスタイルに沿って変化していき、Promise を返す finished プロパティを用いることで、アニメーション終了後の処理が容易に連携できます。
ここでは主に requestAnimationFrame() を使った手法について詳しく解説しましたが、より宣言的なアプローチを求める場合は .animate() メソッドの活用も検討してください。
まとめ
ここでは、CSSの変更によるアニメーション実現の基本手法について説明しました。
- まず、JavaScriptを用いて要素のスタイル値(ここでは、位置を表す top プロパティ)を時間経過に合わせて更新する方法として、requestAnimationFrame() を用いた実装例を示しました。
- さらに、Web Animations API の .animate() メソッドによる宣言的なアプローチの概要と、関連するプロパティやメソッドを表形式で整理しました。
これらの手法を理解することで、より自然で効率的なアニメーション表現が可能となり、ユーザーに魅力的なインターフェースを提供できるようになります。