Animated CSS cursors

Animated GIF cursors are technically supported but inconsistent across browsers; SVG with SMIL or .ani files via cursor: url work better in some engines.

Syntax

cursor: url('spinner.gif') 16 16, wait;

When to use

Use only for explicit busy/wait states. Avoid animation on idle cursors — it makes the page feel restless.

Keyword reference

The CSS property is cursor. The value form covered on this page is cursor: url('animated.gif'). The full grammar accepts a comma-separated list of url() sources followed by a single required keyword fallback. Browsers walk the list left-to-right, use the first source they can render, and fall back to the keyword if all url() sources fail.

Browser support notes

  • Chrome / Edge (Chromium): accepts cursor images up to 128×128. Falls back gracefully on broken URLs.
  • Firefox: caps cursor images at 32×32 unless DPI scaling is in play. Always ship a 32×32 variant for Firefox compatibility.
  • Safari: historically picky about URL-only fallback chains; always include a CSS keyword fallback at the end.
  • Mobile Safari / Chrome on Android: no cursor at all. Wrap custom cursor rules in @media (pointer: fine) to avoid wasted bytes.

Related cursor properties

From keyword to a real cursor pack

If you have decided which CSS cursor value you want and now need a cursor pack to ship behind it, browse the collections page or pick a free CC0 set from the community assets page. The website-cursor tutorial walks through the full deploy.