✨ UI 효과

스크롤 애니메이션 만드는 법
페이지가 살아 움직이게 하기

📅 2026년 6월 7일 ✍️ 뚝딱닷컴 ⏱️ 5분 읽기 👁 -

🎬 스크롤을 내리면 콘텐츠가 나타나는 사이트

좋은 사이트를 보면 스크롤할 때마다 콘텐츠가 아래에서 위로 부드럽게 올라온다. 처음엔 보이지 않다가 화면에 들어오는 순간 스르륵 나타난다. 뭔가 살아있는 느낌이다.

직접 만들어봤다. 생각보다 훨씬 간단했다. CSS 몇 줄과 JavaScript 열 줄이면 된다. AI한테 시키면 그보다도 빠르다.

💡

플러그인도, 외부 라이브러리도 필요 없다. 브라우저가 기본으로 제공하는 IntersectionObserver API 하나면 충분하다.

🌊 스크롤 애니메이션이 뭔가요?

말 그대로 스크롤에 반응하는 애니메이션이다. 페이지를 처음 열면 화면 아래쪽 콘텐츠는 보이지 않는다. 스크롤을 내려서 그 요소가 화면에 들어오는 순간, 페이드인(서서히 나타남)이나 슬라이드업(아래에서 위로 올라옴) 효과가 실행된다.

효과는 단순하지만 사이트가 주는 느낌이 완전히 달라진다. 정적인 페이지가 살아있는 것처럼 보인다.

👻
적용 전
한 번에 다 보임
적용 후
스크롤 시 등장
🎯
효과
세련된 인상

⚙️ 작동 원리 — IntersectionObserver

핵심은 IntersectionObserver라는 브라우저 내장 기능이다. 특정 요소가 화면(뷰포트)에 들어오거나 나갈 때 자동으로 알려준다. 스크롤 이벤트를 직접 감지하는 것보다 훨씬 성능이 좋다.

흐름은 이렇다.

JavaScript가 타이밍을 잡고, CSS가 실제 움직임을 담당하는 구조다.

🪜 만드는 순서

세 단계면 끝난다. AI한테 그대로 요청해도 된다.

1
CSS에 숨김 상태와 애니메이션 정의 초기 상태는 투명하고 아래에 있다가, visible 클래스가 붙으면 원래 위치로 올라오면서 나타나는 CSS를 작성한다.
2
JavaScript로 IntersectionObserver 생성 화면에 들어오는 요소를 감지해서 visible 클래스를 추가하는 옵저버를 만든다. 10줄 내외의 코드다.
3
HTML 요소에 클래스 추가 애니메이션을 적용하고 싶은 섹션이나 카드에 scroll-hidden 클래스를 붙인다. 그게 전부다.
🤖

AI한테 "스크롤 애니메이션 추가해줘. 아래에서 위로 부드럽게 나타나게"라고 하면 위 세 단계를 한 번에 처리해준다. 어떤 요소에 적용할지도 같이 알려주면 더 빠르다.

실제 코드 예시

CSS
.scroll-hidden {
  opacity: 0;
  transform: translateY(32px);
  transition: opacity 0.6s ease, transform 0.6s ease;
}

.scroll-hidden.visible {
  opacity: 1;
  transform: translateY(0);
}
JavaScript
const observer = new IntersectionObserver(function (entries) {
  entries.forEach(function (entry) {
    if (entry.isIntersecting) {
      entry.target.classList.add('visible');
      observer.unobserve(entry.target);
    }
  });
}, { threshold: 0.15 });

document.querySelectorAll('.scroll-hidden').forEach(function (el) {
  observer.observe(el);
});

⏱️ 속도와 딜레이 조정

transition 속도는 0.6초가 자연스럽다. 너무 빠르면 효과가 안 보이고, 너무 느리면 답답하게 느껴진다.

카드 여러 개가 한꺼번에 나타나면 어색하다. 각 요소마다 딜레이를 조금씩 다르게 주면 순서대로 등장하는 효과가 생긴다.

CSS — 순서별 딜레이
.card:nth-child(1) { transition-delay: 0s;    }
.card:nth-child(2) { transition-delay: 0.12s; }
.card:nth-child(3) { transition-delay: 0.24s; }

카드 세 개가 왼쪽부터 0.12초 간격으로 순서대로 등장하면 훨씬 자연스럽다. 간격이 너무 벌어지면 기다리는 느낌이 나니까 0.1~0.15초 정도가 적당하다.

📱 모바일에서도 작동하나?

작동한다. IntersectionObserver는 모바일 브라우저에서도 동일하게 지원된다. 터치 스크롤에도 그대로 반응한다.

별도로 모바일용 코드를 따로 작성할 필요가 없다. PC에서 만든 코드가 모바일에서도 그대로 돌아간다.

💡

구형 브라우저(IE 등) 지원이 필요하다면 폴백 처리가 필요하지만, 2024년 이후 사용자 대부분은 모던 브라우저를 쓰므로 신경 쓸 필요가 없다.


⚠️ 주의할 점

너무 많은 요소에 적용하면 어떻게 되나요?
오히려 산만해진다. 모든 글자, 모든 버튼에 애니메이션을 달면 페이지가 정신없이 움직인다. 섹션 단위로 적용하는 게 적당하다. 카드 그룹, 주요 텍스트 블록, 이미지 정도에만 쓰는 게 좋다.
첫 화면(Above the fold) 콘텐츠에도 적용해야 하나요?
첫 화면에 보이는 콘텐츠는 처음부터 바로 보여야 한다. 거기에 숨김 처리를 하면 페이지가 로드됐는데 아무것도 안 보이는 것처럼 느껴진다. 스크롤해야 나오는 영역에만 적용하는 게 원칙이다.
동작 감소 설정(prefers-reduced-motion)을 고려해야 하나요?
일부 사용자는 시스템 설정에서 애니메이션을 줄이도록 설정해둔다. CSS에 @media (prefers-reduced-motion: reduce)를 추가해서 해당 사용자에게는 애니메이션을 끄는 처리를 해주면 더 배려 있는 사이트가 된다.

✅ 마무리 — 애니메이션 하나로 달라지는 완성도

스크롤 애니메이션은 기능이 아니라 인상이다. 같은 내용이라도 스르륵 나타나는 사이트가 훨씬 공들인 것처럼 보인다.

코드는 열 줄짜리다. AI한테 한 번 시키면 전체 페이지에 적용하는 데 5분도 안 걸린다. 사이트 완성도가 확 올라가는 체감이 크다. 안 해볼 이유가 없다.

스크롤 애니메이션 적용부터 전체 UI 완성까지 단계별로 설명한 교재가 준비돼 있어요.

📖 뚝딱닷컴 교재 보기