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

【JavaScript】Intersection Observer を使ったアニメーション処理の基本形

Intersection Observer を使ってスクロールアニメーションを制御する雛形。
覚えておくと、どんな演出でもスムーズに実装でき、テンプレートとして繰り返し使えます。

  1. // 1. 処理内容を定義(コールバック関数)
  2. function callback(entries) {
  3.   entries.forEach(entry => {
  4.     if (entry.isIntersecting) {
  5.       // 表示されたときの処理(アニメーションやクラス追加)
  6.     }
  7.   });
  8. }
  9. // 2. IntersectionObserver インスタンスを作る
  10. const observer = new IntersectionObserver(callback, {
  11.   threshold: 0.5, // 50% 表示されたときに反応
  12. });
  13. // 3. 対象要素を監視開始
  14. document.querySelectorAll(".監視対象のクラス").forEach(el => {
  15.   observer.observe(el);
  16. });

この構成を覚えておけば、アニメーションの切り替え/発火条件のカスタマイズ/複数要素対応
など、いろんなケースに応用が効きます。

応用例

  1. if (entry.isIntersecting) {
  2.   entry.target.classList.add("show");
  3. } else {
  4.   entry.target.classList.remove("show");
  5. }

  1. .fade-blur {
  2.   opacity: 0;
  3.   filter: blur(10px);
  4.   transition: all 1s ease;
  5. }
  6. .fade-blur.show {
  7.   opacity: 1;
  8.   filter: blur(0);
  9. }

サンプル

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

rootMarginを使い、「少し前から」反応させる

rootMarginは、IntersectionObserver のオプションの1つで、
観測エリア(ビューポート)を仮想的に拡張または縮小するためのプロパティ。

例)rootMargin: “0px 0px -100px 0px” の場合

  1. const observer = new IntersectionObserver(callback, {
  2.   threshold: 0.5,
  3.   rootMargin: "0px 0px -100px 0px"
  4. });

  1. const observer = new IntersectionObserver(callback, {
  2. rootMargin: "上 右 下 左"
  3.               ↑ ↑ ↑ ↑
  4.            top right bottom left

通常のビューポートより下を100px縮めた範囲を、表示エリアとして扱います。
つまり、要素が画面に100px手前で到達したときに反応するようになります。

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

MILMONA   MILMONA   MILMONA   MILMONA   MILMONA   
MILMONA   MILMONA   MILMONA   MILMONA   MILMONA