This example uses the useMotionValue() and useTransform() hooks to transform the drag distance (x) to scale and rotate values.
Pretty simple. The box is made draggable (only horizontally), with drag constraints that let it bounce back. And its snap-to-constraints animation is tweaked a bit.
There’s an x Motion value passed to the box through style so that we’ll get its horizontal position, which we transform with useTransform() to scale and rotate values.
export function Example() {
const x = useMotionValue(0);
const scale = useTransform(x, [-150, 150], [1.5, 0.5]);
const rotate = useTransform(x, [-150, 150], [-90, 90]);
return (
<motion.div
style={{
width: 150,
height: 150,
borderRadius: 30,
backgroundColor: "#fff",
x,
scale,
rotate,
}}
drag="x"
dragConstraints={{ left: 0, right: 0 }}
dragTransition={{ bounceStiffness: 600, bounceDamping: 20 }}
/>
);
}