Skip to content

Dark Mode Email Design

When a recipient reads your email in dark mode, mail clients silently invert your colors — sometimes correctly, sometimes destructively. White logos disappear; black logos become white-on-light-grey; carefully-chosen brand colors get auto-shifted. This guide walks the 4 patterns that survive dark mode (color-scheme meta, prefers-color-scheme media query, transparent PNGs with dark-friendly fills, branded dark fallback) plus the testing protocol.

What this is for

When a recipient reads your email in dark mode (their OS or their mail client set to dark theme), mail clients silently invert your colors — sometimes correctly, sometimes destructively:

  • White logos disappear on dark backgrounds
  • Black text in colored cards becomes white-on-similar-color = unreadable
  • Brand colors get auto-shifted by Gmail Android's "color extraction" algorithm
  • Transparent-background PNGs show black halos against light fill

This guide walks the 4 patterns that survive dark mode + the per-client behavior + the testing protocol.

Per-client dark mode behavior (2026)

Client Dark mode behavior
Apple Mail (iOS, macOS) Respects color-scheme meta; doesn't aggressively re-color; honors @media (prefers-color-scheme: dark). Best behavior.
Gmail (iOS app) Respects color-scheme; doesn't aggressively re-color. Good behavior.
Gmail (Android app) AGGRESSIVE color inversion — re-colors backgrounds; doesn't respect color-scheme consistently. Worst behavior.
Gmail (web) Doesn't aggressively re-color; honors light/dark via the user's Gmail theme setting.
Outlook (Windows desktop) Partial dark mode; behavior varies by version. Some Microsoft Word renderer quirks.
Outlook.com (web) Honors prefers-color-scheme reasonably.
Yahoo Mail Aggressive — similar to Gmail Android.
Newer apps (Hey, Spark, Newton) Mostly Apple-Mail-like behavior.

The takeaway: design for Apple Mail's behavior; test against Gmail Android.

The 4 patterns that work

Pattern 1 — Declare your color-scheme support

Add to the email's <head>:

<meta name="color-scheme" content="light dark">
<meta name="supported-color-schemes" content="light dark">

This tells the client: "I have explicit dark-mode styles — don't auto-invert." Most modern clients respect it; Gmail Android often ignores it (but no harm).

Pattern 2 — prefers-color-scheme media query

In your <style> block (which most clients honor for @media even if they strip individual style rules):

<style>
  @media (prefers-color-scheme: dark) {
    .dark-bg { background-color: #1a1a1a !important; }
    .dark-text { color: #f4f4f4 !important; }
    .dark-border { border-color: #444 !important; }

    /* Swap logo */
    .logo-light { display: none !important; }
    .logo-dark { display: inline-block !important; }
  }
</style>

Apply via class names on your HTML elements:

<td class="dark-bg" style="background-color: #ffffff;">
  <h1 class="dark-text" style="color: #333333;">Hi {FIRST_NAME}</h1>
  ...
</td>

!important is essential — without it, the inline style="..." wins over the @media rule.

Pattern 3 — Dual-logo swap

Ship both a light-mode and a dark-mode logo. Show one or the other based on the active mode:

<!-- Light-mode logo: visible by default; hidden in dark mode -->
<img src="https://your-cdn.com/logo-light.png"
     alt="Acme Logo"
     width="180" height="40"
     class="logo-light"
     style="display: inline-block;" />

<!-- Dark-mode logo: hidden by default; visible in dark mode -->
<img src="https://your-cdn.com/logo-dark.png"
     alt="Acme Logo"
     width="180" height="40"
     class="logo-dark"
     style="display: none;" />

Combined with the @media (prefers-color-scheme: dark) in Pattern 2:

@media (prefers-color-scheme: dark) {
  .logo-light { display: none !important; }
  .logo-dark { display: inline-block !important; }
}

In clients that respect the media query: only one logo renders. In clients that ignore it: both render (uncommon, looks slightly awkward but not broken).

Pattern 4 — Avoid pure-white logos with transparency

Why: a white-fill PNG with transparent background renders fine on white. On dark mode, it becomes "white shape on dark background" — readable. But if the client auto-inverts (Gmail Android), the white fill becomes black-on-dark = invisible.

Three safer alternatives:

  1. Dual-logo swap (Pattern 3) — explicit + reliable
  2. Solid-color background behind the logo — wrap the IMG in a <td bgcolor="#ffffff"> so the logo always sits on white regardless of email mode
  3. Two-tone logo design — a logo that reads correctly on either light OR dark background (most modern brand logos meet this bar)

For body imagery (product shots, illustrations), prefer photos / colorful illustrations over single-color silhouettes — they look fine in either mode.

Worked example — dark-mode-compatible template fragment

<head>
  <meta name="color-scheme" content="light dark">
  <meta name="supported-color-schemes" content="light dark">
  <style>
    @media (prefers-color-scheme: dark) {
      .card-bg     { background-color: #1f2937 !important; }
      .card-text   { color: #f3f4f6 !important; }
      .card-muted  { color: #9ca3af !important; }
      .card-border { border-color: #374151 !important; }

      .logo-light  { display: none !important; }
      .logo-dark   { display: inline-block !important; }

      .cta-bg      { background-color: #3b82f6 !important; }
    }
  </style>
</head>
<body style="background-color: #f4f4f4; margin: 0;">
  <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0">
    <tr>
      <td align="center" class="card-bg" style="background-color: #f4f4f4; padding: 20px;">
        <table role="presentation" width="600" cellpadding="0" cellspacing="0" border="0" class="card-bg" style="background-color: #ffffff;">
          <tr>
            <td style="padding: 40px;">
              <!-- Logo (light + dark variants) -->
              <img class="logo-light" src="https://cdn.example.com/logo-light.png" width="180" height="40" alt="Acme" style="display: inline-block;">
              <img class="logo-dark" src="https://cdn.example.com/logo-dark.png" width="180" height="40" alt="Acme" style="display: none;">

              <h1 class="card-text" style="color: #111827; font-family: Arial, sans-serif;">
                Hi {FIRST_NAME}
              </h1>
              <p class="card-text" style="color: #374151; font-family: Arial, sans-serif; line-height: 1.5;">
                Body content here.
              </p>
              <p class="card-muted" style="color: #6b7280; font-size: 14px;">
                Smaller secondary text.
              </p>
            </td>
          </tr>
        </table>
      </td>
    </tr>
  </table>
</body>

Testing protocol

  1. Send a test to yourself in each of: Gmail (Android app), Gmail (iOS app), Apple Mail (iOS), Apple Mail (macOS), Outlook (Windows), Outlook (web). Set each client to dark mode before sending. Compare rendering.
  2. Use Litmus or Email on Acid — both have dark-mode preview rendering across clients
  3. Re-test after every template change — small CSS adjustments can break dark-mode behavior in non-obvious ways

The combination of "Gmail Android (dark mode)" + "Apple Mail (light mode)" is the 90% test — if both look right, you're probably fine elsewhere.

Common failures

What you see Likely cause Fix
Logo disappears in dark mode White-fill logo on now-dark background Switch to dual-logo swap (Pattern 3) or solid-color background wrapper
Background card stays light, text becomes hard to read prefers-color-scheme styles not applied Add !important on every dark-mode rule
Gmail Android colors look weird (different from desktop) Gmail Android's auto-inversion algorithm Try declaring color-scheme: light dark — sometimes Gmail Android backs off; otherwise accept the variance
Two logos both visible Client ignored @media query Acceptable degradation in dark mode-unsupporting clients; doesn't break readability
Outlook desktop ignores dark-mode CSS entirely Outlook desktop has weak prefers-color-scheme support Design "good enough in light mode + acceptable in dark mode" — don't try to force a specific Outlook dark experience
Tested in Apple Mail looks great; user reports terrible dark in Gmail Android Forgot Gmail Android's color inversion Test in Gmail Android explicitly during design phase, not after launch

FAQ

Should I just send everything as plain text and skip dark-mode design? Plain-text emails inherit the system theme automatically and never break. For transactional + newsletter emails, plain text can be the right answer. For marketing campaigns with rich content + CTAs, dark-mode-friendly HTML is worth the investment.

Do I need dark mode if my audience is mostly desktop Outlook users? Less urgent. Outlook desktop's dark mode support is partial; many users disable it. Audit your open data (most email platforms can break out "open in dark mode") to prioritize.

What about hi-contrast / forced-colors mode? Even further niche. forced-colors: active media query lets you target Windows High Contrast mode. Not worth the effort for most senders.

Does dark mode affect deliverability? No — receivers don't penalize dark-mode-friendly emails. The rendering happens client-side.

Can AcelleMail's drag-and-drop editor generate dark-mode-friendly HTML? Partially in recent versions. For full control, edit the HTML directly after building the structure.

Related articles

7 comments

4 comments

  1. Aisha
    Any thoughts on AMP for Email? We tried it last year and gave up — Gmail-only and the maintenance overhead wasnt worth the engagement bump.
    1. Admin
      Same read. Three variants to QA for one slice of Gmail isn't worth it. No AMP in the builder and no plans to add it. Use a CTA to a page you control.
  2. David
    Test in dark mode on actual devices, not just simulators. Outlook for Android specifically inverts colors in ways the desktop preview never shows.
    1. Admin
      Outlook for Android is the worst offender here because it does a full color inversion rather than the partial one Gmail applies, so anything you fixed by nudging a hex value slightly off pure white or pure black will pass in preview and still flip on the device. Simulators render the message body, they don't run the client's inversion pass, which is why they never catch it. I'll add a testing section to the article that names the devices worth keeping around: an actual Android with Outlook, Gmail Android, and iOS Mail. If you want to write it up from what you've hit, send a PR and I'll take it.
  3. Olufemi
    The accessibility section is something most email-design articles skip. Glad to see WCAG referenced explicitly.
  4. Sofia
    Did our quarterly template audit using this as the rubric. Found 11 of our 14 templates had at least one accessibility issue. Worst offender: alt text on header images was literally just 'logo'.
    1. Admin
      11 of 14 sounds about right for any template set that's been added to over a few years. Nobody audits the old ones, they just get duplicated. The alt="logo" thing is worth calling out specifically, because it's not just an accessibility miss. Outlook and a lot of corporate clients block images by default, so that alt text is the first thing plenty of people see. "logo" tells them nothing. Company name plus what the email is works better, something like "Acme Sales" rather than a description of the graphic itself. If you're auditing against this rubric anyway, the other one that tends to hide in header images is a transparent-PNG logo with dark artwork. Renders fine on white, disappears the moment a client inverts the background. A solid or near-solid background on the logo block fixes it without any dark mode media query. I'll add an audit checklist section to the article. The rubric is buried in prose right now and that's clearly how people are using it.

More in Email Design & Content