Skip to main content
Emailens
CSS Properties

animation

CSS property · 6 supported, 1 partial, 14 unsupported across 21 clients

As of Sep 2, 2026, animation fails or degrades in 15 of 21 email clients, treat it as progressive enhancement, never structure.

  • 2/7 webmail, 2/6 desktop, 2/8 mobile clients support animation fully.
  • Unsupported in Gmail, Gmail Android, Gmail iOS, Outlook 365 and 10 more.
  • Partial in Superhuman, behavior differs from browsers, test before relying on it.
  • Outlook Classic (Word engine, supported to at least 2029) does not fully support animation, and its replacement changes little here; see the deprecation diff.
  • Documented before/after fixes on this page cover 21 clients, including Gmail and Gmail Android.
  • Across all clients, only 6 of 298 tracked HTML/CSS features render identically everywhere.

Source: caniemail.com (MIT), via the Emailens engine. Last tested upstream Apr 7, 2026, synced by Emailens Sep 2, 2026.

Client Support

ClientCategoryEngineSupport
GmailwebmailGmail WebUnsupported
Gmail AndroidmobileGmail MobileUnsupported
Gmail iOSmobileGmail MobileUnsupported
Outlook 365webmailOutlook WebUnsupported
Outlook (New)desktopOutlook WebUnsupported
Outlook ClassicdesktopMicrosoft WordUnsupported
Outlook iOSmobileOutlook MobileUnsupported
Outlook AndroidmobileOutlook MobileUnsupported
Outlook for MacdesktopWebKitSupported
Apple MaildesktopWebKitSupported
Apple Mail iOSmobileWebKitSupported
Yahoo MailwebmailYahooUnsupported
Yahoo Mail AndroidmobileYahooUnsupported
Yahoo Mail iOSmobileYahooUnsupported
Samsung MailmobileSamsungSupported
ThunderbirddesktopGeckoUnsupported
HEY MailwebmailWebKitSupported
Proton MailwebmailProtonUnsupported
AOL MailwebmailAOLUnsupported
FastmailwebmailFastmailSupported
SuperhumandesktopBlinkPartial

Client-by-client behaviour for animation

Fully supports animation (6): Outlook for Mac, Apple Mail, Apple Mail iOS, Samsung Mail, HEY Mail, Fastmail.

Partial support (1): Superhuman. Expect rendering quirks unique to each engine. Partial support typically means a subset of values, an ignored shorthand, or sanitizer-specific rewrites.

No support (14): Gmail, Gmail Android, Gmail iOS, Outlook 365, Outlook (New), Outlook Classic, Outlook iOS, Outlook Android, Yahoo Mail, Yahoo Mail Android, Yahoo Mail iOS, Thunderbird, Proton Mail, AOL Mail. Plan fallbacks for these clients before relying on animation in production sends.

Fixes & Workarounds

Gmail

Unsupported

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

Gmail Android

Unsupported

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

Gmail iOS

Unsupported

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

Outlook 365

Unsupported

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

Outlook (New)

Unsupported

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

Outlook Classic

Unsupported

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

Outlook iOS

Unsupported

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

Outlook Android

Unsupported

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

Yahoo Mail

Unsupported

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

Yahoo Mail Android

Unsupported

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

Yahoo Mail iOS

Unsupported

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

Thunderbird

Unsupported

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

Proton Mail

Unsupported

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

AOL Mail

Unsupported

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

Superhuman

Partial

CSS animations are not supported. Use animated GIFs instead.

Before (Broken)

before.html
5 lines
<style>
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
  .badge { animation: pulse 2s infinite; }
</style>
<span class="badge">New!</span>

After (Fixed)

fixed.html
4 lines
<!-- Use an animated GIF for the effect -->
<img src="https://example.com/badge-animated.gif"
  width="60" height="24" alt="New!"
  style="display: inline-block; border: 0;" />

Replace CSS animation with an animated GIF

Production guidance for animation

animation is a CSS property. Across the email client matrix, 6 of 21 tracked clients support it fully, 1 only partially, and 14 not at all. The clients most likely to require a workaround for this feature are Gmail, Gmail Android, Gmail iOS. Each of them needs a tailored fallback. See the per-client examples above for the specific code fix Emailens recommends.

When in doubt, ship a baseline that renders without animation and treat it as progressive enhancement on clients where support is verified. Emailens automatically detects cross-client divergence on this feature when you preview an email, so you can see exactly which template paths break before a campaign goes out.

Related Features

Check your own HTML for animation

Paste your own, or run the sample below. Analyzed in this page, with no signup and nothing stored.

Zero-Friction Engine Preview

Test your animation layout across 21 email clients

Preview rendering, catch CSS issues, and see how animation displays across Outlook, Gmail, and Apple Mail. Free, no account needed.

Instant live preview · No signup required · 21 email engines

Last tested upstream: · Last synced by Emailens:

caniemail.com (MIT) records Apr 7, 2026 as the last time animation was tested in a real client, less than a year before this sync. Syncing copies that result forward, it does not re-test it. Carried in @emailens/engine data v0.12.2.