Skip to content
ColorArchive
Issue 071
2027-05-20

Color in motion: designing animated color transitions and when timing matters

Animating color is not simply moving from one hex value to another. The path a color takes between two states — through which intermediate values, at what speed — determines whether the transition reads as intentional or accidental. Most UI color animations use linear interpolation in RGB, which produces desaturated midpoints and timing that feels unnatural to the human visual system. Designing motion-aware color requires understanding how color spaces affect interpolation and how animation timing curves change perceived color speed.

Highlights
RGB linear interpolation produces the gray problem: transitioning from red to blue through RGB always passes through a desaturated, grayish midpoint. This is because the mathematical midpoint of two high-saturation RGB values often sits near the gray axis of the color space. The solution is to interpolate in HSL or LCH instead. HSL interpolation keeps saturation constant and transitions through the hue arc between the two colors, which reads as vivid and intentional. LCH interpolation maintains perceptual lightness uniformly, which produces transitions that feel photorealistic rather than digital.
The speed of a color transition changes its perceived meaning. Instant color changes (0–50ms) register as state confirmation — a button press, a toggle activation. Fast transitions (100–200ms) read as responsive feedback. Medium transitions (250–400ms) read as scene changes and mode shifts. Slow transitions (500ms+) read as atmospheric or ambient. Applying a 400ms ease to a button press hover state is a mismatch: the timing contradicts the interaction type. Match transition duration to semantic meaning, not to aesthetic preference.
Hue rotation in CSS (filter: hue-rotate()) is useful for theming experiments but produces perceptually uneven results because equal hue rotation does not produce equal visual change across the color wheel. Blue hues shift appearance faster than red or green hues with the same rotation angle. For precise animated color systems, use custom properties (CSS variables) updated via JavaScript and interpolate in HSL or LCH rather than relying on filter effects.

Practical rules for UI color animation

Color transitions in UI contexts should follow three rules. (1) Animate state, not decoration: only animate color when it carries semantic meaning — active, disabled, error, success. Animating colors for visual interest without semantic purpose increases cognitive load. (2) Keep durations under 300ms for interactive elements: longer transitions feel broken on slow hardware and frustrate users who have already committed to an interaction. (3) Test in reduced-motion mode: operating systems provide reduced-motion preferences that browsers expose via the prefers-reduced-motion media query. All non-essential color animations should be disabled or minimized under this setting.

Dark mode and animated color systems

Dark mode transitions present a specific challenge: switching between light and dark mode involves simultaneous changes to background, surface, text, and border colors. If each color transitions independently at slightly different speeds, the result is a jarring intermediate state where contrast relationships are temporarily broken. The correct approach is to transition all semantic color tokens simultaneously using a single CSS transition applied at the root level: :root { transition: color 200ms, background-color 200ms; }. This ensures all color values change in synchrony and the intermediate state is a uniformly shifting palette rather than a patchwork of independently timed elements.

Newer issue
Tints, shades, and tones: how to build a complete color scale for any brand color
2027-05-13
Older issue
Color consistency across devices: why the same hex looks different everywhere
2027-05-27