AOS 스크롤 애니메이션 안 될 때, data-aos가 작동하지 않는 원인과 해결 방법
CSS 26.09.02 조회 17
홈페이지에 스크롤 애니메이션을 넣을 때 AOS를 사용하는 경우가 많습니다. HTML 요소에 data-aos="fade-up" 같은 속성을 넣으면 스크롤 위치에 맞춰 요소가 자연스럽게 나타나는 방식입니다.
그런데 실제 작업에서는 속성을 넣었는데도 애니메이션이 보이지 않거나, PC에서는 작동하는데 모바일에서는 어색하게 보이거나, 템플릿을 수정한 뒤 갑자기 효과가 사라지는 경우가 있습니다.
AOS 스크롤 애니메이션이 안 될 때는 CSS 파일 연결, JS 파일 연결, AOS.init() 실행 여부, data-aos 속성 위치, 숨김 영역 처리, 기존 CSS 충돌을 순서대로 확인하는 것이 좋습니다.
디자인키트의 HTML 템플릿이나 웹디자인 소스를 수정할 때도 AOS 효과가 적용된 섹션을 다루게 될 수 있습니다. 이때 애니메이션이 작동하지 않는 이유를 구조적으로 보면, 코드를 무작정 바꾸기보다 어디에서 문제가 생겼는지 빠르게 좁힐 수 있습니다.
AOS는 data-aos만 넣으면 바로 작동할까요?
AOS는 HTML 속성 하나만으로 완성되는 기능은 아닙니다. data-aos 속성은 “이 요소에 어떤 애니메이션을 적용할지” 알려주는 역할이고, 실제로 동작하려면 AOS 관련 CSS와 JavaScript가 함께 연결되어야 합니다.
기본 흐름은 아래와 같습니다.
<link rel="stylesheet" href="aos.css">
<div data-aos="fade-up">
스크롤하면 나타나는 영역
</div>
<script src="aos.js"></script>
<script>
AOS.init();
</script>
여기서 하나라도 빠지면 애니메이션이 보이지 않을 수 있습니다. CSS만 연결되어 있고 JavaScript가 없으면 스크롤 위치를 감지하지 못하고, JavaScript만 연결되어 있고 CSS가 없으면 움직임이나 투명도 효과가 제대로 보이지 않을 수 있습니다. 즉, AOS 오류를 볼 때는 먼저 “속성을 넣었는가”보다 “필요한 파일과 초기화가 모두 들어갔는가”를 확인해야 합니다.
CSS와 JS 파일이 제대로 연결됐는지 확인하기
AOS 애니메이션이 안 될 때 가장 먼저 볼 부분은 파일 연결입니다.
작업 중 경로를 바꾸거나 폴더 구조를 수정하면 aos.css, aos.js 파일 경로가 틀어질 수 있습니다. 특히 템플릿을 다른 폴더로 옮기거나, 공통 레이아웃 파일을 수정하면서 기존 경로가 맞지 않게 되는 경우가 있습니다.
확인할 부분은 간단합니다.
- aos.css 파일이 head 영역에 연결되어 있는지
- aos.js 파일이 script로 연결되어 있는지
- 파일 경로가 실제 위치와 맞는지
- 브라우저 개발자 도구에서 404 오류가 뜨지 않는지
- 기존 압축 파일명이나 버전명이 바뀌지 않았는지
파일 연결 문제는 화면상으로 바로 티가 나지 않을 때가 많습니다. 그래서 브라우저 개발자 도구의 Console 또는 Network 탭에서 파일이 정상적으로 불러와졌는지 확인하는 것이 좋습니다.
AOS.init()이 실행되고 있는지 확인하기
AOS는 파일을 연결한 뒤 AOS.init()을 실행해야 작동합니다. 이 코드가 빠져 있거나, AOS 파일보다 먼저 실행되면 애니메이션이 적용되지 않을 수 있습니다.
예를 들어 아래처럼 AOS 파일을 불러오기 전에 AOS.init()을 먼저 실행하면 문제가 생길 수 있습니다.
<script>
AOS.init();
</script>
<script src="aos.js"></script>
이 경우 브라우저는 AOS가 무엇인지 모르는 상태에서 실행하려고 하기 때문에 오류가 날 수 있습니다.
일반적으로는 아래처럼 AOS 파일을 먼저 연결한 뒤 초기화 코드를 넣는 방식이 안정적입니다.
<script src="aos.js"></script>
<script>
AOS.init({
duration: 700,
once: true
});
</script>
duration은 애니메이션 진행 시간, once는 한 번만 실행할지 여부를 조정할 때 사용할 수 있습니다. 작업 상황에 따라 값을 바꿀 수 있지만, 처음 점검할 때는 복잡한 옵션을 많이 넣기보다 기본 실행 여부부터 확인하는 것이 좋습니다.
data-aos 속성이 올바른 요소에 들어갔는지 보기
AOS는 data-aos 속성이 들어간 요소를 기준으로 애니메이션을 적용합니다. 따라서 속성이 엉뚱한 위치에 들어가 있거나, 실제 화면에 보이지 않는 요소에 들어가 있으면 기대한 효과가 나오지 않을 수 있습니다.
예를 들어 아래처럼 텍스트를 감싸는 실제 박스에 속성을 넣으면 확인하기 쉽습니다.
<div class="card" data-aos="fade-up">
<h3>서비스 소개</h3>
<p>홈페이지 주요 내용을 설명하는 영역입니다.</p>
</div>
반대로 너무 바깥쪽 레이아웃에만 속성을 넣으면 전체 섹션이 한 번에 움직여서 효과가 둔하게 보일 수 있고, 너무 안쪽 작은 요소에만 넣으면 사용자가 애니메이션을 인식하기 어려울 수 있습니다.
실무에서는 아래 기준으로 확인하면 좋습니다.
- 실제 화면에 보이는 요소에 data-aos가 들어갔는가?
- display:none 상태의 요소에 먼저 들어간 것은 아닌가?
- 부모 요소에 overflow:hidden이 있어 움직임이 잘리는 것은 아닌가?
- 너무 많은 요소에 동시에 애니메이션을 넣은 것은 아닌가?
- 카드, 이미지, 텍스트 블록처럼 시각적으로 구분되는 요소에 적용했는가?
AOS는 작은 요소마다 전부 넣는 것보다, 사용자가 변화를 느끼기 좋은 단위에 적용하는 편이 자연스럽습니다.
탭, 슬라이더, 숨김 영역 안에서는 왜 안 보일까요?
AOS가 정상 연결되어 있어도 탭 메뉴, 슬라이더, 모달, 숨김 처리된 영역 안에서는 애니메이션이 예상대로 보이지 않을 수 있습니다.
이유는 간단합니다. AOS는 페이지가 로드될 때 요소의 위치를 계산해 스크롤 시점을 판단합니다. 그런데 처음에는 숨겨져 있던 영역이 나중에 나타나면, AOS가 그 위치를 제대로 반영하지 못할 수 있습니다.
예를 들어 탭 두 번째 화면에 있는 요소, 슬라이더 안에 들어간 카드, 버튼 클릭 후 나타나는 콘텐츠는 처음 로딩 시점에 화면 구조가 달라질 수 있습니다.
이럴 때는 숨겨진 콘텐츠가 나타난 뒤 AOS를 다시 계산하도록 처리해야 할 수 있습니다.
<script>
AOS.refresh();
</script>
또는 동적으로 요소가 추가되는 구조라면 더 강한 갱신이 필요할 수 있습니다.
<script>
AOS.refreshHard();
</script>
다만 모든 상황에서 무조건 갱신 코드를 반복해서 넣는 것은 좋지 않습니다. 탭을 열거나 콘텐츠가 실제로 추가된 시점처럼 필요한 순간에만 사용하는 것이 안정적입니다.

기존 CSS와 충돌하는 부분도 확인해야 합니다
AOS가 안 보이는 이유가 AOS 코드 자체가 아니라 기존 CSS 때문일 때도 있습니다.
예를 들어 부모 요소에 overflow:hidden이 들어가 있으면 아래에서 위로 올라오는 효과가 잘려 보일 수 있습니다. 또 요소에 이미 opacity, transform, transition이 따로 적용되어 있으면 AOS가 주는 효과와 충돌할 수 있습니다.
특히 홈페이지 템플릿에서는 공통 애니메이션, hover 효과, 슬라이더 효과, 반응형 CSS가 함께 들어가는 경우가 많기 때문에 AOS만 따로 보는 것보다 주변 스타일도 같이 확인해야 합니다.
점검할 CSS는 아래와 같습니다.
- opacity
- transform
- transition
- animation
- overflow:hidden
- display:none
- visibility:hidden
- position
- z-index
예를 들어 요소가 실제로는 움직이고 있는데 다른 영역 뒤에 가려져 있거나, 투명도 값이 계속 0으로 유지되어 보이지 않는 경우도 있습니다. 개발자 도구에서 해당 요소에 어떤 스타일이 최종 적용되고 있는지 확인하면 원인을 찾기 쉽습니다.
모바일에서 AOS가 어색하다면 옵션을 조정해보기
PC에서는 자연스럽게 보이던 AOS 효과도 모바일에서는 다르게 느껴질 수 있습니다. 모바일은 화면 높이가 짧고 스크롤 속도가 빠르며, 한 화면에 들어오는 콘텐츠 양도 PC와 다릅니다.
그래서 모바일에서는 애니메이션이 너무 늦게 나오거나, 이미 지나간 뒤 나타나거나, 스크롤할 때 답답하게 느껴질 수 있습니다.
이럴 때는 아래 옵션을 조정해볼 수 있습니다.
<script>
AOS.init({
offset: 80,
duration: 600,
once: true
});
</script>
offset은 애니메이션이 시작되는 위치와 관련 있고, duration은 애니메이션 속도와 관련 있습니다. once: true를 사용하면 요소가 한 번 나타난 뒤 반복해서 사라졌다 나타나는 느낌을 줄일 수 있습니다. 모바일에서는 효과를 많이 넣는 것보다 핵심 영역에만 가볍게 적용하는 편이 좋습니다.
디자인키트 템플릿 수정 시 체크할 부분
디자인키트의 HTML 템플릿이나 웹디자인 소스를 수정할 때 AOS 효과가 작동하지 않는다면, 먼저 기존 구조를 확인하는 것이 좋습니다.
템플릿에는 이미 공통 CSS, 슬라이더 스크립트, 반응형 코드, 섹션별 클래스가 함께 들어가 있을 수 있습니다. 이 상태에서 HTML 구조만 바꾸거나 파일 경로를 수정하면 AOS가 의도한 대로 동작하지 않을 수 있습니다.
수정 전후로 아래 항목을 확인하면 좋습니다.
- AOS 관련 CSS와 JS 파일이 그대로 연결되어 있는가?
- AOS.init() 코드가 삭제되거나 위치가 바뀌지 않았는가?
- data-aos 속성이 실제 화면에 보이는 요소에 들어가 있는가?
- 탭, 슬라이더, 숨김 콘텐츠 안에 들어간 요소는 아닌가?
- 부모 요소의 overflow:hidden 때문에 애니메이션이 잘리지 않는가?
- 모바일에서 애니메이션이 너무 과하게 느껴지지 않는가?
- 기존 GSAP, Swiper, Slick 같은 스크립트와 충돌하지 않는가?
AOS는 템플릿을 더 생동감 있게 보이게 만드는 데 도움이 되지만, 모든 요소에 넣는다고 좋은 것은 아닙니다. 화면 흐름상 강조가 필요한 영역에만 사용하는 것이 더 깔끔합니다.
AOS 오류 점검 순서
- aos.css가 연결되어 있는지 확인합니다.
- aos.js가 연결되어 있는지 확인합니다.
- 브라우저 Console에 오류가 있는지 확인합니다.
- AOS.init()이 실행되고 있는지 확인합니다.
- data-aos 속성이 올바른 요소에 있는지 확인합니다.
- 해당 요소가 숨김 영역 안에 있는지 확인합니다.
- 기존 CSS의 opacity, transform, overflow 충돌을 확인합니다.
- 모바일 옵션과 화면 높이를 확인합니다.
- 동적으로 나타나는 콘텐츠라면 AOS.refresh()가 필요한지 확인합니다.
이 순서대로 보면 처음부터 코드를 크게 바꾸지 않아도 됩니다. AOS 문제는 대부분 연결, 초기화, 속성 위치, CSS 충돌 중 하나에서 원인이 나오는 경우가 많습니다.
자주 묻는 질문
AOS는 효과보다 구조를 먼저 봐야 합니다
AOS 스크롤 애니메이션이 작동하지 않을 때는 코드를 무작정 다시 붙여넣기보다 구조를 먼저 확인해야 합니다. CSS와 JS 파일이 제대로 연결되어 있는지, AOS.init()이 실행되는지, data-aos 속성이 실제 화면 요소에 들어가 있는지 보는 것이 우선입니다.
그다음 숨김 영역, 슬라이더, 탭 메뉴, 기존 CSS 충돌, 모바일 화면을 순서대로 확인하면 원인을 더 빠르게 찾을 수 있습니다.
디자인키트의 HTML 템플릿이나 웹디자인 소스를 수정할 때도 AOS는 자주 만날 수 있는 스크롤 애니메이션 방식입니다. 템플릿에 들어간 효과를 그대로 사용하는 것보다, 어떤 섹션에 필요한지, 모바일에서도 자연스러운지, 기존 코드와 충돌하지 않는지 확인하면서 적용하는 것이 좋습니다. 결국 AOS의 핵심은 효과를 많이 넣는 것이 아니라, 사용자가 콘텐츠를 자연스럽게 따라오도록 화면 흐름을 정리하는 데 있습니다.
작성자: 디자인키트
발행일: 2026.09.02
최종 수정일: 2026.09.02


