スクロール連動アニメーションをCSSで実現するには?Intersection Observerと組み合わせた使い方

スクロールに応じて要素をふわっと表示させたり、アニメーションさせたりする表現は、今やWebサイトに欠かせない演出のひとつです。この記事では、CSSアニメーションとJavaScriptの Intersection Observer API を組み合わせて、軽量かつモダンなスクロール連動アニメーションを実装する方法を紹介します。

スクロールアニメーションをCSSだけで行うのは難しい?

CSSには :hover@keyframes などのインタラクションが可能な機能がありますが、「要素が画面内に入ったらアニメーションする」という挙動は、CSS単体では難しく、JavaScriptの補助が必要になります。

そこで登場するのが Intersection Observer API。このAPIを使えば、指定した要素がビューポート内に表示された瞬間を検知し、CSSクラスを付けてアニメーションを実行することができます。


Intersection Observerでアニメーショントリガーを制御

まずは基本となるIntersection Observerのコードです。

<!-- アニメーション対象の要素 -->
<div class="box js-scroll-trigger">アニメーションする要素</div>
/* 初期状態:非表示 */
.box {
    opacity: 0;
    transform: translateY(30px);
    transition: opacity 0.6s ease-out, transform 0.6s ease-out;
}

/* 表示状態:アニメーション適用 */
.box.is-animated {
    opacity: 1;
    transform: translateY(0);
}
// JavaScript(Intersection Observer)
const observer = new IntersectionObserver((entries) => {
    entries.forEach((entry) => {
        if (entry.isIntersecting) {
            entry.target.classList.add('is-animated');
            // 一度アニメーションしたら監視をやめる
            observer.unobserve(entry.target);
        }
    });
});

// すべてのターゲット要素に対して監視を開始
document.querySelectorAll('.js-scroll-trigger').forEach((el) => {
    observer.observe(el);
});

このように、JavaScriptは単にクラス is-animated を付与するだけ。アニメーション自体はCSSに任せているため、パフォーマンスも良好です。


data属性でアニメーションを柔軟に制御する

複数のアニメーションパターンを使い分けたい場合、 data属性 を活用すると便利です。

<div class="box js-scroll-trigger" data-animation="fade-up">フェードアップ</div>
<div class="box js-scroll-trigger" data-animation="zoom-in">ズームイン</div>
/* フェードアップ */
.box[data-animation="fade-up"] {
    opacity: 0;
    transform: translateY(30px);
}
.box[data-animation="fade-up"].is-animated {
    opacity: 1;
    transform: translateY(0);
}

/* ズームイン */
.box[data-animation="zoom-in"] {
    opacity: 0;
    transform: scale(0.8);
}
.box[data-animation="zoom-in"].is-animated {
    opacity: 1;
    transform: scale(1);
}

JavaScript側は変えずに、HTMLの data-animation 属性とCSSを追加するだけで新たなアニメーションを追加できます。


Intersection Observerの設定を調整して体験を最適化

以下のようにオプションを設定すると、より快適なUXが得られます。

const observer = new IntersectionObserver(
    (entries, observer) => {
        entries.forEach((entry) => {
            if (entry.isIntersecting) {
                entry.target.classList.add('is-animated');
                observer.unobserve(entry.target);
            }
        });
    },
    {
        root: null, // ビューポートを基準にする
        threshold: 0.1, // 10%見えたら発火
        rootMargin: '0px 0px -100px 0px' // 下方向に早めに検知
    }
);

まとめ:CSSアニメーションを最大限に活かすIntersection Observerの活用法

スクロールに連動したアニメーションを実装する際、CSSとIntersection Observerを組み合わせることで、軽量かつ高い表現力を持った仕組みが作れます。以下のポイントを押さえると、より洗練されたアニメーションが実現できます。

  • CSSで定義した transitiontransform を使ってスムーズな演出を作成
  • JavaScriptは class の切り替えに徹し、構造はシンプルに
  • data-animation 属性を活用して柔軟な拡張性を確保
  • Intersection Observerの thresholdrootMargin で表示タイミングを最適化

今後のフロントエンド開発では「CSSとJavaScriptの役割分担」がますます重要になります。スクロールアニメーションの実装も、その好例といえるでしょう。

Contact

ウェブサイトの制作や運用に関わる
お悩みやご相談
お気軽にお問い合わせ下さい

ウェブサイトと一口に言っても、企業サイトやECサイト、ブログ、SNSなど、その“カタチ”は目的に応じてさまざまであり、構築方法や使用する技術も大きく異なります。株式会社コナックスでは、お客様のご要望やブランドの個性を丁寧に汲み取り、最適なウェブサイトの“カタチ”をご提案いたします。

デザイン、ユーザビリティ、SEO対策はもちろん、コンテンツ制作やマーケティング戦略に至るまで、あらゆるフェーズでお客様のビジネスに寄り添い、成果につながるウェブサイトづくりをサポートいたします。私たちは、ウェブサイトの公開をゴールではなくスタートと捉え、お客様のビジネスの成功に向けて共に伴走してまいります。