Scroll 3D Object
A CSS 3D cube (transform-style: preserve-3d, six .face divs) rotates 360° as the page scrolls. A GSAP timeline with scrollTrigger: { pin: true, scrub: 1, end: '+=3000' } drives rotateY: 360. A secondary rotateX tween adds a lean-back-and-return arc for visual interest.
CSS 3D 큐브(transform-style: preserve-3d, 6개의 .face div)가 페이지 스크롤에 따라 360° 회전합니다. scrollTrigger: { pin: true, scrub: 1, end: '+=3000' }가 적용된 GSAP 타임라인이 rotateY: 360을 구동합니다. 보조 rotateX 트윈이 시각적 흥미를 위한 기울기-복귀 호를 추가합니다.
Source Code script.js
gsap.registerPlugin(ScrollTrigger);
const FACES = [
{ name: 'front', min: 0, max: 45 },
{ name: 'right', min: 45, max: 135 },
{ name: 'back', min: 135, max: 225 },
{ name: 'left', min: 225, max: 315 },
{ name: 'front', min: 315, max: 360 },
];
const label = document.querySelector('.face-label');
function getFaceName(deg) {
const d = ((deg % 360) + 360) % 360;
for (const f of FACES) {
if (d >= f.min && d < f.max) return f.name;
}
return 'front';
}
const tl = gsap.timeline({
scrollTrigger: {
trigger: '.stage',
start: 'top top',
end: '+=3000',
pin: true,
scrub: 1,
invalidateOnRefresh: true,
onUpdate(self) {
const deg = self.progress * 360;
label.textContent = getFaceName(deg);
},
},
});
tl.to('.cube', { rotateY: 360, ease: 'none' }, 0)
.to('.cube', { rotateX: -15, ease: 'none' }, 0)
.to('.cube', { rotateX: 0, ease: 'none' }, 0.5);