【簡易版】スクロール時に画面内に入ってきたらCSSでアニメーション!JavaScriptはコピペOK!

この記事ではスクロールに応じて特定の要素(HTML)画面内に入って来た場合にCSSでアニメーションさせる方法をご紹介します。

以前同様の動作をする記事を紹介しましたが、あちらはScrollMagicを使用したものになりますが今回は簡易版という位置づけのものをご紹介します。
コピペでパッと使用出来ます!

汎用性は以前ご紹介したもののほうが高いのかなと思います。

スクロール時に画面内に入ってきたらCSSでアニメーション!JavaScriptはコピペOK!

やりたいこと

  1. 特定の要素が画面内に入ってきたらis-animatedclassを付与
  2. 1の要素をCSSでフェードイン

デモ

ここからソースコードの紹介になります。

HTML

<div class="l-wrapper">
  <p class="c-text">スクロールしてください。</p>
  <div class="l-section js-scrollAnimation">
  </div>

  <div class="l-section is-bgColor--red js-scrollAnimation">
  </div>

  <div class="l-section is-bgColor--blue js-scrollAnimation">
  </div>

  <div class="l-section is-bgColor--green js-scrollAnimation">
  </div>
</div>

今回使用するサンプルHTMLです。
アニメーション(フェードイン)させたい要素にjs-scrollAnimationclassを付与しています。

CSS(SCSS)

.l-wrapper {
  max-width: 700px;
  width: 100%;
  padding-top: 50px;
  margin: 0 auto;
}

.c-text {
  text-align: center;
  font-weight: bold;
  font-size: 20px;
  margin-bottom: 200px;
}

.l-section {
  height: 600px;
  background: #ccc;
  margin-bottom: 30px;
  opacity: 0;
  transform: translate3d(0, 100px, 0);
  transition: opacity 1.5s, transform 1.5s;
  &.is-bgColor--red {
    background: #E4357B;
  }
  &.is-bgColor--blue {
    background: #149072;
  }
  &.is-bgColor--green {
    background: #357be4;
  }
  //アニメーション用スタイル
  &.is-animated {
    opacity: 1;
    transform: translate3d(0, 0, 0);
  }
}

今回使用するCSSのサンプルです。

ポイントは以下の3点です

  • transitionを設定。今回はopacityとtransform
  • あらかじめtransform: translate3d(0, 100px, 0)で100pxY方向にずらし、opacity: 0にして透明にしておきます。
  • is-animatedが付与されたらtransform: translate3d(0, 0, 0)ずらした値を0にし、opacity: 1で透明度を解除してフェードインさせます。

つまりアニメーション待機状態のCSSアニメーション後のCSSを用意するだけです。

JavaScript

JavaScriptはjQuery版JavaScript版をご紹介します。
どちらもコピペでOKです!

jQuery版

var $target = $('.js-scrollAnimation');//アニメーションさせたい要素
var offset = 100;//アニメーションタイミング

$(window).on('scroll', function() {//スクロールしたとき

  var scroll = $(window).scrollTop();//スクロール量を取得
  var h = $(window).height();//画面の高さを取得

  $target.each(function() {
    var pos = $(this).offset().top;//アニメーションさせたい要素の位置を取得
    if (scroll > pos - h + offset) {//スクロール量 > アニメーションさせたい要素の位置
      $(this).addClass('is-animated');
    }
  })

}).trigger('scroll');

JavaScript版

let targets = document.querySelectorAll('.js-scrollAnimation');//アニメーションさせたい要素
let offset = 100;//アニメーションタイミング

window.addEventListener('scroll', function() {//スクロールしたとき

  var scroll = window.scrollY;//スクロール量を取得
  var h = window.innerHeight;//画面の高さを取得

  for(const target of targets) {
    var pos = target.getBoundingClientRect().top + scroll;//アニメーションさせたい要素の位置を取得
    if (scroll > pos - h + offset) {//スクロール量 > アニメーションさせたい要素の位置
      target.classList.add('is-animated');
    }
  }

});

解説

※jQuery版での解説です

var $target = $('.js-scrollAnimation');
var offset = 100;

$targetにはアニメーションさせたい要素を指定
offsetはアニメーションするタイミングをずらします。
今回の例では100px分要素が画面内に入ってきたらアニメーションします。

if (scroll > pos - h + offset) {
  $(this).addClass('is-animated');
}

スクロール量 > アニメーションさせたい要素の位置 - 画面の高さ + offset
の場合にis-animatedclassを付与します。

スクロール量は画面の上部での値なのでアニメーションさせたい要素の位置を画面の高さで引いてあげる必要があります。

最後に

今回の方法は基本的なものではありますが使用頻度の高いと思います。
他にも画面内に入って来たときにアニメーションする方法はたくさんありますの興味がある方は調べてみてはいかがでしょうか。
ご紹介した方法はあまり汎用的ではありませんがパッと実装するにはいいのではないかと思います。