gsap
gsap - codepen
CODEPEN - 1부
CODEPEN - 2부
CODEPEN - 3부
선생님 영상
설명
scrollY값을 감지해서 특정 구간에 진입했을 때, 내부 요소를 가로 슬라이딩(translateX) 시키는 효과.
주로 가로 콘텐츠 영역이나 갤러리, 타임라인 등을 연출할 때 사용됨.
단계별 요약
| 단계 | 핵심 기능 |
|---|---|
| 1부 | 스크롤 위치에 따라 console로 감지해보기 |
| 2부 | 특정 영역 진입 시 translateX로 횡 이동 적용 |
| 3부 | fixed로 고정 + 내부 요소만 가로 이동시키기 |
1. scrollY 감지
js
window.addEventListener("scroll", () => { console.log(window.scrollY); // 스크롤 위치 로그 확인 });
2. 특정 구간 진입 확인
js
const section = document.querySelector(".scroll-section");
const sectionTop = section.offsetTop; const sectionHeight = section.offsetHeight;
if (scrollY >= sectionTop && scrollY <= sectionTop + sectionHeight) {
// 내부 요소 translateX
}
3. 내부 요소 가로 이동
js
innerBox.style.transform =translateX(-${scrollY - sectionTop}px);
// 스크롤 양만큼 왼쪽으로 이동
4. 고정 레이아웃 처리
css
.scroll-section { position: relative; height: 300vh; /* 긴 스크롤 영역 확보 */ }
.sticky-box { position: sticky; top: 0; height: 100vh; overflow: hidden; }
핵심 정리표
| 요소 | 설명 |
|---|---|
scrollY | 스크롤 위치 추적 |
offsetTop | 해당 섹션의 Y위치 |
translateX | 요소를 가로로 이동시킴 |
position: sticky | 특정 위치에서 고정된 상태 유지 |
height: 300vh | 충분한 스크롤 높이 확보 |
한줄 요약
스크롤 위치를 감지해 특정 섹션 안에서만 내부 요소가 가로로 움직이게 만드는 패럴랙스 효과 구현!
설명
JS 없이도 CSS만으로 페이지 단위로 스크롤되는 구조를 구현할 수 있음.
scroll-snap-type,scroll-snap-align속성과 함께overflow: scroll을 활용해, 마치fullPage.js처럼 동작함.
핵심 구현 요약
| 요소 | 역할 |
|---|---|
.pages | 전체 페이지를 감싸는 스크롤 영역 (세로 스크롤 설정) |
.page | 각각의 페이지 (높이 100vh) |
scroll-snap-type | 부모 요소에 적용, 스크롤 위치를 스냅시킴 |
scroll-snap-align | 자식 요소의 스냅 기준 설정 |
scroll-behavior: smooth | 부드러운 스크롤 효과 |
주요 코드
html
<div class="pages">
<section class="page">1</section>
<section class="page">2</section>
<section class="page">3</section>
</div>
css
html, body { height: 100%; margin: 0; scroll-behavior: smooth; }
.pages { height: 100%; overflow-y: scroll; scroll-snap-type: y mandatory; /* y축 기준, 반드시 스냅됨 */ }
.page { height: 100vh; scroll-snap-align: start; display: flex; align-items: center; justify-content: center; font-size: 5rem; background-color: #f3f3f3; border-bottom: 1px solid #ccc; }
핵심 정리표
| 속성 | 설명 |
|---|---|
scroll-snap-type: y mandatory | y축 기준으로 스냅, 꼭 스냅해야 함 |
scroll-snap-align: start | 요소의 시작 지점을 기준으로 맞춤 |
overflow-y: scroll | 스크롤 가능하게 설정 |
scroll-behavior: smooth | 부드러운 스크롤 효과 |
height: 100vh | 1화면당 한 섹션 표시 |
한줄 요약
JS 없이도scroll-snap-type과scroll-behavior를 조합하면 풀페이지 스크롤 UI를 CSS만으로 구현할 수 있음!
설명
각 글자를<span>으로 감싸고, 각자 다른animation-delay를 주면
한 글자씩 등장하면서 회전하는 텍스트 애니메이션을 구현할 수 있음.
핵심 구현 요약
| 요소 | 설명 |
|---|---|
.text-wrap span | 각각의 글자(span) 요소 |
@keyframes | 회전하면서 투명도 조절 |
animation-delay | 순서대로 등장하도록 시간차 부여 |
opacity, transform | 투명도와 회전효과 적용 |
주요 코드
html
<div class="text-wrap">
<span>S</span>
<span>T</span>
<span>U</span>
<span>D</span>
<span>Y</span>
</div>
css
.text-wrap { display: flex; font-size: 5rem; font-weight: bold; justify-content: center; margin-top: 200px; }
.text-wrap span { display: inline-block; opacity: 0; transform: rotateY(90deg); animation: rotateFadeIn 0.6s forwards; }
.text-wrap span:nth-child(1) { animation-delay: 0.1s; }
.text-wrap span:nth-child(2) { animation-delay: 0.3s; }
.text-wrap span:nth-child(3) { animation-delay: 0.5s; }
.text-wrap span:nth-child(4) { animation-delay: 0.7s; }
.text-wrap span:nth-child(5) { animation-delay: 0.9s; }
@keyframes rotateFadeIn { 100% { opacity: 1; transform: rotateY(0deg); } }
핵심 정리표
| 속성/기법 | 설명 |
|---|---|
@keyframes rotateFadeIn | 회전하면서 투명도 나타남 |
animation-delay | 각 글자에 시간차 부여 |
transform: rotateY() | Y축 기준 회전 |
opacity: 0 → 1 | 점점 나타나도록 설정 |
forwards | 애니메이션이 끝난 후 상태 유지 |
팁
JS 없이도 순서 애니메이션은nth-child와animation-delay만으로 가능
transform속성과 조합하면 훨씬 풍부한 시각 효과 가능
한줄 요약
텍스트를<span>으로 쪼개고animation-delay로 시간차를 두면, 글자가 하나씩 회전하면서 자연스럽게 등장하는 효과를 만들 수 있음!
tailwindcss
swiper - scrollbar
codesandbox - scrollbar
CODEPEN
선생님 영상
주요 목표
- 슬라이드를
Swiper.js로 구성- 반응형 설정 (breakpoints) 활용
- 좌우 버튼 및 페이지네이션 추가
핵심 코드 구성
html
<div class="swiper">
<div class="swiper-wrapper">
<div class="swiper-slide">슬라이드1</div>
<div class="swiper-slide">슬라이드2</div>
<div class="swiper-slide">슬라이드3</div>
<div class="swiper-slide">슬라이드4</div>
<div class="swiper-slide">슬라이드5</div>
</div>
<!-- 페이지네이션 & 버튼 -->
<div class="swiper-pagination"></div>
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
</div>
css
.swiper { width: 100%; padding: 40px 0; }
.swiper-slide { background: #eee; text-align: center; font-size: 24px; height: 200px; line-height: 200px; }
js
new Swiper(".swiper", { loop: true,
spaceBetween: 20,
slidesPerView: 1,
pagination: { el: ".swiper-pagination", clickable: true },
navigation: { nextEl: ".swiper-button-next", prevEl: ".swiper-button-prev" },
breakpoints: { 768: { slidesPerView: 2 }, 1024: { slidesPerView: 3 } } });
핵심 옵션 설명
| 옵션 | 설명 |
|---|---|
loop: true | 무한 루프 슬라이드 |
spaceBetween | 슬라이드 간 간격 (px) |
slidesPerView | 한 번에 보여줄 슬라이드 수 |
pagination | 페이지네이션 요소 활성화 |
navigation | 이전/다음 버튼 설정 |
breakpoints | 반응형으로 슬라이드 수 조절 |
핵심 정리표
| 기능 | 사용 속성/메서드 |
|---|---|
| 기본 슬라이드 | .swiper, .swiper-slide |
| 페이지네이션 | .swiper-pagination, clickable: true |
| 좌우 버튼 | .swiper-button-next, .swiper-button-prev |
| 반응형 뷰 설정 | breakpoints 객체 내 slidesPerView 설정 |
한 줄 요약
Swiper.js로 간편하게 반응형 슬라이드를 만들고,breakpoints로 화면 크기에 따라 슬라이드 수를 유동적으로 조절할 수 있음.
스와이퍼 - 스크롤바
CODEPEN - 1부
CODEPEN - 2부
CODEPEN - another
선생님 영상
목표
- 슬라이드 내부가 아닌 외부 텍스트 영역에 현재 슬라이드 정보 표시
- 슬라이드 이동 시마다 자동 업데이트
핵심 코드 구성
html
<div class="swiper">
<div class="swiper-wrapper">
<div class="swiper-slide" data-title="슬라이드 1번 내용">Slide 1</div>
<div class="swiper-slide" data-title="슬라이드 2번 내용">Slide 2</div>
<div class="swiper-slide" data-title="슬라이드 3번 내용">Slide 3</div>
</div>
</div>
<!-- 별도 출력 공간 -->
<div class="slide-info">
현재 슬라이드 내용:<span class="slide-title">슬라이드 1번 내용</span>
</div>
js
const swiper = new Swiper(".swiper", { loop: true, on: { slideChange: function () { const activeSlide = this.slides[this.activeIndex]; const title = activeSlide.dataset.title; document.querySelector(".slide-title").textContent = title; } } });
설명
| 요소/기능 | 설명 |
|---|---|
data-title 속성 | 슬라이드마다 고유한 텍스트를 미리 부여 |
.slide-title | 외부 텍스트 표시용 영역 |
swiper.on.slideChange | 슬라이드가 변경될 때마다 실행되는 Swiper 이벤트 |
this.activeIndex | 현재 활성화된 슬라이드의 인덱스 번호 |
this.slides[...] | 전체 슬라이드 배열 중 하나에 접근 |
핵심 정리표
| 목적 | 방법 |
|---|---|
| 현재 슬라이드 정보 가져오기 | this.slides[this.activeIndex] |
| 슬라이드별 텍스트 지정 방법 | data-title 사용자 정의 속성 활용 |
| 외부 텍스트 업데이트 | document.querySelector().textContent |
| 슬라이드 변경 감지 이벤트 | on.slideChange 사용 |
한줄 요약
Swiper의 slideChange 이벤트를 활용하여, 슬라이드가 바뀔 때마다 외부 영역에 관련 정보를 동적으로 표시할 수 있음.
tailwindcss
MDN - 삼항연산자
CODEPEN - 1부
CODEPEN - 2부CODEPEN - 3부
목표
.counter클래스가 달린 요소들에 대해data-target값까지 숫자를 점점 증가시킴
핵심 코드 요약
js
$('.counter').each(function () { const $el = $(this); const target = +$el.data('target'); let count = 0;
const interval = setInterval(() => { count += Math.ceil(target / 100); if (count >= target) { count = target; clearInterval(interval); } $el.text(count); }, 20); });
목표
#section-counter영역에 도달하면 카운트 시작- 한 번만 실행되도록
isPlay플래그 사용
핵심 JS 변경
let isPlay = false;
$(window).scroll(function () { const sectionTop = $('#section-counter').offset().top; const scrollBottom = $(window).scrollTop() + $(window).height();
if (scrollBottom > sectionTop && !isPlay) { isPlay = true;
$('.counter').each(function () { const $el = $(this); const target = +$el.data('target'); let count = 0;
const interval = setInterval(() => { count += Math.ceil(target / 100);
if (count >= target) { count = target; clearInterval(interval); } $el.text(count); }, 20); }); } });
목표
- 숫자에 천 단위 콤마(,) 삽입
- 가독성 향상
핵심 코드 추가
js
function formatNumber(num) { return num.toLocaleString(); // ex) 1,000 }
js
$el.text(formatNumber(count));
전체 핵심 정리
| 단계 | 주요 기능 |
|---|---|
| 1부 | .each()로 다중 숫자 카운터 구현 |
| 2부 | 특정 영역에 도달했을 때만 카운트 실행 (scroll 이벤트 활용) |
| 3부 | 숫자에 천 단위 콤마 표시 (가독성 향상) |
한줄 요약
.each()반복 →scroll진입 → 숫자 증가 + 포맷팅까지
시각적으로 세련된 숫자 카운트 애니메이션 구현이 가능