스크롤 페이드는 UX 안티패턴, 이제 그만 써야 할 때
스크롤에 맞춰 나타나는 페이드인 애니메이션은 사용성을 해치고 페이지를 느리게 만듭니다. 이 패턴이 계속 쓰이는 이유와 대안을 정리했습니다.

지난 5년간 만들어진 마케팅 사이트, SaaS 랜딩 페이지, 포트폴리오라면 어디서든 이런 걸 보셨을 겁니다. 스크롤을 내리면 콘텐츠가 아래에서 페이드인되거나 옆에서 슬라이드되거나, 화면에 들어오는 순간 허공에서 나타납니다. 때로는 요소마다 시간차를 두어서 합창단이 줄지어 등장하듯 하나씩 차례로 튀어나오기도 하죠. 이걸 만든 개발자는 '세련돼 보인다'고 생각합니다. 하지만 이 페이지에 들어온 사용자는 그저 내용을 읽고 싶을 뿐입니다.
스크롤 연동 페이드인 애니메이션, 일명 '스크롤 리빌'은 웹에서 가장 흔한 패턴 중 하나가 됐습니다. 그리고 사용자 입장에서는 가장 불편한 패턴 중 하나이기도 합니다. 체감 성능을 떨어뜨리고, 접근성을 해치고, 내용을 훑어보는 방해가 되며, 페이지를 이해하는 데는 아무 도움이 되지 않습니다. 이제 그만 써야 할 때입니다.
스크롤 페이드를 반대하는 이유
스크롤 페이드의 문제는 미묘한 수준이 아닙니다. 근본적인 문제입니다.
스크롤하기 전까지 콘텐츠가 보이지 않습니다. 당연해 보이지만 그 의미를 한번 생각해 보세요. 사용자가 가격표, 기능 비교표, 기술 사양처럼 특정 섹션을 찾으려고 빠르게 스크롤하면, 애니메이션이 따라잡을 때까지 빈 화면을 보게 됩니다. 콘텐츠는 DOM에 있지만 opacity: 0과 아직 실행되지 않은 CSS 트랜지션 뒤에 숨어 있을 뿐입니다. 빠르게 스크롤하는 사용자는 아무것도 보지 못합니다. Ctrl+F로 페이지 내 검색을 하는 사용자는 보이지 않는 텍스트에 도착하게 되고, 일부 보조 기술 사용자는 아예 스크롤 이벤트를 발생시키지 못할 수도 있습니다.
빠르게 읽는 사람에게 불리합니다. 시간차 페이드인은 사용자가 콘텐츠를 얼마나 빨리 소화할 수 있든 상관없이 요소가 하나씩 나타날 때까지 기다리게 만듭니다. 관련 정보를 찾으려고 페이지를 훑는 숙련된 독자는 애니메이션 속도에 맞춰 인위적으로 느려집니다. 다섯 개 항목이 있는 섹션에서 요소당 300ms 지연이 생기면 강제로 1.5초를 기다려야 합니다. 제품을 평가하려는 사람에게는 영원처럼 느껴지는 시간입니다.
뒤로 가기 버튼을 망가뜨립니다. 페이지에 들어가 절반쯤 스크롤한 뒤 링크를 클릭하고 뒤로 가기를 누른다고 해보세요. 많은 스크롤 페이드 구현에서는 이미 봤던 콘텐츠가 다시 안 보이는 상태로 돌아갑니다. 방금 본 내용을 다시 보려면 애니메이션을 다시 트리거하기 위해 또 스크롤해야 합니다.
성능 비용
스크롤 페이드 애니메이션은 '최적화'를 해도 실제 성능 비용이 듭니다. Intersection Observer API가 스크롤 이벤트 리스너보다 낫긴 하지만, 이 패턴은 여전히 JavaScript가 실행되어 교차 비율을 계산하고 스크롤 중에 DOM 요소를 변경해야 합니다. 페이드인 요소가 50개인 페이지라면 사용자가 스크롤할 때마다 옵서버 50개가 동시에 동작하는 셈입니다.
// The "modern" approach — still problematic
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
// Each of these triggers a style recalculation
// and potentially a layout/paint operation
}
});
}, { threshold: 0.1 });
// Observing 50+ elements on a landing page
document.querySelectorAll('.fade-in').forEach(el => {
observer.observe(el);
});
// Plus the CSS:
// .fade-in { opacity: 0; transform: translateY(20px); transition: 0.6s; }
// .fade-in.visible { opacity: 1; transform: translateY(0); }
더 큰 성능 문제는 CLS(Cumulative Layout Shift, 누적 레이아웃 이동)입니다. opacity: 0과 translateY 오프셋으로 시작해서 최종 위치로 애니메이션되는 요소는 조심해서 다루지 않으면 레이아웃 이동을 일으킬 수 있습니다. 구글의 Core Web Vitals는 이를 감점 요인으로 봅니다. 많은 스크롤 페이드 구현이 CLS 점수를 낮춰서 검색 순위에 악영향을 주고 있는데, 이는 마케팅 사이트가 원하는 결과와 정반대입니다.
그리고 초기 렌더링 문제도 있습니다. 콘텐츠가 처음부터 숨겨진 상태로 시작하죠. JavaScript 로딩이 실패하거나, 광고 차단기에 걸리거나(애니메이션 라이브러리가 종종 차단 대상이 됩니다), 에러가 나면 콘텐츠는 영원히 보이지 않습니다. 그렇게 '세련된' 랜딩 페이지는 빈 페이지가 됩니다.
접근성 훼손
전정기관 장애가 있는 사용자는 — 40대 이상 성인의 약 35%가 여기에 해당합니다 — 모션 효과 때문에 어지럼증, 메스꺼움, 방향 감각 상실을 겪을 수 있습니다. prefers-reduced-motion 미디어 쿼리는 바로 이 문제를 해결하려고 존재하지만, 많은 스크롤 페이드 구현이 이를 완전히 무시합니다.
/* The bare minimum, which most sites skip */
@media (prefers-reduced-motion: reduce) {
.fade-in {
opacity: 1 !important;
transform: none !important;
transition: none !important;
}
}
prefers-reduced-motion을 지원하더라도 더 깊은 접근성 문제가 남아 있습니다. 스크린 리더는 스크롤이 아니라 제목, 랜드마크, 링크를 기준으로 탐색합니다. 스크롤 이벤트가 발생하기 전까지 콘텐츠가 숨겨져 있다면, 스크린 리더 사용자는 보이지 않는 요소를 만나거나, 시각 사용자는 아직 보지 못한 내용을 리더가 읽어 주는 상황이 생깁니다. 음성과 시각 피드백을 함께 쓰는 사용자에게는 혼란스러운 어긋남이 됩니다.
키보드 탐색도 비슷하게 영향을 받습니다. 스크롤 페이드 요소가 있는 페이지에서 Tab 키를 누르면 보이지 않는 링크와 버튼에 포커스가 갑니다. 포커스 아웃라인이 투명한 요소 위에 나타나고, 사용자는 자신이 무엇에 포커스를 두었는지 전혀 알 수 없습니다.
이 패턴이 계속 쓰이는 이유
이렇게 문제가 많은데 스크롤 페이드는 왜 어디에나 있을까요? 이유는 세 가지입니다.
첫째, 데모에서는 보기 좋습니다. 디자이너나 개발자가 이해관계자에게 랜딩 페이지를 보여 줄 때는 모두가 지켜보는 가운데 천천히 스크롤합니다. 애니메이션이 의도적이고 고급스럽게 느껴지죠. 하지만 실제 사용자는 그렇게 둘러보지 않습니다. 빠르게 스크롤하고, 여기저기 옮겨 다니고, 검색을 쓰고, 제목으로 이동합니다. 데모처럼 느리고 선형적이며 처음 방문하는 상황은 실제로 가장 드문 사용 패턴입니다.
둘째, 경쟁사가 모두 쓰고 있습니다. 스크롤 페이드는 '현대적인 웹 디자인'의 상징이 됐습니다. 이걸 쓰지 않으면 사이트가 정적으로 보이고, 이해관계자는 그걸 낡았다고 해석합니다. 순수한 카고 컬트입니다. 애니메이션이 기능을 하는 게 아니라, 역시 필요 없는 다른 사이트들이 만들어 낸 미적 기대치를 충족시키기 위해 존재합니다.
셋째, 템플릿과 컴포넌트 라이브러리가 기본으로 포함하고 있습니다. Framer Motion, AOS, ScrollReveal, GSAP ScrollTrigger 같은 라이브러리 덕분에 스크롤 애니메이션은 아주 쉽게 추가할 수 있습니다. 애니메이션 추가가 속성 한 줄이면 끝나는 수준이라 어디에나 붙게 됩니다. 구현 비용이 너무 낮아서, 이 애니메이션이 사용자에게 도움이 되는지 아무도 멈춰서 묻지 않습니다.
애니메이션이 실제로 도움이 될 때
모션이 본질적으로 나쁜 것은 아닙니다. 다음 목적에 맞게 쓰이면 애니메이션은 정당한 UI 도구입니다.
- 인과관계 보여 주기. 버튼을 누르자 패널이 슬라이드되어 나타나면 동작과 결과의 관계가 전달됩니다. 이는 사용자가 인터페이스에 대한 정신 모델을 만드는 데 도움을 줍니다.
- 주의 집중시키기. 알림 배지에 은은한 펄스 효과를 주면 새 정보로 시선이 갑니다. 이는 스크롤을 기다리는 수동적 방식이 아니라 시스템이 먼저 주의를 이끄는 능동적 방식입니다.
- 공간적 맥락 유지하기. iOS의 내비게이션 push/pop처럼 뷰 사이의 애니메이션 전환은 사용자가 계층 구조에서 지금 어디에 있는지 이해하도록 돕습니다. 애니메이션이 없으면 변화가 갑작스럽게 느껴집니다.
- 피드백 제공하기. 로딩 스피너, 진행률 표시줄, 스켈레톤 화면은 무언가 진행 중이라는 것을 알려 줍니다. 체감 대기 시간을 줄여 줍니다.
이 모든 예시의 공통점을 보세요. 애니메이션이 정보를 전달합니다. 사용자가 인터페이스를 이해하도록 돕죠. 스크롤 페이드는 둘 중 어느 것도 하지 못합니다. 순전히 장식일 뿐입니다. 아래에서 올라오는 콘텐츠는 그 콘텐츠가 다른 요소와 어떤 관계에 있는지, 얼마나 중요한지 아무것도 알려 주지 않습니다. 움직임을 위한 움직임일 뿐입니다.
대신 무엇을 해야 할까
스크롤 페이드의 단점 없이 페이지를 역동적으로 만들고 싶다면, 실제로 효과가 있는 방법들을 소개합니다.
그냥 콘텐츠를 보여 주세요. 열 번 중 아홉 번은 이게 최선입니다. 바로 보이는 콘텐츠는 읽고, 검색하고, 훑어볼 수 있습니다. 타이포그래피, 명확한 계층 구조, 세심한 여백이 잘 갖춰진 레이아웃은 애니메이션 가득한 페이지보다 낫습니다. 더 빨리 로드되고, 접근성도 좋으며, JavaScript가 실패해도 깨지지 않습니다.
CSS 스크롤 기반 애니메이션을 쓰세요. 새로운 CSS animation-timeline: scroll()과 animation-timeline: view() 속성을 쓰면 JavaScript 없이도 스크롤과 연동된 효과를 만들 수 있습니다. GPU 가속을 받고, 레이아웃 이동을 일으키지 않으며, 지원하지 않는 환경에서도 자연스럽게 대체됩니다. 스크롤 연동 모션이 꼭 필요하다면 이게 올바른 방법입니다.
/* CSS scroll-driven animation — no JavaScript needed */
.parallax-bg {
animation: parallax linear;
animation-timeline: scroll();
}
@keyframes parallax {
from { transform: translateY(0); }
to { transform: translateY(-50px); }
}
/* Respects user preferences automatically */
@media (prefers-reduced-motion: reduce) {
.parallax-bg {
animation: none;
}
}
스크롤이 아니라 상호작용에 맞춰 애니메이션하세요. 호버 효과, 클릭 반응, 포커스 상태는 사용자의 의도에서 발생하며 직접적인 피드백을 줍니다. 연극처럼 과장되지 않고 반응이 빠르게 느껴집니다. 호버 시 살짝 떠오르는 카드는 '이건 인터랙티브합니다'라고 말해 줍니다. 스크롤하면 나타나는 카드는 아무 말도 하지 않습니다.
상태 변화에는 트랜지션을 쓰세요. 아코디언 펼치기, 모달 열기, 목록 필터링처럼 사용자 동작으로 콘텐츠가 실제로 나타날 때 그 전환을 애니메이션하세요. 인과관계가 드러납니다. 원래 항상 있었지만 스크롤하기 전까지 인위적으로 숨겨져 있던 콘텐츠와는 근본적으로 다릅니다. 흔한 UX 안티패턴을 다뤄 본 사람이라면 기능적 애니메이션과 장식적 애니메이션의 차이가 얼마나 중요한지 알 겁니다.
아끼는 것 버리기
스크롤 페이드를 없애는 것에서 가장 어려운 부분은 기술이 아닙니다. 이해관계자(혹은 자기 자신)를 설득하는 일입니다. 우리는 모션과 세련됨을 연결하도록 길들여졌습니다. 정적인 페이지는 스크롤 애니메이션이 있는 페이지에 비해 미완성처럼 보입니다. 하지만 정적인 페이지가 더 빠르고, 더 접근성이 좋고, 쓰기도 더 쉬운데도 말이죠.
이 실험을 한번 해보세요. 스크롤 페이드가 많은 페이지를 골라 모든 애니메이션을 끄고, 모든 것을 한꺼번에 보여 주세요. 그리고 물어보세요. 잃어버린 정보가 있나요? 요소 간 관계가 덜 분명해졌나요? 페이지를 이해하기 더 어려워졌나요? 거의 항상 답은 아니요입니다. 그 애니메이션들은 장식이었고, 콘텐츠는 그 자체로 충분히 설득력이 있었던 겁니다.
콘텐츠가 애니메이션 없이는 매력적으로 느껴지지 않는다면, 문제는 애니메이션이 없다는 데 있지 않습니다. 콘텐츠에 있습니다. 콘텐츠를 고치세요.


