스크롤 연동 히어로 섹션
Overview
히어로 섹션을 GSAP ScrollTrigger + SplitText로 구현한 프로젝트입니다. 400vh 높이의 sticky 컨테이너 안에서 글자별 그라디언트 애니메이션, 3D 글래스 패널 입장, 스크롤 기반 패럴랙스 퇴장까지 — 프리미엄 랜딩 히어로의 핵심 패턴을 담았습니다.
SplitText로 분리된 각 글자에 그라디언트 색상을 보간 적용하고, 마스터 타임라인이 badge → 텍스트 → 버튼 → 3D 카드 순으로 오케스트레이션합니다. 스크롤 시에는 글자별 scale + blur 페이드아웃과 카드 패럴랙스가 동시에 진행됩니다.
Anatomy
UI 해부도
히어로 섹션은 sticky 컨테이너 안에 6개의 독립 레이어가 겹쳐진 구조입니다. 중앙의 SplitText 헤드라인을 중심으로 3D 글래스 카드들이 궤도를 따라 배치됩니다.
- Logo
- 로고 · 태그라인
- HeroContent
- SplitText 헤드라인 · 배지 · CTA
- Glass Card 1
- Motion Studio 패널 · 3D rotateY 입장
- Glass Card 2
- 로그인 폼 패널 · 좌측 슬라이드인
- Glass Card 3
- Pixel Flow 패널 · 우측 슬라이드인
- GlassOrbit
- 3D 회전 글래스 오비트
Structure
프로젝트 아키텍처
컴포넌트 기반으로 히어로 섹션의 각 요소를 독립 파일로 분리합니다. 레이아웃 · 콘텐츠 · 글래스 · 유틸리티 4개 레이어로 관심사가 명확히 나뉩니다.
- SectionHero.tsx
- 루트 섹션 · sticky 래퍼 · 패럴랙스 ScrollTrigger
- HeroContent.jsx
- SplitText 헤드라인 · 그라디언트 보간
- BgOrbs.jsx
- 프리셋 기반 배경 그라디언트 블롭
- GlassWrapper.tsx
- 글래스모피즘 패널 래퍼 · backdrop-blur
- GlassOrbit.jsx
- 3D 회전 글래스 링 오비트
- isMobileDevice.js
- 모바일 디바이스 감지 유틸
Data Flow
컴포넌트 데이터 플로우
초기화 → 마스터 타임라인 → 스크롤 패럴랙스 3단계로 흐릅니다. 각 단계는 독립적으로 구성되어 gsap.context() 안에서 안전하게 관리됩니다.
ANIMATION OUTPUT
- HeroContent
- 글자 그라디언트
- char별 backgroundPosition 보간
- GlassWrapper
- 3D 패널 입장
- rotateY 240° → 0°
- SplitText
- 글자별 퇴장
- scale + blur + opacity
- BgOrbs
- 배경 블롭
- 그라디언트 Orb 부유
Timeline
애니메이션 타임라인
마스터 타임라인은 약 2.4초 동안 7개 레이어를 오케스트레이션합니다. 배지 · 텍스트가 먼저 진입하고, 3D 카드들이 시차를 두고 rotateY 착지합니다.
- 배지 위에서 아래로 페이드인
- 글자별 yPercent + rotateX + blur 해제 (stagger 30ms)
- 설명 텍스트 y:40 → 0 페이드인
- CTA 버튼 그룹 y:35 → 0
- 좌측 카드 rotateY 240° → 0° 슬라이드인
- 우측 카드 rotateY -240° → 0° 슬라이드인
- 하단 카드 rotateY -240° → 0° 슬라이드인
Interaction
인터랙션 플로우
페이지 로드 시 입장 타임라인이 먼저 실행되고, 완료 후 스크롤 패럴랙스가 활성화됩니다. masterTl 진행률이 1 미만이면 패럴랙스가 스킵되어 입장 중 스크롤 충돌을 방지합니다.
- 1
배지 y:-30 → 0 페이드인
badge fadeIn (0.6s) - 2
SplitText chars yPercent + rotateX 해제
stagger: 0.03 per char - 3
설명 텍스트 · CTA 버튼 순차 진입
- 4
3D 글래스 카드 rotateY 착지
rotateY: ±240° → 0°
- 1
ScrollTrigger progress 0 → 1 추적
trigger: section, end: bottom bottom - 2
각 글자별 scale · blur · opacity 개별 계산
charProgress = clamp(progress) - 3
PARALLAX config 기반 요소별 y · fade 적용
data-hero → PARALLAX[key]
Patterns
핵심 기술 패턴
단순히 모션이 예쁜 것이 아니라, 프로덕션에서 유지보수 가능한 구조로 설계했습니다. SplitText 그라디언트 · 3D 카드 입장 · 글자별 퇴장까지 — 실무에서 바로 적용할 수 있는 패턴입니다.
- 글자별 그라디언트 보간
- SplitText chars에 background-position을 인덱스 비율로 계산하여 무지개 그라디언트 효과 구현
- s.backgroundPosition = `${(i / total) * 100}% 0`
- rotateY 3D 카드 입장
- transformPerspective 800px에서 rotateY ±240°로 시작해 0°로 착지하는 카드 플립 인트로
- { rotateY: -240, transformPerspective: 800 }
- 라이프사이클 안전성
- gsap.context()로 모든 트윈을 스코프화 — 언마운트 시 ctx.revert() 한 줄로 전체 클린업
- ctx = gsap.context(() => { ... }, section)
- 글자별 스크롤 퇴장
- 스크롤 progress에 따라 각 글자의 scale · blur · opacity를 개별 계산하여 순차 소멸
- scale: 1 + charProgress * 2 filter: blur(charProgress * 8)
- 데이터 기반 패럴랙스
- data-hero 속성값을 키로 PARALLAX 객체에서 y · x · rotateY · fade 값을 룩업하여 적용
- PARALLAX = { badge: { y: 80, fade: 0.8 } }
- 모바일 최적화 분기
- isMobileDevice()로 분기하여 모바일에서는 높이 100vh, 카드 숨김, blur 필터 제거로 성능 확보
- if (mobile) section.style.height = '100vh'
Responsive
반응형 전략
데스크탑 퍼스트로 설계하고, 모바일에서는 성능 최적화를 위해 카드 · blur · 패럴랙스를 JS 분기로 완전히 제거합니다.
- 400vh 높이 패럴랙스
- 3D 글래스 카드 3개 표시
- SplitText char별 blur 퇴장
- GlassOrbit 3D 회전
- BgOrbs 배경 블롭
- 카드 크기 축소 (max-lg)
- 패널 위치 · 패딩 조정
- 폰트 사이즈 스케일
- GlassOrbit 유지
- 패럴랙스 동작 유지
- 높이 100vh (패럴랙스 제거)
- 글래스 카드 전체 숨김
- blur 필터 제거 (성능)
- 전체 h1 fade 애니메이션
- GlassOrbit 숨김