【スクロールで画像が動く】CCSとJavaScriptで作るアニメーション

サムネイル
               

 

キニナリ
悩む人
スクロールすると画像が動くサイトを作りたい!でも、難しそうだよね。。。

 

moridai
moridai
動きがあるサイトを作りにはCCSとJavaScriptの知識が必要だよ!でも、まずはコピペでも良いので動くことを実感してみよう!

 

 

この記事では、スクロールで画像が動くアニメーションをCCSとJavaScriptで作っていきます。

コードを全て公開するので、もちろんコピペOKです。

 

 

 

 

【スクロールで画像が動く】CCSとJavaScriptで作るアニメーション

 

HTML構造の作成

<section id="about">
    <div class="img animate-left">
      <img src="<?php echo get_template_directory_uri(); ?>/img/about.jpg" alt="">
    </div>


    <div class="text">
      <h2 class="section-title">
        <span class="en">ABOUT</span>
        <span class="ja">わたしたちについて</span>
      </h2>
      <p>タイトルタイトルタイトルタイトルタイトルタイトルタイトルタイトル</p>
      <p>タイトルタイトルタイトルタイトルタイトルタイトルタイトルタイトル</p>
      <p>タイトルタイトルタイトルタイトルタイトルタイトルタイトルタイトル</p>
    </div>
  </section>

 

 

CSSスタイリング

/* 初期状態 */
.animate-left {
  opacity: 0;
  transform: translateX(-200px); /* 左にアニメーションする初期位置 */
  transition: opacity 0.5s ease, transform 3s ease;
}


/* アクティブな状態 */
#about.active .animate-left {
  opacity: 1;
  transform: translateX(0); /* 左にアニメーションする初期位置をリセット */
}

 

この部分がスクロールするとactiveに変更されて、薄い色から濃い色に変わり左から移動します。

 

JavaScript

// scroll animation
// スクロールイベントを監視し、要素がビューポート内にあるかどうかを判定
window.addEventListener("scroll", function () {
  handleScroll();
});


// 初回のみアクティブクラスを追加するフラグ
var isFirstScroll = true;


function handleScroll() {
  var aboutSection = document.getElementById("about");


  // ビューポート内にある場合、アクティブクラスを追加
  if (isInViewport(aboutSection)) {
    aboutSection.classList.add("active");


    // 初回フラグが true の場合、オフにする
    if (isFirstScroll) {
      isFirstScroll = false;
    }
  } else {
    // ビューポート外の場合かつ初回フラグが false の場合、アクティブクラスを削除しない
    if (!isFirstScroll) {
      aboutSection.classList.remove("active");
    }
  }
}


// 指定された要素がビューポート内にあるかどうかを判定する関数
function isInViewport(element) {
  var rect = element.getBoundingClientRect();
  var windowHeight =
    window.innerHeight || document.documentElement.clientHeight;


  // ビューポートの上端より下にあり、かつビューポートの下端より上にある場合
  return rect.top <= windowHeight && rect.bottom >= 0;
}

 

moridai
moridai
まずは、超簡単に説明していきます。

 

スクロールして、画面上にAboutセクションが表示されたらCSSのactiveを取得するってことです。

初期状態はCSSはactiveではなく、スクロールしてビューポート内に入ればactiveに変わりfalseに変更。ビューポートから外れたらfalseのままなのでactiveが持続されます。

 

moridai
moridai
もっと詳しく解説!

 

handleScroll 関数内で、aboutSection は指定されたID (“about”) を持つ要素を取得します。

 

isInViewport 関数は、指定された要素がビューポート内にあるかどうかを判定します。これは、要素の上端がビューポートの下端より上にあり、かつ要素の下端がビューポートの上端より下にある場合に true を返します。

 

isFirstScroll フラグは初回のスクロールを示すためのフラグで、初回のスクロールの場合にのみ active クラスを追加します。その後はこのフラグがオフになり、ビューポート外に移動しても active クラスを削除しません。

 

スクロールイベントが発生するたびに handleScroll 関数が呼び出され、その結果として active クラスの追加や削除が行われます。

 

このコードの目的は、スクロールに応じて指定されたセクションがビューポート内にある場合に active クラスを追加し、初回のスクロールであるかどうかによってその挙動を変更することです。

まとめ

WEBサイトに動きをつけるアニメーションはCSSだけでも実装可能です。

でも、JavaScriptを使うことでスクロールした時や、消えるときなどもっと複雑なことができます。

より高度な動きを再現するには欠かせない技術になりますので、ゆっくりと学んできましょう!