GSAP을 사용하여 랜덤하게 움직이는 애니메이션 구현하기

Carrie·2024년 7월 12일
0
post-thumbnail

GSAP을 사용하여 랜덤한 위치로 움직이는 애니메이션을 구현하려고 한다.

1. CSS

 .solution-sec { 
 	position: relative; 
 	--translate-x: 0; 
 	--translate-y: 0; 
 }
 
 .solution-sec::before { 
   display: block; 
   position: absolute; 
   right: -10%; 
   top: -70%; 
   z-index: -1; 
   width: 31.25%; 
   min-width: 300px; 
   padding-top: 31.25%; 
   border-radius: 50%; 
   background-color: var(--em-color-11); 
   opacity: 0.08; 
   content: ''; 
   filter: blur(50px); 
   transform: translateX(var(--translate-x)) translateY(var(--translate-y));
} 

내가 애니메이션을 적용할 요소는 가상요소이기 때문에 바로 애니메이션 적용이 불가능하다. 부모 요소에 변수를 정의해주고, 실제 애니메이션이 적용될 가상요소에 변수값을 넣어준다.

2. JavaScript

let animateInterval;

function initCicleAnimate() {
  if (animateInterval) { // 이미 애니메이션이 존재할 경우
    clearInterval(animateInterval); // 초기화해준다
  }
  
  if (window.innerWidth > 768) { // 768px 이상 pc 사이즈에서만 동작하도록
    function circleAnimate() {
      	const randomX = Math.random() * 200 - 200; // -200 ~ 0 사이의 랜던함 값 생성
      	const randomY = Math.random() * 200 - 50; // -50 ~ 150 사이의 랜덤한 값 생성

      	gsap.to(".solution-sec", { // 부모 요소에 gsap 애니메이션 적용
        	duration: 4,
        	"--translate-x": `${randomX}%`, // 변수에 랜던함 값 설정
        	"--translate-y": `${randomY}%`, // 변수에 랜던함 값 설정
        	ease: "power1.inOut",
        	yoyo: true, // 역방향으로 재생되도록
        	repeat: -1, // 무한 반복
      	});
    }

    circleAnimate();
    animateInterval = setInterval(circleAnimate, 4000);
  } else { // 768px 이하 모바일 사이즈에서는 애니메이션 제거
    gsap.killTweensOf(".solution-sec"); // 애니메이션 중지
    // 초기값으로 설정
    gsap.set(".solution-sec", { "--translate-x": 0, "--translate-y": 0 });
  }
}

initCicleAnimate(); // 초기 함수 호출
// debounce 적용하여 0.2초마다 initCicleAnimate 함수 호출
const debouncingInitCircleAnimate = debounce(initCicleAnimate, 200); 
// resize 이벤트에 디바운스 함수 연결
window.addEventListener("resize", debouncingInitCircleAnimate);
profile
Markup Developer🧑‍💻

1개의 댓글

comment-user-thumbnail
2024년 8월 21일

Carrie님 안녕하세요.

저는 루쿠쿠라는 회사를 운영 중인 이동욱입니다.

구글 검색을 하다 Carrie님의 기술 블로그를 보게 되었고, 채용에 관심이 있어서 연락을 드립니다.
현재 저희 팀에 실력 있는 프론트엔드 개발자를 찾고 있는데, 현재 구직 중이신지 궁금합니다.

간단하게 루쿠쿠 회사 소개를 드리면, 이커머스를 운영하는 회사들의 IT 기술 문제를 해결하는 회사입니다.

진행 프로젝트는 스타트업 발란의 글로벌 스토어(https://balaan.com) 제작 및 제품/ 주문 시스템 연동, 아웃도어 브랜드 살로몬 (https://salomon.co.kr) 스토어 제작, 이외에 논픽션, 스탠드오일 등 여러 이커머스 스토어를 제작 및 IT 기술문제를 해결 하고 있습니다.

주로 쇼피파이 플랫폼을 활용하여 HTML, CSS, vanila JS부터 React(Next.js), 백엔드에서는 Python Django 기술을 다루고 있습니다. 저도 스타트업 개발자 출신이라 회사에서도 계속해서 좋은 기술을 사용하려고 합니다. 회사는 올해로 3년 차인데, 국내외 실력 있는 32명 팀 멤버들과 함께 빠르게 성장 중입니다.

저희 회사 프론트엔드 포지션에 관심 있으신지
이메일이나 문자/전화로 답변 한번 주시면 감사하겠습니다. :-)

HP: 010-4173-6542
EMAIL: dw.lee@lukuku.co

답글 달기