반응형
Parallax Scrolling (CSS, JS, AOS, ScrollMagic, GSAP)
패럴랙스 스크롤링은 웹사이트의 요소들이 서로 다른 속도로 움직이는 것
- 레이어별 스크롤 속도를 다르게 하여 입체감을 주는 디자인 기법
- 게임, 애니메이션 등에서 주로 사용되던 기법으로 인터랙티브한 웹사이트를 만들 때 사용
- javascript, css, 라이브러리 등을 이용하여 구현
CSS를 이용한 패럴랙스 스크롤링
css perspective 속성을 이용한 패럴랙스 스크롤링 mdn
- 해당 요소의 z = 0 평면과 사용자 사이의 거리
- transform 효과를 주고자 하는 부모 요소에 적용
- perspective에 따른 변형 효과
- perspective: 100px; => 100px만큼 멀어져 보임
- perspective가 클수록 (거리가 멀수록) 변형 효과가 줄어듦
- perspective가 작을수록 (거리가 가까울수록) 변형 효과가 커짐
<div class="wrap">
<div id="div1" class="parallax"></div>
<div id="div2" class="parallax"></div>
<div id="div3" class="parallax"></div>
<strong class="title">Parallax Scolling (CSS)</strong>
</div>
.wrap {
height: 100vh;
overflow-x: hidden;
perspective: 1px;
}
.parallax {
position: absolute;
top: 0;
left: 0;
right: 0;
}
#div1 {
background-color: #333;
height: 150rem;
}
#div2 {
top: 300px;
background-color: aqua;
height: 500px;
transform: translateZ(-2px);
}
#div3 {
top: 500px;
background-color: blueviolet;
height: 500px;
transform: translateZ(-1px);
opacity: 0.7;
}
.title {
position: absolute;
top: 300px;
left: 50%;
transform: translateX(-50%);
color: #fff;
font-size: 3rem;
}
Javascript를 이용한 패럴랙스 스크롤링
javascript를 이용해서 패럴랙스 스크롤링 구현할 수 있습니다.
window.addEventListener('scroll', function() {})
window.scrollY
: 현재 스크롤된 y축의 위치window.innerHeight
: 브라우저의 높이element.offsetTop
: 해당 요소의 top 위치element.offsetHeight
: 해당 요소의 높이element.getBoundingClientRect()
: 해당 요소의 위치와 크기 정보
<div class="section">
<div class="parallax-element background"></div>
<strong class="parallax-element title">글씨는 스크롤이 느림</strong>
</div>
<div class="extra-content">
<p>Parallax Scrolling</p>
</div>
window.addEventListener('scroll', function () {
// 스크롤 이벤트 리스너 등록
var scrolled = window.pageYOffset;
var background = section.querySelector('.background'); // 배경 요소
var title = section.querySelector('.title'); // 제목 요소
background.style.transform = `translateY(${scrolled * 0.8}px)`; // 제목을 스크롤 속도의 80%(빠르게)로 이동
title.style.transform = `translateY(${scrolled * 0.3}px)`; // 배경을 스크롤 속도의 30%(느리게)로 이동
});
각 섹션이 보이는 범위에 따라 애니메이션 적용
window.addEventListener('scroll', function () {
// 스크롤 이벤트 리스너 등록
var sections = document.querySelectorAll('.section'); // 모든 섹션을 가져옴
sections.forEach(function (section) {
// 각 섹션에 대해 반복
var bounds = section.getBoundingClientRect(); // 섹션의 위치와 크기 정보를 가져옴, 뷰포트 기준6+-
var background = section.querySelector('.background'); // 배경 요소
var title = section.querySelector('.title'); // 제목 요소
// 섹션이 뷰포트 내에 있을 때
// 뷰포트 : 현재 보이는 화면
// 뷰포트의 top이 섹션의 bottom보다 작고, 뷰포트의 bottom이 섹션의 top보다 크면 뷰포트 내에 있다고 판단
if (bounds.top < window.innerHeight && bounds.bottom >= 0) {
var scrolled = window.pageYOffset - section.offsetTop; // 섹션의 시작점에서 스크롤된 거리를 계산
background.style.transform = `translateY(${scrolled * 0.8}px)`; // 제목을 스크롤 속도의 80%(빠르게)로 이동
title.style.transform = `translateY(${scrolled * 0.3}px)`; // 배경을 스크롤 속도의 30%(느리게)로 이동
}
});
});
AOS (Animate On Scroll)를 이용한 패럴랙스 스크롤링
AOS (Animate On Scroll)란 스크롤에 따라 요소에 애니메이션을 적용하는 라이브러리
AOS 설치
- 태그 내에 AOS 라이브러리를 추가
<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
- 태그 닫는 태그 바로 위에 AOS 라이브러리를 추가
<script src="https://unpkg.com/aos@next/dist/aos.js"></script>
<script>
AOS.init();
</script>
AOS 사용
AOS 초기화
AOS.init()
: AOS를 초기화AOS.init({})
: AOS를 초기화하면서 옵션을 설정 (https://github.com/michalsnik/aos?tab=readme-ov-file#1-initialize-aos)
AOS 옵션
offset
: 요소가 화면에 보이기 전에 애니메이션이 시작되는 위치delay
: 애니메이션이 시작되는 지연 시간duration
: 애니메이션의 지속 시간easing
: 애니메이션의 가속도once
: 애니메이션을 한 번만 실행anchor-placement
: 애니메이션이 실행되는 기준점
AOS 예제
GSAP과 ScrollTrigger를 이용한 애니메이션
GSAP은 웹 페이지나 웹 앱에서 다양한 애니메이션 효과를 만들 수 있도록 도와주는 강력한 도구로 널리 사용됩니다.
이 라이브러리는 웹 개발자들에게 다양한 기능과 API를 제공하여 스무스하고 반응적인 웹 애니메이션을 쉽게 구현할 수 있게 해줍니다.
https://gsap.com/
https://codepen.io/GreenSock (코드펜)
GSAP 설치
- CDN
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.4/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.4/ScrollTrigger.min.js"></script>
- NPM
npm install gsap
npm install gsap@3.6.0
npm install gsap@3.6.0 scrolltrigger
GSAP 사용법
https://gsap.com/docs/v3/GSAP/
gsap.to()
: 해당 요소에 애니메이션을 적용scrollTrigger
: 해당 요소에 스크롤 트리거를 적용trigger
: 트리거가 되는 요소start
: 트리거가 되는 요소의 시작 위치end
: 트리거가 되는 요소의 끝 위치scrub
: 스크롤 속도에 따라 애니메이션 속도가 달라짐pin
: 해당 요소를 고정markers
: 해당 요소의 트리거를 표시
gsap.to('요소', 시간, { 옵션 });
gsap.to('요소', { 옵션 });
gsap.to('요소', { 옵션, scrollTrigger: { 옵션 } });
gsap.to('.box', { rotation: 27, x: 100, duration: 1 });
기본 사용법
gsap.to('.green', { rotation: 360, x: 100, duration: 1 });
// 1초 동안 x축으로 100px 이동하면서 360도 회전
gsap.from('.purple', { rotation: -360, x: -100, duration: 1 });
// 1초 동안 x축으로 -100px 이동하면서 -360도 회전
gsap.fromTo('.blue', { x: -100 }, { rotation: 360, x: 100, duration: 1 });
// 1초 동안 x축으로 -100px에서 100px로 이동하면서 360도 회전
Timeline 사용법
var tl = gsap.timeline(); // Timeline 생성
tl.to('.box1', { duration: 2, x: 100 }, 1.5) // 2초 동안 x축으로 100px 이동 (1.5초 후에 실행)
.to('.box2', { duration: 1, y: 200 }, '-=0.75') // 1초 동안 y축으로 200px 이동 (0.75초 전에 실행)
.to('.box3', { duration: 3, rotation: 360 }, '+=1'); // 3초 동안 360도 회전 (1초 후에 실행)
실무 예제
반응형