📌 "단순한 스크롤이 아니라, 경험을 디자인하는 것!"
웹사이트를 방문했을 때 첫인상이 가장 중요한 순간입니다.
하지만, 그냥 단순히 텍스트와 이미지가 나열된 사이트와,
스크롤할 때마다 콘텐츠가 살아 움직이는 사이트 중 어느 쪽이 더 기억에 남을까요?
사용자의 시선을 사로잡고, 브랜드를 각인시키는 비밀은 인터랙티브한 스크롤 애니메이션에 있습니다.
오늘은 스크롤을 활용한 인터랙티브 웹사이트를 만드는 방법과, 실제로 구현할 수 있는 다양한 아이디어를 소개해드리겠습니다. 🎨
🎬 스크롤 인터랙션이란?
**스크롤 인터랙션(Scroll Interaction)**은 사용자가 페이지를 아래로 내릴 때 콘텐츠가 자연스럽게 등장하거나, 움직이거나, 변형되는 효과를 의미합니다.
✅ 왜 중요한가요?
- 사용자의 몰입도를 증가시켜 브랜드와의 상호작용을 유도합니다.
- 단순한 정보 전달이 아니라, 스토리텔링이 가능해집니다.
- 지루함을 없애고, 자연스럽게 다음 콘텐츠를 탐색하도록 유도합니다.
✅ 어디에 사용할 수 있나요?
- 제품 홍보 페이지 (애플, 테슬라처럼)
- 랜딩 페이지 (스타트업, 포트폴리오)
- 인터랙티브 스토리텔링 사이트 (뉴스, 캠페인 사이트)
이제 직접 구현할 수 있는 스크롤 인터랙션 예제를 살펴볼까요? 😍
🔥 스크롤 인터랙티브 효과 5가지 구현 예제
1️⃣ 스크롤할 때 요소가 부드럽게 나타나는 효과 (Fade In)
✅ 사용 라이브러리: Framer Motion
import { motion } from "framer-motion";
import { useEffect, useState } from "react";
function ScrollFadeIn({ children }) {
const [isVisible, setIsVisible] = useState(false);
useEffect(() => {
const handleScroll = () => {
const scrollTop = window.scrollY;
setIsVisible(scrollTop > 100);
};
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
}, []);
return (
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: isVisible ? 1 : 0 }}
transition={{ duration: 0.8 }}
>
{children}
</motion.div>
);
}
export default ScrollFadeIn;
✅ 설명: 사용자가 100px 이상 스크롤하면 콘텐츠가 부드럽게 나타남.
2️⃣ 스크롤할 때 배경이 바뀌는 효과 (Scroll Triggered Background)
✅ 사용 라이브러리: GSAP + ScrollTrigger
import { useEffect, useRef } from "react";
import gsap from "gsap";
import ScrollTrigger from "gsap/ScrollTrigger";
function ScrollBackground() {
const ref = useRef(null);
useEffect(() => {
gsap.registerPlugin(ScrollTrigger);
gsap.to(ref.current, {
backgroundColor: "#ff0000",
duration: 1,
scrollTrigger: {
trigger: ref.current,
start: "top center",
end: "bottom center",
scrub: true,
},
});
}, []);
return <div ref={ref} style={{ height: "100vh", backgroundColor: "#000" }}></div>;
}
export default ScrollBackground;
✅ 설명: 특정 위치에서 배경 색상이 변하는 효과.
3️⃣ 스크롤을 내릴 때 이미지가 확대되는 효과 (Parallax Zoom)
✅ 사용 라이브러리: GSAP + ScrollTrigger
import { useRef, useEffect } from "react";
import gsap from "gsap";
import ScrollTrigger from "gsap/ScrollTrigger";
function ScrollZoomImage() {
const imageRef = useRef(null);
useEffect(() => {
gsap.registerPlugin(ScrollTrigger);
gsap.to(imageRef.current, {
scale: 1.5,
duration: 2,
scrollTrigger: {
trigger: imageRef.current,
start: "top bottom",
end: "top center",
scrub: true,
},
});
}, []);
return <img ref={imageRef} src="/example.jpg" alt="Zoom Image" style={{ width: "100%" }} />;
}
export default ScrollZoomImage;
✅ 설명: 스크롤을 내릴수록 이미지가 확대되며 시각적 집중도를 높임.
4️⃣ 스크롤을 내릴 때 텍스트가 타이핑되는 효과 (Typing Effect)
✅ 사용 라이브러리: Framer Motion
import { motion } from "framer-motion";
function TypingText({ text }) {
return (
<motion.p initial={{ opacity: 0 }} animate={{ opacity: 1 }} transition={{ duration: 1 }}>
{text}
</motion.p>
);
}
export default TypingText;
✅ 설명: 스크롤을 내릴 때 텍스트가 부드럽게 나타나는 효과.
5️⃣ 스크롤할 때 요소가 회전하는 효과 (Scroll Rotation)
✅ 사용 라이브러리: GSAP
import { useEffect, useRef } from "react";
import gsap from "gsap";
function ScrollRotate() {
const ref = useRef(null);
useEffect(() => {
gsap.to(ref.current, {
rotation: 360,
duration: 2,
scrollTrigger: {
trigger: ref.current,
start: "top bottom",
end: "top center",
scrub: true,
},
});
}, []);
return <div ref={ref} style={{ width: "100px", height: "100px", background: "blue" }}></div>;
}
export default ScrollRotate;
✅ 설명: 사용자가 스크롤할 때 요소가 360도 회전하는 효과.
🎯 결론: 인터랙티브한 웹사이트로 사용자 경험을 업그레이드하세요!
지금까지 스크롤 인터랙션을 활용한 다양한 애니메이션 효과를 소개해드렸습니다. 🏆
✅ 어떤 프로젝트에서 활용하면 좋을까요?
- 브랜드 랜딩 페이지 🏢
- 제품 홍보 페이지 📱
- 인터랙티브 스토리텔링 🎭
- 개발자 포트폴리오 🚀
단순한 웹사이트가 아닌, 사용자가 기억하는 웹사이트를 만드세요! 🎨✨
🚀 당신의 프로젝트에 맞는 스크롤 인터랙션을 적용해보세요! 😊
'React.js' 카테고리의 다른 글
React.js vite 설치 및 vite로 ./../../ 없애고 파일 경로 단축해서 사용 및 import문 정리하기 (0) | 2025.04.10 |
---|---|
[Dseok의 코딩스터디] Axios POST 요청 완벽 가이드 – 기본부터 고급까지 (0) | 2025.03.08 |
[Dseok의 코딩스터디] React에서 Axios 한방에 끝내기 | 실전 예제와 고급 활용법 (0) | 2025.03.08 |
[Dseok의 코딩스터디] React.js useMemo 한방에 끝내기 | 개념 & 실전 예제 7가지 (0) | 2025.03.05 |
[Dseok의 코딩스터디] React.js useRef 한방에 끝내기 | 개념 & 실전 예제 9가지 (0) | 2025.03.04 |