IntersectionObserverでスクロール表示アニメーションを作る実践例【JS軽量・実務向け・コピペOK】

IntersectionObserverでスクロール表示アニメーションを作る実践例

スクロールしたときに、要素がふわっと表示されるアニメーションは、今では多くのWebサイトで使われています。

以前はスクロールイベントを使って制御する方法が主流でしたが、現在は IntersectionObserver を使った方法が軽量で実務向きです。

この記事では、

・軽くて安定したスクロール表示アニメーション
・jQuery不要
・コピペで使える
・実務案件でも使える設計

で実装する方法を、動くデモとあわせて解説します。


動くデモはこちら

実際に動作するサンプルページを用意しています。

▼ デモページ
https://disegno-k.biz/demo/js/intersectionobserver-scroll-demo

コードだけ見たい方も、まずは動きを確認してみてください。


なぜIntersectionObserverを使うのか

従来の scroll イベント監視は、スクロール中ずっと処理が走るため、ページによっては負荷が高くなります。

IntersectionObserverを使うと、

・画面内に入った時だけ発火
・無駄な計算が減る
・処理が安定する
・モバイルでも軽い

というメリットがあります。

実務では「軽さ」と「安定性」が重要なので、この方法をおすすめします。


今回作るアニメーション仕様

今回のサンプルでは次の3種類を用意します。

・下からフェード表示
・左からスライド表示
・ズーム表示

クラスを付け替えるだけで再利用できる設計にします。


コピペで動くコード一式

<section class="block fade-up">
  <h2>見出しテキスト</h2>
  <p>スクロールで表示されます。</p>
</section>

<section class="block fade-left">
  <h2>カード表示</h2>
  <p>横からスライドします。</p>
</section>

<section class="block zoom-in">
  <h2>CTAエリア</h2>
  <p>ズームで表示されます。</p>
</section>
.block {
  margin: 120px auto;
  max-width: 700px;
  padding: 40px;
  background: #f5f5f5;
}

/* 初期状態 */
.fade-up,
.fade-left,
.zoom-in {
  opacity: 0;
  transition: all 0.8s ease;
}

/* 各アニメーション */
.fade-up {
  transform: translateY(40px);
}

.fade-left {
  transform: translateX(-40px);
}

.zoom-in {
  transform: scale(0.9);
}

/* 表示状態 */
.is-show {
  opacity: 1;
  transform: none;
}
const targets = document.querySelectorAll('.fade-up, .fade-left, .zoom-in');

const observer = new IntersectionObserver((entries, obs) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.classList.add('is-show');
      obs.unobserve(entry.target); // 一度だけ表示
    }
  });
}, {
  root: null,
  rootMargin: "0px 0px -15% 0px",
  threshold: 0.2
});

targets.forEach(el => observer.observe(el));

オプション設定の意味(ここが実務ポイント)

threshold

threshold: 0.2

要素が20%見えたら発火。
早すぎず遅すぎず、実務で使いやすい値です。


rootMargin

rootMargin: "0px 0px -15% 0px"

少し手前で発火させる調整。
「見えた瞬間より少し前」に動かしたいときに便利です。


一度だけ表示させる理由

unobserve()

を入れることで、

・再スクロールで再発火しない
・無駄な監視を止める
・処理が軽くなる

LPや企業サイトでは「一度だけ表示」が基本です。


実務での使いどころ

この方式は次のような場所でよく使います。

・サービス紹介ブロック
・カード一覧
・実績紹介
・写真ギャラリー
・料金表
・CTAセクション

派手すぎず、読みやすさを邪魔しないのがポイントです。


よくあるミス

表示されない場合

・クラス名の付け忘れ
・observeしていない
・display を使っている
・transitionを書いていない

まずここを確認してください。


カスタマイズ例

表示をもっと早くする

threshold: 0.1

移動距離を変える

transform: translateY(80px);

時間差表示をしたい場合

.delay-1 { transition-delay: .1s; }
.delay-2 { transition-delay: .2s; }

まとめ

IntersectionObserverを使えば、

・軽量
・安定
・再利用しやすい
・実務でも安心

なスクロール表示アニメーションを簡単に実装できます。

まずはデモページのコードをそのまま動かして、必要に応じて距離や速度を調整してみてください。

▼ 実際に動くサンプルはこちら
https://disegno-k.biz/demo/js/intersectionobserver-scroll-demo


※このサンプルは実装サンプル集としてシリーズ化していきます。

投稿者プロフィール

yajio