Skip to main content
Emailens
CSS Properties

position

CSS property · 3 supported, 12 partial, 6 unsupported across 21 clients

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

  • 1/7 webmail, 2/6 desktop, 0/8 mobile clients support position fully.
  • Unsupported in Gmail, Gmail Android, Gmail iOS, Outlook (New) and 2 more.
  • Partial in Outlook 365, Outlook Android, Apple Mail, Apple Mail iOS and 8 more, behavior differs from browsers, test before relying on it.
  • Outlook Classic (Word engine, supported to at least 2029) does not fully support position, 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 May 16, 2021, synced by Emailens Sep 2, 2026.

Client Support

ClientCategoryEngineSupport
GmailwebmailGmail WebUnsupported
Gmail AndroidmobileGmail MobileUnsupported
Gmail iOSmobileGmail MobileUnsupported
Outlook 365webmailOutlook WebPartialSee caveat 1
Outlook (New)desktopOutlook WebUnsupported
Outlook ClassicdesktopMicrosoft WordUnsupported
Outlook iOSmobileOutlook MobileUnsupported
Outlook AndroidmobileOutlook MobilePartialSee caveat 1
Outlook for MacdesktopWebKitSupported
Apple MaildesktopWebKitPartialSee caveat 2
Apple Mail iOSmobileWebKitPartialSee caveat 2
Yahoo MailwebmailYahooPartialSee caveat 3
Yahoo Mail AndroidmobileYahooPartialSee caveat 3
Yahoo Mail iOSmobileYahooPartialSee caveat 3
Samsung MailmobileSamsungPartialSee caveat 2
ThunderbirddesktopGeckoSupported
HEY MailwebmailWebKitPartialSee caveat 4
Proton MailwebmailProtonSupported
AOL MailwebmailAOLPartialSee caveat 3
FastmailwebmailFastmailPartialSee caveat 5
SuperhumandesktopBlinkPartialSee caveat 6

Documented caveats (6)

  1. 1.Outlook 365, Outlook Android: Partial. Supports sticky but not relative, absolute and fixed.
  2. 2.Apple Mail, Apple Mail iOS, Samsung Mail: Partial. Supports relative, absolute but not sticky and fixed.
  3. 3.Yahoo Mail, Yahoo Mail Android, Yahoo Mail iOS, AOL Mail: Partial. Supports relative but not absolute, sticky and fixed.
  4. 4.HEY Mail: Partial. Supports relative and sticky but not absolute and fixed.
  5. 5.Fastmail: Partial. Supports relative, absolute but not sticky and fixed. Buggy. fixed is replaced by absolute.
  6. 6.Superhuman: Partial. Supports relative and absolute but not fixed and sticky.

Caveats recorded by caniemail.com (MIT) and carried verbatim, one entry per wording rather than per client.

Client-by-client behaviour for position

Fully supports position (3): Outlook for Mac, Thunderbird, Proton Mail.

Partial support (12): Outlook 365, Outlook Android, Apple Mail, Apple Mail iOS, Yahoo Mail, Yahoo Mail Android, Yahoo Mail iOS, Samsung Mail, HEY Mail, AOL Mail, Fastmail, 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 (6): Gmail, Gmail Android, Gmail iOS, Outlook (New), Outlook Classic, Outlook iOS. Plan fallbacks for these clients before relying on position in production sends.

Fixes & Workarounds

Gmail

Unsupported

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Gmail Android

Unsupported

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Gmail iOS

Unsupported

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Outlook (New)

Unsupported

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Outlook Classic

Unsupported

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Outlook iOS

Unsupported

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Outlook 365

Partial

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Outlook Android

Partial

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Apple Mail

Partial

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Apple Mail iOS

Partial

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Yahoo Mail

Partial

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Yahoo Mail Android

Partial

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Yahoo Mail iOS

Partial

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Samsung Mail

Partial

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

HEY Mail

Partial

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

AOL Mail

Partial

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Fastmail

Partial

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Superhuman

Partial

Use table-based positioning instead of CSS position.

Before (Broken)

before.html
6 lines
<div style="position: relative;">
  <div style="position: absolute; top: 0; right: 0;">
    Badge
  </div>
  <p>Content</p>
</div>

After (Fixed)

fixed.html
7 lines
<table role="presentation" width="100%" cellpadding="0"
  cellspacing="0" border="0">
  <tr>
    <td valign="top">Content</td>
    <td width="80" valign="top" align="right">Badge</td>
  </tr>
</table>

Use table-based positioning instead of CSS position

Production guidance for position

position is a CSS property. Across the email client matrix, 3 of 21 tracked clients support it fully, 12 only partially, and 6 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 position 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 position

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

Zero-Friction Engine Preview

Test your position layout across 21 email clients

Preview rendering, catch CSS issues, and see how position 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 May 16, 2021 as the last time position was tested in a real client, 5 years before this sync. Syncing copies that result forward, it does not re-test it. Carried in @emailens/engine data v0.12.2.