sine
sine is the gentlest of GSAP's standard easing families, built on a segment of a sine wave so its acceleration and deceleration are only slightly stronger than linear. It ships as `sine.in`, `sine.out`, and `sine.inOut`, and it's the ease you reach for when motion should feel eased but not obviously eased.
Updated July 1, 2026
How sine works
sine maps animation progress onto a piece of a sine wave. sine.out uses the first quarter of the curve (sin(t * PI/2)), which rises quickly at the start and flattens toward the end, so it decelerates. sine.in is the mirror (1 - cos(t * PI/2)), starting slow and speeding up. sine.inOut uses a half wave (-(cos(PI * t) - 1) / 2), easing symmetrically at both ends.
What sets sine apart from the rest of the standard set is how little it bends. Of the built-in curves, sine deviates the least from a straight line, so sine.out covers about 30% of the distance in the first 30% of the time where expo.out would already be past 80%. That mildness is the whole point: the motion reads as smoothed, not as launched and settled.
sine is part of GSAP's core, so there's no plugin to register. You pass it as a string like any other ease.
Use it for
Most web motion is quiet: 91.7% of mobile pages ship a CSS transition and only 18.4% load a JavaScript animation library (HTTP Archive Web Almanac, 2024). sine is the GSAP ease that matches that restraint, so it fits the moments where you want smoothing without a visible curve.
- Looping ambient motion (a floating badge, a breathing glow, a subtle bob) with
repeat: -1andyoyo: true - Oscillating effects where each cycle needs to turn around softly instead of snapping at the extremes
- Long, slow moves where a stronger ease would leave a dead tail of imperceptible movement
- Continuous wave or shimmer patterns across a stagger, so neighbouring elements blend rather than pop
Use something else when
- You want a snappy, responsive UI landing, use
expo.outorpower4.out, sine is too soft to read as intentional on a short reveal - The move needs a clear sense of arrival with weight, use
back.out(1.7)so it overshoots and settles - You need a truly constant speed (a marquee, a spinner, a scrub), use
none, sine still slows at the ends - The animation is under about 0.3s, the difference between sine and linear is invisible at that length, so pick the ease that matches the longer siblings in the same component
Used in these Annnimate components
- The Text Shimmer Wave uses
sine.inOuton the per-characterrotateY, so each letter tilts out and back through the smooth turn of the curve and the wave reads as continuous rather than a row of discrete flips - The Marquee deliberately does NOT use sine, its loop runs on
ease: "none"because a ticker needs constant speed, sine is the ease you would swap in the moment you want that track to slow-in and slow-out instead
Pairing tip
yoyo: true with an infinite repeat. Because both ends of sine.inOut decelerate, the turnaround at the top and bottom of a yoyo cycle has no visible seam, which is why it's the default choice for idle, breathing motion.See it running in production
Common questions
- What's the difference between sine.in, sine.out, and sine.inOut?
sine.instarts slow and speeds up (use it for exits that accelerate away).sine.outstarts at speed and slows to a soft stop (use it for entrances that arrive gently).sine.inOuteases at both ends and is the one you want for looping or oscillating motion, since each turnaround is smooth. If you only remember one, remember sine.inOut.- When should I use sine instead of power1?
- They're close, both are mild curves, but sine is even gentler than power1 and its inOut turnaround is perfectly symmetric, which makes it the better pick for yoyo loops and continuous waves. For a one-shot UI transition where you want a touch more snap, power1.out (or stronger) reads better. sine shines on the slow, ambient stuff.
- Is sine good for a floating or breathing animation?
- Yes, it's the standard choice. Combine
ease: "sine.inOut"withrepeat: -1andyoyo: true. Because sine.inOut slows into both ends of the tween, the element pauses imperceptibly at the top and bottom of each cycle, so the loop never looks like it's snapping direction. That's exactly the feel you want for an idle bob or a pulsing glow. - Does sine need a plugin or registration?
- No. sine is part of GSAP core along with power1 through power4, expo, circ, back, elastic, and bounce. Just pass
ease: "sine.inOut", there's nothing to import or register. Only CustomEase and a few specialty eases live in separate plugins, and those have been free since GSAP 3.13. - sine vs none (linear), when does the difference actually show?
- On very short tweens (under ~0.3s) the two look identical, so don't agonize over it there. The gap becomes visible on longer moves: linear feels mechanical and robotic because it starts and stops dead, while sine softens the two ends just enough to read as natural without looking heavily eased. Use none only when you genuinely need constant velocity, like a marquee or a spinner.
