Open1

gsapのtimlineでのアニメーション管理

のっくんのっくん

gsapでアニメーション組む時の課題点

  • 複雑なアニメーションや、アニメーションをする要素またはそのプロパティの数だけコード長くなる。→見にくい。
    • gsap単体ならまだしも、複数要素のタイミングを調整しつつtimeline組む場合は、ネストも深くなるのでもっと見にくくなる。
    • gsapのプロパティ(vars引数)はアニメーションの調整さえしてしまえば、ソースコード内での優先度?は低いので、どっか目立たないところに置いておきたい。

▼例

// カラーと位置を異なるタイミング,速度,イージングで見せたい。
  gsap.to('[data-target="01"]', {
    color: "rgba(255,0,0,1)",
    duration: 0.5,
    ease: 'power1.out'
  });
  gsap.to('[data-target="01"]', {
    y: 300,
    duration: 0.2,
    ease: 'power1.in'
  });
  gsap.to('[data-target="01"]', {
    x: 300,
    duration: 0.1,
    delay: 4,
    ease: 'power1.in'
  });

// さらに複数要素をtimeline上の任意のタイミングで実施したい場合。
const tl = gsap.timeline()

tl.to('[data-target="01"]', {
    color: "rgba(255,0,0,1)",
    duration: 0.5,
    ease: 'power1.out'
  }, "<")
.to('[data-target="01"]', {
    y: 300,
    duration: 0.5,
    ease: 'power1.in'
  }, "<")
.to('[data-target="01"]', {
    x: 300,
    duration: 0.5,
    ease: 'power1.in'
	}, "<4")
.to('[data-target="02"]', {
    x: 300,
    duration: 0.5,
    ease: 'power1.in'
	}, "+=0.1")
.
.
.
.

});

対応策

  • 単一要素にアニメーションを付加する関数を作成(返り値はgsap, timelineもしくはgsapの配列)
    • 関数の中で複数要素に対してアニメーションを付与しない。各要素のアニメーションの開始タイミングの記述位置が後述するtimline上で確認できないため。
  • timeline.add()に↑で作成した関数を渡してあげる。
  • アニメーションの開始タイミングはtimeline上で全て把握できるようにする。
// アニメーション単位でgsapを返す
// 関数の中で子要素を指定したりしない。
// ↑timeline上で全てのアニメーションの開始タイミングが見れるようにするため。
const aimationIn01 =(element) => {
	const anims = [
		gsap.to(element, {
	    color: "rgba(255,0,0,1)",
	    duration: 0.5,
	    ease: 'power1.out'
	  });
	  gsap.to(element, {
	    y: 300,
	    duration: 0.2,
	    ease: 'power1.in'
	  });
	  gsap.to(element, {
	    x: 300,
	    duration: 0.1,
	    delay: 4,
	    ease: 'power1.in'
	  });
	]
	return anims
}
const target01 = document.queryselector('[data-target="01"]')
const target02 = document.queryselector('[data-target="02"]')
const target03 = document.queryselector('[data-target="03"]')
const target04 = document.queryselector('[data-target="04"]')

// timeline上でのアニメーションの開始タイミングは第二引数(position)で調整
const tl = gsap.timeline()
timeline.add( aimationIn01( target01 ), 'start') // 随時ラベル追加
timeline.add( aimationIn01( target02 ), 'start+=4')
timeline.add( [aimationIn01( target03 ), aimationIn01( target03 )], 'start+=4') //複数のアニメーションの開始タイミングが同じであれば配列で渡す

※記述例なのでちゃんと動くかは不明。

参考

https://greensock.com/docs/v3/GSAP/Timeline/add()