PORTFOLIO & WEB DESIGN MEMORANDOM BLOG   
PORTFOLIO & WEB DESIGN MEMORANDOM BLOG   

【JavaScript】非同期処理 (Promise + async/await) を使ったフェードインアニメーション

JavaScriptの非同期処理(Promiseとasync/await)を使って、複数の要素を順番にフェードインさせる方法をご紹介します。

Webサイトでよく見かける「ひとつずつ現れるアニメーション」。
これはちょっとした演出ですが、たった数行のコードで直感的に作ることができます!

※同期とは、ひとつのことが終わるまで、次のことを始められないことです。
非同期とは、待ち時間があってもプログラムは止まらず、別の作業を先に進められることです。

以下はコード全体になります。

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <title>順番にフェードイン</title>
  6.   <style>
  7.     body {
  8.       font-family: sans-serif;
  9.       padding: 20px;
  10.     }
  11.     .item {
  12.       opacity: 0;
  13.       transform: translateY(20px);
  14.       transition: opacity 0.6s ease, transform 0.6s ease;
  15.       margin-bottom: 10px;
  16.     }
  17.     .visible {
  18.       opacity: 1;
  19.       transform: translateY(0);
  20.     }
  21.     button {
  22.       margin-top: 20px;
  23.       padding: 10px 20px;
  24.     }
  25.   </style>
  26. </head>
  27. <body>
  28.   <h2>順番にフェードイン</h2>
  29.   <div class="item">First</div>
  30.   <div class="item">Second</div>
  31.   <div class="item">Third</div>
  32.   <div class="item">Fourth</div>
  33.   <button id="startBtn">アニメーション開始</button>
  34.   <script>
  35.     // 一定時間待つ Promise
  36.     function wait(ms) {
  37.       return new Promise(resolve => setTimeout(resolve, ms));
  38.     }
  39.     // 順番にフェードイン
  40.     async function fadeInItems() {
  41.       const items = document.querySelectorAll('.item');
  42.       for (const item of items) {
  43.         item.classList.add('visible');
  44.         await wait(500); // 0.5秒のタイムラグ
  45.       }
  46.     }
  47.     // ボタンをクリックしたら開始
  48.     document.getElementById('startBtn').addEventListener('click', fadeInItems);
  49.   </script>
  50. </body>
  51. </html>

See the Pen
Untitled
by ryotom (@ryotam-smoke)
on CodePen.

解説:Promise + async/await で「待つ」

1. wait(ms) — 指定時間待つ関数

  1. function wait(ms) {
  2.   return new Promise(resolve => setTimeout(resolve, ms));
  3. }

これは 指定したミリ秒(ms)だけ待機するPromise関数です。
resolve() を setTimeout の中で呼ぶことで、時間の経過を非同期で制御します。

2. fadeInItems() — 順番にアニメーション

  1. async function fadeInItems() {
  2.   const items = document.querySelectorAll('.item');
  3.   for (const item of items) {
  4.     item.classList.add('visible'); // CSSのtransitionが発動
  5.     await wait(500); // 0.5秒ずつズラして表示
  6.   }
  7. }

• for…of で .item クラスの要素を順に処理
• .classList.add(‘visible’) により、CSSアニメーションがスタート
• await wait(500) によって、前の要素が動き終わってから次へ進む!

3. イベントリスナーで発火

  1. document.getElementById('startBtn').addEventListener('click', fadeInItems);

ボタンが押されたらアニメーションがスタートします。

まとめ

今回のポイントは以下の通りです。

• Promise + async/await で時間の流れを「待てる」!
• フェードインのタイミングを制御して順番に表示できる
• transition + .classList.add() でCSSアニメーションを実現

応用アイデア

• スクロールしたタイミングで発動するようにする
• クリックだけでなくマウスオーバーなど他のイベントに応用
• 表示順をランダムにしたり、逆順にしたり…

おわりに

JavaScriptでアニメーションを扱うとき、async/await はとても直感的です。
「順番に実行する」「少しずつ遅らせる」といった動きを自然に書けるので、演出の幅が広がります。

ぜひあなたのサイトやWebアプリにも応用してみてください!

MILMONA   MILMONA   MILMONA   MILMONA   MILMONA   
MILMONA   MILMONA   MILMONA   MILMONA   MILMONA