Post

GSAP) ScrollTrigger 효과주기

오늘은 GSAP(GreenSock Animation Platform)과 ScrollTrigger 플러그인을 사용하여 웹 페이지에 스크롤에 따른 다양한 애니메이션 효과를 구현하는 방법을 알아보겠습니다.
각 섹션별로 설명드리도록 할게요!

GSAP는 웹 애니메이션을 구현하기 위한 다양하고 유용한 기능들을 제공합니다. 위에서 설명한 기능들을 적절히 활용하면 웹사이트나 애플리케이션의 인터랙티브한 요소를 효과적으로 향상시킬 수 있습니다.

01: to/from

GSAP의 to() 메서드는 지정한 대상이 현재 상태에서 목표 상태로 애니메이션되게 합니다. 예를 들어, 특정 요소의 투명도를 0에서 1로 변경할 수 있습니다. 반면에 from() 메서드는 to() 메서드의 반대로 동작하며, 지정한 대상을 목표 상태에서 현재 상태로 애니메이션합니다.

1
2
3
4
5
6
        gsap.to("#section01 .img", {      //to는 시작 from은 반대
            duration: 2,
            x: 500,
            rotation: 300,
            borderRadius: 100,
        });

gsap.to() 메소드는 대상 요소의 현재 상태에서 지정된 속성으로 애니메이션을 적용합니다. 여기서는 #section01 .img 대상에 대해 2초 동안 x축으로 500px 이동, 300도 회전, borderRadius를 100px로 변경하는 애니메이션을 적용합니다.


02: Trigger

ScrollTrigger 플러그인을 사용하여 스크롤 위치에 따른 애니메이션이나 트리거를 설정할 수 있습니다. 이를 통해 사용자가 페이지를 스크롤할 때 특정 애니메이션이 활성화되도록 할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
        //to는 시작 from은 반대
        gsap.to("#section02 .img", {
            duration: 2,
            x: 500,
            rotation: 360,
            borderRadius: 100,

            //화면에 보이면 바로 움직입니다.
            scrollTrigger: {
                trigger: "#section02 .img"
            }
        });

scrollTrigger 옵션을 사용하여 스크롤 위치에 따라 애니메이션이 시작되도록 합니다. trigger: “#section02 .img”는 #section02 .img 요소가 뷰포트에 진입할 때 애니메이션을 시작합니다.


03: toggleActions

ScrollTrigger와 함께 사용되며, 스크롤 진행 상황에 따라 애니메이션의 행동을 제어합니다. play, pause, resume, reverse, restart, reset, complete, none 등의 동작을 조합하여 사용할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
        //03 : toggleActions : 상황별 애니메이션 처리
        gsap.to("#section03 .img", {
            duration: 2,
            x: 500,
            rotation: 360,
            borderRadius: 100,

            // onEnter, onLeave, onEnterBack, onLeaveBack
            // "play", "pause", "resume", "reset", "restart", "complete", "reverse", "none",
            scrollTrigger: {
                trigger: "#section03 .img",
                toggleActions: "play none reverse none",
            }
        });

toggleActions는 스크롤 트리거가 다양한 상황(onEnter, onLeave, onEnterBack, onLeaveBack)에 도달했을 때 어떤 액션을 취할지 정의합니다. “play none reverse none” 설정은 스크롤이 요소에 들어올 때 애니메이션을 재생하고, 뒤로 스크롤할 때 애니메이션을 역재생합니다.


04: Start, End

ScrollTrigger에서 애니메이션의 시작과 끝 위치를 정의합니다. 예를 들어, start: “top center”는 뷰포트의 상단 가운데에서 애니메이션이 시작됨을 의미합니다. end는 애니메이션이 끝나는 지점을 설정합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        //04 : start, end : 애니메이션 시작, 끝 조절
        gsap.to("#section04 .img", {
            duration: 2,
            x: 500,
            rotation: 360,
            borderRadius: 100,

            scrollTrigger: {
                trigger: "#section04 .img",
                toggleActions: "play reverse none none",
                markers: false,
                start: "top 50px",
                end: "bottom 30px"
            }
        });

start와 end 옵션은 애니메이션의 시작과 끝 위치를 정의합니다. 예를 들어, start: “top 50px”는 트리거 요소의 상단이 뷰포트 상단으로부터 50px 아래에 도달했을 때 애니메이션을 시작합니다.


05: Scrub

ScrollTrigger의 옵션 중 하나로, 스크롤 동작에 애니메이션을 연동시키는 기능입니다. 사용자가 스크롤할 때 애니메이션이 실시간으로 업데이트되어 부드러운 인터랙션을 만듭니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        //05 : scrub : 내가 스크롤 한 만큼만 움직입니다.
        gsap.to("#section05 .img", {
            duration: 2,
            x: 500,
            rotation: 360,
            borderRadius: 100,

            scrollTrigger: {
                trigger: "#section05 .img",
                markers: false,
                start: "top 50%",
                end: "bottom 10%",
                scrub: true    //  true  | number
            }
        });

scrub: true는 스크롤 동작에 애니메이션 속도를 동기화시킵니다. 즉, 사용자가 스크롤을 멈추면 애니메이션도 멈춥니다. 숫자 값을 주면, 그 값만큼의 지연 시간(delay)을 갖게 됩니다.


06: Pin

ScrollTrigger에서 사용되며, 특정 요소를 스크롤 동안 고정시키는 기능입니다. 이를 통해 사용자가 페이지를 스크롤하는 동안 요소가 화면에 고정되어 있게 할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        // 06 : pin  : 고정
        gsap.to("#section06 .img", {
            duration: 2,
            x: 500,
            rotation: 360,
            borderRadius: 100,

            scrollTrigger: {
                trigger: "#section06 .img",
                start: "top 50%",
                end: "bottom 200px",
                scrub: true,
                pin: true,
                markers: false,
            }
        });

pin: true는 지정된 요소를 스크롤 동안 고정시키는 효과를 적용합니다. 사용자가 스크롤을 계속해도 해당 요소는 화면에 고정되어 있습니다.


07: toggleClass

ScrollTrigger와 함께 사용하여, 스크롤 위치에 따라 특정 요소에 클래스를 추가하거나 제거할 수 있습니다. 이를 통해 CSS를 이용한 다양한 스타일 변화를 적용할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        gsap.to("#section07 .img", {
            duration: 2,
            x: 500,
            rotation: 360,
            borderRadius: 100,

            scrollTrigger: {
                trigger: "#section07 .img",
                start: "top center",
                end: "bottom 200px",
                scrub: true,
                toggleClass: "active",
                markers: false,
                id: "box7",
            }
        });

toggleClass: “active”는 스크롤 트리거가 활성화될 때 지정된 요소에 클래스를 추가하거나 제거합니다. 이를 통해 CSS를 사용하여 추가적인 스타일 변화를 줄 수 있습니다.


08: Callback

애니메이션의 특정 시점에 사용자 정의 함수를 실행할 수 있는 기능입니다. 예를 들어, 애니메이션이 완료되었을 때 특정 작업을 실행하도록 설정할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        //08 : callback : 
        gsap.to("#section08 .img", {
            duration: 2,
            x: 500,
            rotation: 360,
            borderRadius: 100,

            scrollTrigger: {
                trigger: "#section08 .img",
                start: "top center",
                end: "bottom 200px",
                scrub: true,
                markers: true,
                // onEnter: () => { console.log("onEnter") },
                // onLeave: () => { console.log("onLeave") },
                // onEnterBack: () => { console.log("onEnterBack") },
                // onLeaveBack: () => { console.log("onLeaveBack") },
                onUpdate: (self) => { console.log("onUpdate", self.progress.toFixed(3)) },
                ontoggle: (self) => { console.log("onToggle", self.progress.isActive) },
            }
        });

onUpdate, ontoggle와 같은 콜백 함수를 사용하여 애니메이션의 특정 시점에 추가적인 작업을 수행할 수 있습니다. 예를 들어, onUpdate는 애니메이션이 업데이트될 때마다 호출되며, self.progress.toFixed(3)를 통해 애니메이션 진행 상황을 콘솔에 로그로 남깁니다. 이러한 각 옵션과 메소드를 조합하여 다양한 스크롤 기반 애니메이션을 구현할 수 있으며, 사용자 경험을 풍부하게 만드는 데 큰 도움이 됩니다.

This post is licensed under CC BY 4.0 by the author.

Trending Tags