GSAP를 이용한 Animation 다루기

GSAP를 이용한 Animation 다루기 updated_at: 2023-09-12 13:24

GSAP

npm i gsap
import * as GSAP from 'gsap';

참조 : https://greensock.com/cheatsheet/ defulat setting

간단 사용법

html의 class 나 id를 바로 불러와서 사용가능하다.

html

<div class="box1"></div>

ts

import * as GSAP from 'gsap';

export class AppComponent implements AfterViewInit {
..........
  ngAfterViewInit() {
    const box1 = document.getElementsByClassName('box1');
    GSAP.gsap.set(box1, { width: 'calc(25% - 10px)' });
  }
}

ElementRef 룰 이용하여 처리하기

html

<div #myElement style="opacity: 0;"></div>
<div #myElement2></div>
<canvas #myCanvas></canvas>

ts

import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
import * as GSAP from 'gsap';

export class GsapComponent implements AfterViewInit{
  @ViewChild('myElement', {static: true}) divRef: ElementRef<HTMLDivElement> = {} as ElementRef;
  @ViewChild('myElement2', {static: true}) divRef: ElementRef2<HTMLDivElement> = {} as ElementRef;
  @ViewChild('myCanvas', {static: true}) canvasRef: CanvasRef<HTMLCanvasElement> = {} as ElementRef;
  ngAfterViewInit(){
    GSAP.gsap.to(this.divRef.nativeElement, {
      opacity: 1
    });
    
    GSAP.gsap.to(this.ElementRef2.nativeElement, {
      transformOrigin: 'center bottom',
      scaleY: -1,
      opacity: 1
    });

    // 바로 사용해도되고 아래와 같이 처리해도 되고...
    this.canvas = this.CanvasRef.nativeElement;
    GSAP.gsap.to(this.canvas, {
      filter: 'blur(10px)'
    });
  }
..........
}
GSAP.gsap.to(document.getElementsByClassName('message'), { // className을 이용해서 가져올 수 도 있다.
  opacity: 0,
  display: 'none',
});

GSAP.gsap.to(document.getElementById('map'), { // ID를 이용해서도 가져올 수 있다.
  opacity: 0,
  display: 'block',
});
GSAP.gsap.to(document.getElementById('map'), { // transition time
  duration: 1 // 초 단위로 설정
});

GSAP.gsap.to(document.getElementById('map'), {
  delay: 1 // 초 단위로 설정
});

순차적 진행및 call back

const tl = GSAP.gsap.timeline();
tl.to(el, {
  top:  `calc(${this.tubePosition[this.currentLevel][to][1]}px - 90px)`,
  left: `calc(50vw + ${this.tubePosition[this.currentLevel][to][0]}px - 70px)`,
  rotate: 75,
  zIndex: 100
}).to(el, {
    rotate: 90
}).to(el, {
  top: `calc(${this.tubePosition[this.currentLevel][from][1]}px)`,
  left: `calc(50vw + ${this.tubePosition[this.currentLevel][from][0]}px)`,
  rotate: 0
}).to(el, {
  zIndex: 0
});

tl.eventCallback("onComplete", () => {this.transferring = false});

element 정보 가져오기

GSAP.gsap.getProperty([Element], 'left');
const width = GSAP.gsap.getProperty('body', 'width');

만약 element 를 className으로 가져올경우 반드시 몇번째 인지 인식 시켜야 한다.

const el = document.getElementsByClassName('hint-div');
const display = GSAP.gsap.getProperty(el[0], 'display');

select

// Angular
@Component({ ... })
class MyComponent implements OnInit {

  constructor(private el: ElementRef) {
    this.q = GSAP.gsap.utils.selector(el);
  }

  ngOnInit() {    
    // uses this.el.nativeElement.querySelectorAll() internally
    GSAP.gsap.to(this.q(".box"), { x: 100 });
  }
}

easy

참조 : https://greensock.com/docs/v3/Eases

gsap.to(graph, { duration: 2.5, ease: "expo.out", y: -500 });

event Callback

참조 : https://greensock.com/docs/v3/GSAP/Tween/eventCallback()

"onComplete", "onUpdate", "onStart" or "onRepeat"

gsap.to(obj, {duration: 1, x: 100, onComplete: myFunction, onCompleteParams: ["param1","param2"]});
myAnimation.eventCallback("onComplete", myFunction, ["param1","param2"]);
myAnimation.eventCallback("onUpdate", null);
myAnimation.eventCallback("onComplete", completeHandler)
  .eventCallback("onUpdate", updateHandler, ["param1"]).play(1);

값만 변화시키기

private position = {
  x: 0,
  y: 0,
  rotate: 0,
};

GSAP.gsap.to(this.position, {
  duration: 2,
  ease: "bounce.out",
  x: 400, 
  y: 400, 
  rotate: 3,
  onUpdate: () => {
    // 2초동안(duration) bounce.out 으로 position의 각 값들이 변화된느 것을 확인 할 수 있습니다.
    console.log(this.position)

  },
  onComplete: () => {
    
  }
});

평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글