Vue.jsでSVGをアニメーションさせる方法

Vue.js

Vue.jsでSVGをアニメーションさせる方法を紹介します。

Vue.jsでSVGをアニメーションさせる方法

template

  <div class="home">
    <div class="home__container">
      <div class="home__aaa">
        ...
      </div>

      <div class="home__bbb">
        ...
      </div>

      <div class="home__svg-container">
        <svg viewBox="0 0 939 807" fill="none">
          <g id="heroicon" class="home__heroicon">
          <g ref="cup">
          <path .../>
          <path .../>
          <path .../>
          </g>
          <g ref="arm">
          <path .../>
          <path .../>
          <path .../>
          </g>
          </defs>
        </svg>

      </div>
    </div>
  </div>

レスポンシブにする

SVGのレスポンシブ化は、SVGをCSSでレスポンシブにする方法を参考にしてみてください。
上のケースでは、home__containerという全体を囲うコンテナを用意しています。
その中に、SVGをレスポンシブにするため、svgタグを囲うhome__svg-containerというコンテナを用意しています。
その中に、svgタグを入れています。

refを設定する

アニメーションを適用させたい部分にrefを設定します。
この作業には、pathがグループ化されている必要があるため、そのやり方は、unDrawとFigmaでSVGをCSSでアニメーションさせるための下準備手順を参考にしてみてください。
上の方法で作成した場合、id属性が付与されるため、それをrefに変更するだけでOKです。

script

import gsap from 'gsap'
import { onMounted, ref } from 'vue'

export default {
  setup() {

    const cup = ref(null)
    const arm = ref(null)

    // SVGのcupのアニメーション
    const animateSVGCup = () => {
      gsap
      .to(cup.value, {
        repeat: -1,
        duration: 2.5,
        delay: 4,
        y: -65,
        yoyo:true,
        repeatDelay: 1
      })
    }
    // SVGのarmのアニメーション
    const animateSVGArm = () => {
      gsap
      .to(arm.value, {
        repeat: -1,
        duration: 2.5,
        delay: 4,
        rotation: "-40",
        y: 10,
        x: 13,
        transformOrigin:"left center",
        yoyo:true,
        repeatDelay: 1
      })
    }

    onMounted(() => {
      animateSVGCup()
      animateSVGArm()
    })

    return {
      cup,
      arm,
    }
  }

}

gsapをインポート

gsapを利用するので、gsapをインポートします。
gsapの利用方法は、Vue.jsでGSAPを使う方法を参考にしてみてください。

refを設定

gsapのターゲットとして、refを設定します。
上の場合、cupとarmというrefを設定しています。

gsapアニメーションを設定する

gsapのtoメソッドを使用しています。
第一引数には、ターゲットを指定するので、refで指定した変数を指定します。
refのため、値にアクセスするには、.valueが必要です。
repeatは-1にするとずっと繰り返しになります。
durationはアニメーションの期間を設定します。
delayはアニメーション開始の遅延を設定します。
rotationは回転させます。
yはY軸に移動させます。
xはX軸に移動させます。
transformOriginはトランジションを開始位置を設定します。
yoyoはブーリアンでtrueの場合は反復してアニメーションします。
repeatDelayはリピート時の遅延を設定することができます。

CSS

.home {
  &__container {
    position: relative;
  }
  &__svg-container {
    position: absolute;
    right: 0;
    bottom: 0;
    width: 100%;

  }
}

上では、SCSSで記述しています。
コンテンツすべてを包むhome__containerでpositionのrelativeを指定します。
svgのためのコンテナであるhome__svg-containerでは、positionをabsoluteにすることで、その上のコンテナとの絶対的な位置が決定します。
そこでwidthを100%にすることでレスポンシブになります。

Vue.js

Posted by devsakaso