useTransform 하나만 쓰는 방법const { scrollY } = useViewportScroll();
const bg = useTransform(
scrollY,
[0, 80],
["rgba(0,0,0,0)", "rgba(0,0,0,1)"]
);
<Nav style={{ backgroundColor: bg }} />
requestAnimationFrame으로 처리하므로 부드럽고 가벼움useState·useEffect 없이 단순하게 선언적 연결만으로 동작useAnimation + onChange + variants 방법const navControls = useAnimation();
useEffect(() => {
const unsub = scrollY.onChange(y => {
if (y > 80) navControls.start("scrolled");
else navControls.start("top");
});
return () => unsub();
}, [scrollY, navControls]);
<Nav
variants={{
top: { backgroundColor: "rgba(0,0,0,0)" },
scrolled: { backgroundColor: "rgba(0,0,0,1)" },
}}
initial="top"
animate={navControls}
/>
variants에 정의된 이름만 바꿔 주면 언제든 “토글” 가능padding·boxShadow·height 등도 한 번에 묶어서 전환transition 세부 조작(지연·반복·이징)이나, controls.start() 직후 다른 애니메이션을 바로 이어 붙일 수 있음useEffect로 구독을 걸고, variants·useAnimation까지 선언해야 함useTransformuseAnimation + variants두 방법을 목적에 맞게 골라 쓰시면 됩니다. 단순 변화엔 useTransform이 훨씬 가볍고 빠르니, 특별히 복잡한 애니메이션 로직이 필요하지 않다면 후자를 추천합니다.