スクロールで画像をスプリットするアニメーションを作成する方法

JavaScript

スクロールで画像をスプリットするアニメーションを作成する方法を紹介します。

デモ

See the Pen
画像スプリットアニメーション
by Sosak (@Sosak2021)
on CodePen.

HTML

    <section class="split-image-section">
      <div class="split-image-side" id="side1"></div>
      <div class="split-image-side" id="side2"></div>
    </section>

SCSS


.split-image {
  &-section {

    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100vh;
  }
  &-side {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: url(https://source.unsplash.com/random);
    background-repeat: no-repeat;
    background-size: cover;
    &#side1 {
      clip-path: polygon(0% 0%, 44% 0%, 58% 6%, 29% 15%, 59% 21%, 21% 34%, 61% 43%, 37% 53%, 59% 72%, 25% 70%, 56% 76%, 34% 81%, 51% 83%, 26% 91%, 71% 97%, 40% 97%, 55% 100%, 0 100%, 0 0);

    }
    &#side2 { //逆にしたものを作成する
      clip-path: polygon(0% 0%, 44% 0%, 58% 6%, 29% 15%, 59% 21%, 21% 34%, 61% 43%, 37% 53%, 59% 72%, 25% 70%, 56% 76%, 34% 81%, 51% 83%, 26% 91%, 71% 97%, 40% 97%, 55% 100%, 100% 100%, 100% 0%);
    }
  }
}

clip-pathを作成する際は、clippyというサイトを利用します。
custom poligonというフリーハンドの形が選択できるので、それを使って作成します。
side1には、それを利用し、side2には、左端の2点を右端に変更するだけにします。
そして、この2つをスクロールで動くように設定します。

JavaScript

const side1 = document.querySelector('#side1');
const side2 = document.querySelector('#side2');
window.addEventListener('scroll', () => {
    // -の値にすることでleftの値が-になるので左に動く
    side1.style.left = -window.pageYOffset+'px';
    side2.style.left = window.pageYOffset+'px';
})

scrollで動かすには、pageYOffsetの値を取得して、それとleftの値を紐付けることで、画像をスプリットすることができます。
左の画像にはマイナスのleftになるようにpageYOffsetにマイナスをつけます。
右は逆にプラスになるようにします。