본문 바로가기

Front-end/Design

히어로 등장 애니메이션

히어로 소개 페이지에 사용할 이미지에 배경과 히어로 이미지를 겹치게 두어 히어로가 등장하는 효과를 주고 싶었다. 

css로 애니메이션 적용 시 페이지가 로드되었을 때 애니메이션이 실행되므로 js로 현재 스크롤 위치와 이미지 컨테이너의 scrollY값을 받아 스크롤이 근처에 왔을 때 애니메이션이 실행되도록 하였다.

 

🧑‍💻 구현

const heroContainers = document.querySelectorAll(".hero-info-container");
const heroImages = document.querySelectorAll(".hero-image");

const hasAnimationPlayed = new Array(heroContainers.length);
hasAnimationPlayed.fill(false);

window.onscroll = () => {
  for (let i = 0; i < heroContainers.length; i++) {
    if (heroContainers[i].offsetTop - window.scrollY < 128) {
      hasAnimationPlayed[i] = true;
    }
  }

  for (let i = 0; i < heroContainers.length; i++) {
    if (hasAnimationPlayed[i]) {
      heroImages[i].classList.remove("hidden");
    }
  }
};

 

컨테이너의 offsetTop과 현재 window의 scrollY값의 차이가 특정 값보다 작아졌을 때 hidden 클래스를 없애 애니메이션이 실행되도록 했다.

🚀 TRY

첫 번째 이미지를 제외하고는 알맞은 위치에서 애니메이션이 실행되었다.

 

첫 번째 이미지는 페이지 로딩 시 애니메이션이 실행되게 하는 것이 나을까?

 

애니메이션이 한 번 실행된 후 스크롤이 위로 올라갔을 떄 이미지가 다시 hidden처리되는 스크립트를 getBondingClientRect 함수를 이용해 제작할 수 있을 것 같다. offsetTop도 이걸로 대체할 수 있을 것 같다.

'Front-end > Design' 카테고리의 다른 글

Hero select 디자인 구현  (0) 2024.02.04
Bouncing Logo Screen Saver 만들기  (0) 2024.02.01