スクロール時に要素がふわっと表示される!CSS+JavaScriptで実装するフェードインアニメーション

ウェブサイトを閲覧していて、「スクロールすると要素がふわっと表示される」エフェクトを見たことはありませんか?

このアニメーションを適用することで、サイトが動的でスタイリッシュな印象になり、ユーザーの目を引きやすくなります。

本記事では CSSとJavaScript(Intersection Observer API)を使って、シンプルかつ効果的なフェードインアニメーション を実装する方法を詳しく解説します。

フェードインアニメーションのメリット

フェードインアニメーションを適用することで、以下のようなメリットが得られます。

1. 視覚的な魅力が向上:サイトがダイナミックに見え、プロフェッショナルな印象を与える

2. ユーザーの関心を引く:特定のコンテンツを強調し、ユーザーの注目を集める

3. UX(ユーザーエクスペリエンス)の向上:スムーズな動きがあると、ユーザーの離脱率を低減できる

4. パフォーマンスの最適化:Intersection Observer API を活用することで、スクロールイベントの負荷を抑えつつ高パフォーマンスなアニメーション

 目標

以下のような動作を実現します。

✅ ページ内の特定の要素が スクロールして画面内に入るとフェードイン する

✅ アニメーションは 下から上にふわっと表示 される

✅ 各要素は 順番にフェードイン し、より自然な動きを演出

完成コード

以下が今回実装するフェードインアニメーションのコードです。

1. HTML(表示する要素)

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>フェードインアニメーション</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>

    <h1>スクロールで要素がフェードインするデモ</h1>

    <div class="container">
        <div class="fadein">コンテンツ 1</div>
        <div class="fadein">コンテンツ 2</div>
        <div class="fadein">コンテンツ 3</div>
        <div class="fadein">コンテンツ 4</div>
    </div>

    <script src="script.js"></script>
</body>
</html>

2. CSS(フェードインアニメーションの定義)

/* フェードイン前の初期状態 */
.fadein {
    opacity: 0;
    transform: translateY(50px);
    transition: opacity 0.6s ease-out, transform 0.6s ease-out;
}

/* フェードイン後の状態 */
.fadein.show {
    opacity: 1;
    transform: translateY(0);
}

/* スタイリングの調整 */
body {
    font-family: Arial, sans-serif;
    text-align: center;
    margin: 50px;
}

.container {
    max-width: 600px;
    margin: 0 auto;
}

.fadein {
    background: #3498db;
    color: white;
    padding: 20px;
    margin: 20px 0;
    border-radius: 8px;
}

3. JavaScript(スクロールを検知してフェードインさせる)

document.addEventListener("DOMContentLoaded", function() {
    const fadeinElements = document.querySelectorAll(".fadein");

    const observer = new IntersectionObserver((entries) => {
        entries.forEach((entry, index) => {
            if (entry.isIntersecting) {
                setTimeout(() => {
                    entry.target.classList.add("show");
                }, index * 200); // 各要素に200msずつ遅延をつける
            }
        });
    }, { threshold: 0.3 });

    fadeinElements.forEach(element => observer.observe(element));
});

コードの詳細解説

① CSSでフェードインアニメーションを定義

• .fadein クラスには 透明度(opacity: 0) と Y軸方向の移動(translateY(50px)) を設定し、最初は非表示にする

• .show クラスを追加すると、不透明になり 元の位置に戻るアニメーション が発生する

② JavaScriptでスクロールイベントを監視

• IntersectionObserver を使用し、要素が 画面の30%以上表示されたら .show クラスを追加

• setTimeout を用いて 要素ごとに200msの遅延 を設定し、自然なアニメーション効果を作る

応用:アニメーションのカスタマイズ

1. スライドの方向を変更(例:左からフェードイン)

.fadein {
    opacity: 0;
    transform: translateX(-50px); /* 左から */
}

2. アニメーション速度を変更

transition: opacity 1s ease-out, transform 1s ease-out;

3. アニメーションのトリガーを手動制御(ボタンで発火)

document.querySelector("#startAnimation").addEventListener("click", function() {
    document.querySelectorAll(".fadein").forEach(el => el.classList.add("show"));
});

まとめ

CSSのトランジションJavaScriptのIntersection Observer API を組み合わせることで、スクロール時のフェードインアニメーションを実装

順番にアニメーションを実行 することで、より自然な演出が可能

パフォーマンスに優れたアニメーション を簡単に実装できる

このアニメーションは ブログ、ポートフォリオ、企業サイト など、あらゆるWebサイトで活用できます!ぜひ、あなたのサイトにも取り入れてみてください。

(Visited 3 times, 1 visits today)