スクロールアニメーション(Intersection Observer)実装解説|Scroll Animation JS/CSS Guide

スクロールアニメーション デザイン見本

Intersection Observer APIを使い、スクロールで要素が画面内に入ったときにアニメーションを発動させる実装パターンを紹介します。CSS・JSのコピペ用コードを掲載しています。

① 基本 — 下からフワッと表示(フェードイン)

↓ 下にスクロールしてみて
スクロールで表示されます ①
スクロールで表示されます ②
スクロールで表示されます ③
HTML
<div class="scroll-target">スクロールで表示されます ①</div>
<div class="scroll-target">スクロールで表示されます ②</div>
<div class="scroll-target">スクロールで表示されます ③</div>
CSS
.scroll-target {
  opacity: 0;
  transform: translateY(40px);
  transition: opacity 0.5s ease, transform 0.5s ease;
}

.scroll-target.is-visible {
  opacity: 1;
  transform: translate(0, 0);
}
JS
(function () {
  var targets = document.querySelectorAll('.scroll-target');
  var obs = new IntersectionObserver(function (entries) {
    entries.forEach(function (entry) {
      if (!entry.isIntersecting) return;
      entry.target.className = entry.target.className + ' is-visible';
      obs.unobserve(entry.target);
    });
  }, { threshold: 0.3 });
  targets.forEach(function (el) { obs.observe(el); });
})();
IntersectionObserver の基本構造

IntersectionObserver は「要素が画面と何%交差したか」を監視するAPIです。threshold: 0.3 で要素が30%見えたときにコールバックが発火します。isIntersectingtrue のときだけクラスを付与し、unobserve() で監視を止めることで「一度だけアニメーション」を実現できます。

② 表示方向の切り替え(上 / 下 / 左 / 右)

↓ 下にスクロールしてみて
スクロールで表示されます
HTML
<div class="scroll-target">スクロールで表示されます</div>
CSS
.scroll-target {
  opacity: 0;
  transform: translateY(40px);
  transition: opacity 0.5s ease, transform 0.5s ease;
}

.scroll-target.is-visible {
  opacity: 1;
  transform: translate(0, 0);
}
JS
(function () {
  var targets = document.querySelectorAll('.scroll-target');
  var obs = new IntersectionObserver(function (entries) {
    entries.forEach(function (entry) {
      if (!entry.isIntersecting) return;
      entry.target.className = entry.target.className + ' is-visible';
      obs.unobserve(entry.target);
    });
  }, { threshold: 0.3 });
  targets.forEach(function (el) { obs.observe(el); });
})();
translateY / translateX で方向を指定する

初期状態の transform を変えるだけで表示方向を切り替えられます。上からなら translateY(-40px)、左からなら translateX(-40px) と負の値にします。.is-visible クラス付与時は transform: translate(0, 0) に戻すため、どの方向でも1つの共通クラスで対応できます。

③ 複数要素の順次表示(Stagger)

↓ 下にスクロールしてみて
Card 01
Card 02
Card 03
Card 04
Card 05
Card 06
Card 07
Card 08
Card 09
HTML
<div class="stagger-grid">
  <div class="stagger-item">Card 01</div>
  <div class="stagger-item">Card 02</div>
  <div class="stagger-item">Card 03</div>
  <div class="stagger-item">Card 04</div>
  <div class="stagger-item">Card 05</div>
  <div class="stagger-item">Card 06</div>
</div>
CSS
.stagger-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 12px;
}

.stagger-item {
  opacity: 0;
  transform: translateY(30px);
  transition: opacity 0.4s ease, transform 0.4s ease;
  background: #f8fafc;
  border: 1px solid #e2e8f0;
  border-radius: 8px;
  padding: 20px;
  text-align: center;
}

.stagger-item.is-visible {
  opacity: 1;
  transform: translate(0, 0);
}

.stagger-item:nth-child(1) { transition-delay: 0s; }
.stagger-item:nth-child(2) { transition-delay: 0.1s; }
.stagger-item:nth-child(3) { transition-delay: 0.2s; }
.stagger-item:nth-child(4) { transition-delay: 0.3s; }
.stagger-item:nth-child(5) { transition-delay: 0.4s; }
.stagger-item:nth-child(6) { transition-delay: 0.5s; }
JS
(function () {
  var items = document.querySelectorAll('.stagger-item');
  var obs = new IntersectionObserver(function (entries) {
    entries.forEach(function (entry) {
      if (!entry.isIntersecting) return;
      entry.target.className = entry.target.className + ' is-visible';
      obs.unobserve(entry.target);
    });
  }, { threshold: 0.2 });
  items.forEach(function (el) { obs.observe(el); });
})();
transition-delay で要素ごとに遅延させる(Stagger)

複数の要素を順番に表示させるStagger効果は、CSSの transition-delay:nth-child セレクタで指定するだけで実現できます。JSは全要素を同時に監視・表示するだけで、遅延の制御はすべてCSSが担います。グリッドレイアウトとの組み合わせで、カードが1枚ずつ登場するような演出が手軽に作れます。

注意点:Intersection Observer APIは主要なモダンブラウザで広くサポートされていますが、Internet Explorer 11では動作しません。IE対応が必要な場合は polyfill を導入するか、スクロールイベントで代替してください。また、デモ内のスクロールエリアでは root オプションでコンテナを指定していますが、実際のページ実装ではデフォルト(ビューポート基準)のままお使いください。

当サイトで公開しているWebデザインやUIの実装例は、一覧として以下記事に纏めています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次