<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Niven Ranchhod</title>
    <description>The latest articles on Forem by Niven Ranchhod (@nivenranchhod).</description>
    <link>https://forem.com/nivenranchhod</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F867603%2F0c4bf16a-2f12-48d8-bd12-d1cdabb0d9e5.jpg</url>
      <title>Forem: Niven Ranchhod</title>
      <link>https://forem.com/nivenranchhod</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/nivenranchhod"/>
    <language>en</language>
    <item>
      <title>Parallax in Email with fallback - HTML Email Experiment</title>
      <dc:creator>Niven Ranchhod</dc:creator>
      <pubDate>Tue, 19 Dec 2023 21:46:18 +0000</pubDate>
      <link>https://forem.com/nivenranchhod/parallax-in-email-with-fallback-html-email-experiment-27en</link>
      <guid>https://forem.com/nivenranchhod/parallax-in-email-with-fallback-html-email-experiment-27en</guid>
      <description>&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/2c482b99e4134b28bcfc5ac50d6ecde8"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;

&lt;blockquote&gt;
&lt;p&gt;Originally posted on my personal blog in April 2023 - &lt;br&gt;
&lt;a href="https://bare-bones.dev/blog/parallax-in-email/"&gt;https://bare-bones.dev/blog/parallax-in-email/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/NivenRanchhod/embed/gOqVXJE?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please note: This is not a mobile responsive project, so things will look squeezed and positioning on mobile will be out, but the main workings should be intact.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is a fun little project I've been tinkering with for a wee while. I have wanted to play with an abstract email challenge for a long time but I just haven't had the right project to spark that fire that makes me obsess over an idea.&lt;/p&gt;

&lt;p&gt;One night this ad for Gousto (a recipe box company in the UK), popped up while we had the TV paused:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5fEsKkqj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n9qx9xa3riuobp3gr2yw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5fEsKkqj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n9qx9xa3riuobp3gr2yw.jpg" alt="A photo of the TV ad showing a hand sprinkling coriander leaves over a dish, with two lines of text placed in amongst the individual leaves to give a layered effect." width="400" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I instantly thought of my favourite technique, faux absolute positioning. While I wouldn't be able to recreate the design without the original image (which I couldn't track down), I could take the premise and find an equally intricate image to pull off the same effect.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" alt="" width="200" height="46"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🏗️ Setup
&lt;/h2&gt;

&lt;p&gt;I scoured stock imagery sites until I found an interesting image:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--26a3cH04--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5cyl86nmf57no14m0ls.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--26a3cH04--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5cyl86nmf57no14m0ls.jpg" alt="The stock image shows a hovering plate with seven pieces of sushi, sesami seeds, seeds and garnish falling in the direction of the plate" width="400" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First port of call was to remove the background and then split the elements up into separate layers so I could insert some text in amongst everything.&lt;/p&gt;

&lt;p&gt;Here is a simple mockup I created once everything was cut out, to get an idea of how I could build it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BBQy3vaE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9na03x0q8y7rxcbntcps.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BBQy3vaE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9na03x0q8y7rxcbntcps.jpg" alt="The same stock image now cut up and pieced back together in the same formation as the original to allow me to add the text 'I love Sushi'" width="400" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm not great with words and "I love Sushi" was the best I could come up with 😂 &lt;br&gt;&lt;br&gt;
I tweaked it slightly during the build, to include a heart shaped piece of sushi so it reads slightly better now, but I digress.&lt;br&gt;&lt;br&gt;
In the end, there will be some overlap between the layers, but the main goal is keep that text as live text.&lt;/p&gt;

&lt;p&gt;It was around this time I remembered that I've always wanted to attempt a parallax effect in email. &lt;br&gt;
This technique was new to me, in implementation. Even on the front end, I hadn't ever used or even played with CSS based parallax, so I had some homework to do before I could see if this would even work in any email clients.&lt;/p&gt;

&lt;p&gt;But first, some reflection.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" alt="" width="200" height="46"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🫗 One for the homies
&lt;/h2&gt;

&lt;p&gt;In the past, the community has come up with a great alternative to parallax, in fixed/absolute positioning. A great example of this is the infamous &lt;a href="https://parcel.io/e/666b2172-828c-40cf-9fd0-f84e8deec8a7?"&gt;Taco Bell&lt;/a&gt; email by &lt;a href="https://twitter.com/SwissWebMiss?t=Obxgbym7lDJYk-nzoVeXiw&amp;amp;s=09"&gt;Heidi Olsen&lt;/a&gt;. Heidi was kind enough to share a little background and the actual code to this email. &lt;br&gt;&lt;br&gt;
Well worth a look if you haven't seen it before:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://parcel.io/e/666b2172-828c-40cf-9fd0-f84e8deec8a7?"&gt;Heidi's fixed position email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://litmus.com/community/discussions/5118-using-z-index-and-fixed-positioning-to-create-a-scrolling-experience"&gt;Heidi's write-up on the Litmus forum&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Email on Acid then built their own version a year or so later, improving on Heidi's idea, with better email client support, utilising… faux absolute positioning! That technique just gives and gives and gives. &lt;/p&gt;

&lt;p&gt;Again, well worth a look to see where they made improvements over Heidi's idea.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://marketing.emailonacid.com/happy-halloween"&gt;EoA's Halloween fixed position email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.emailonacid.com/blog/article/email-development/how-we-created-out-interactive-scrolling-halloween-email/"&gt;EoA's write-up&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And there are plenty more examples in our community, I've only scratched the surface.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" alt="" width="200" height="46"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🧮 The game plan
&lt;/h2&gt;

&lt;p&gt;Going into this, I knew most of the ins and outs of the faux absolute technique, from my work on the &lt;a href="https://www.emailonacid.com/blog/article/email-development/faux-absolute-positioning/"&gt;multi-axis faux absolute module&lt;/a&gt; for a client project at &lt;a href="https://www.mailix.com/multi-axis-faux-absolute-positioning-in-html-email/"&gt;Mailix&lt;/a&gt;, so I knew the approach to take and the email client support.&lt;/p&gt;

&lt;p&gt;I also knew that parallax wouldn't be easy, otherwise we'd see it used more often. And if it was supported even in one email client, it would be treated as a progressive enhancement on top of a more solid base. And that was my goal. Faux absolute as a strong, well supported base for the majority of email clients and parallax as a bonus, if it is even supported.&lt;/p&gt;

&lt;p&gt;I mentioned this earlier but I think it's important to note again - I decided not to go down the rabbit hole of making this responsive. I just wanted it to work and there is so much positioning involved that it would be a hell of a job adapting everything as the whole project scaled. If you test this out, you will definitely see some small positioning issues on mobile, but that's okay. The main point is to show parallax working in Apple's own mail client(s).&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" alt="" width="200" height="46"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🛠️ Main build
&lt;/h2&gt;

&lt;p&gt;I urge you to look into the faux absolute positioning technique if you haven't already. Basic premise is to wrap all of the elements you want to layer over the top of each other, in divs (I've only tested with divs, but may work with a span or even a table) individually, set the max-height to 0 on those divs which in-turn makes them trick each other into thinking everything is zero'd out. Then play with the max-height value of each div to push surrounding elements down or use absolute positioning, margin or padding to push your elements around. Outlook still requires VML to make this work but VML supports position absolute which is way easier to use 🎉🎉🎉&lt;/p&gt;

&lt;p&gt;Here is the base build with wording tweak included 😉:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i5zHReX_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aja14qfdjsbovnzlh2r9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i5zHReX_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aja14qfdjsbovnzlh2r9.jpg" alt="A preview of the base project build using faux absolute positioning, with the text now reading 'I heart Sushi'" width="400" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rendering results were as expected. It worked everywhere except GMX, Web.de, T-Online.de and Comcast. Comcast I can't do too much about as I'm not US based and cannot get an account to test. &lt;/p&gt;

&lt;p&gt;GMX, Web.de, T-Online.de all require inline CSS. This project required a fair amount of CSS because of the targeted fixes, so I'm not going to set up the inlining just for these three clients, considering it's an experiment. However, it would be simple enough to fix for a typical faux absolute + parallax build with full width blocks and a few small elements layered over the top.&lt;/p&gt;

&lt;p&gt;tl;dr - I can't be arsed fixing the build for these clients since they've made it incredibly more difficult to code emails. It's just silly and ultimately this is just an experiment.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" alt="" width="200" height="46"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🪄 The magic
&lt;/h2&gt;

&lt;p&gt;And now the fun but laborious process of getting an understanding of CSS based parallax.&lt;/p&gt;

&lt;p&gt;First and foremost, it is imperative you read up on this technique using the best resources available.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keith Clark's &lt;a href="https://keithclark.co.uk/articles/pure-css-parallax-websites/"&gt;Pure CSS Parallax Websites&lt;/a&gt; - a lot of detail and scenario work in this how-to. Keith includes some good examples to illustrate how the CSS mimics layers and then how they work with helpful interactive &amp;amp; scrollable diagrams. &lt;/li&gt;
&lt;li&gt;Chrome Developers &lt;a href="https://developer.chrome.com/blog/performant-parallaxing/"&gt;Performant Parallaxing&lt;/a&gt; (originally written by Paul Lewis) - another in depth breakdown with some basic examples of how the properties work in conjunction.&lt;/li&gt;
&lt;li&gt;Mark Robbins also adapted one of the examples included in the Chrome Developers post, for &lt;a href="https://parcel.io/e/495df74b-ac1b-4de6-8df3-1a11f4f7d8cf"&gt;his testing in email clients&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
This technique is heavily reliant on these three properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;perspective&lt;/code&gt; - defines the distance of an element from the user.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transform&lt;/code&gt; - value of &lt;code&gt;translateZ(#)&lt;/code&gt; determines the layer depth and subsequent scrolling speed + &lt;code&gt;scale(#)&lt;/code&gt; scales the element back up to the originally intended size.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transform-style&lt;/code&gt; - value of &lt;code&gt;preserve-3d&lt;/code&gt; indicates the children of the element, will be positioned in a 3D space.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
First thing to do was to check all of these properties in &lt;a href="http://caniemail.com"&gt;caniemail.com&lt;/a&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;perspective&lt;/code&gt; - not documented yet.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transform&lt;/code&gt; - has great support but that is to be expected as this property isn't specifically for 3D CSS.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transform-style&lt;/code&gt; - not documented yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is unfortunate, but understandable. Two of those properties aren't in everyday use for email. Ahh well. Time to test. &lt;/p&gt;

&lt;p&gt;I sent &lt;a href="https://parcel.io/e/495df74b-ac1b-4de6-8df3-1a11f4f7d8cf"&gt;Mark's adapted parallax test&lt;/a&gt; to Litmus first, to see if &lt;code&gt;transform:translateZ(#);&lt;/code&gt; was being respected. Without this, the scrolling speed variance can't be set, to give the illusion of distance. Thankfully it was working in Apple Mail, but the 3D properties weren't taking any effect in any other client. &lt;/p&gt;

&lt;p&gt;While the &lt;code&gt;translateZ&lt;/code&gt; value was being respected in Apple Mail, I still needed to test if the scrolling speed variance effect worked, which I can only do with a manually manipulated Apple device. Weird wording, but you'll see what I mean shortly.&lt;/p&gt;

&lt;p&gt;I only have a Windows laptop and an Android phone. My partner has an iPad but she gets a lot of use out of it for her business and artwork and I need a more accessible option, especially when I'm running rounds and rounds of tests. My best option was to set up a virtual Mac on my laptop and reserve the use of the iPad for some final testing. Setting the VM up took maybe a couple of hours including research, downloading files and then setting up the latest available version of the OS.&lt;/p&gt;

&lt;p&gt;With that all set up, sending the test to my new test iCloud address, I could see the scrolling working as expected 🙀&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/a5c979e35fcb46bcbed5fb2c2e0d7592"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;&lt;br&gt;&lt;br&gt;
It may not look like much but think about how all of those elements would usually react or rather not react when the viewport scrolls. They would stay static, keeping their initial distance between each other while the body shifts up. However, in this test, the distance between each element changes. That is the scroll speed variance I'm on about. The scroll speed of each element differs and so they are individually reacting to the scrolling action of the viewport.&lt;/p&gt;

&lt;p&gt;Now, on to testing the properties on my build. Unfortunately, it wasn't as easy as applying the parallax properties to my faux absolute base to enhance the build for Apple Mail. The 3D properties completely throw out the faux absolute positioning values.&lt;/p&gt;

&lt;p&gt;I found that I had to set up separate positioning values for the parallax build. And to be honest, it was just less of a headache overall having the approaches split up in styles blocks in the head. &lt;/p&gt;

&lt;p&gt;Once all of the elements were set up for the parallax build, I fired off another test to iCloud. &lt;/p&gt;

&lt;p&gt;Boom! Winner winner chicken dinner!&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/14a9d77c33be480492499e0cf16d4a85"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" alt="" width="200" height="46"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🪛 Fine tuning
&lt;/h2&gt;

&lt;p&gt;I now needed to ensure my parallax property overrides are enabled in Apple Mail and leave the faux absolute base in place by default.&lt;/p&gt;

&lt;p&gt;The always reliable &lt;a href="http://howtotarget.email"&gt;howtotarget.email&lt;/a&gt; gave me this selector to target all Apple Mail from version 10 and up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.Singleton&lt;/span&gt; &lt;span class="nc"&gt;.your-class-name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* Replace this comment with your styles */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This only enabled it for desktop and so I found this combo of selectors in an attempt to enable the build for ios mail on iPads and iPhones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min-device-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;768px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-device-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1024px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;-webkit-min-device-pixel-ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min-resolution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2dppx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hover&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;-webkit-full-screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;-webkit-full-page-media&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;future&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;not&lt;/span&gt;&lt;span class="p"&gt;(.&lt;/span&gt;&lt;span class="n"&gt;Singleton&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;your-class-name&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* Replace this comment with your styles */&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, I encountered some conflicts. I tested a bunch of variations of that combo but found reducing it down to just this selector, did the trick:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.Singleton&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;.your-class-name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="c"&gt;/* Replace this comment with your styles */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again, these two sets of selectors are split up into two separate style blocks, so they're easy to distinguish. I now have three, one for faux absolute and two for the different Parallax enablers, depending on which Apple device you're on. &lt;/p&gt;

&lt;p&gt;With the selectors in place, I could now see smaller iOS devices showing my build and so it was finally time to steal my partner's iPad for a live test and oh man, did it not disappoint. A bonus was seeing how smooth the parallax effect looks on an iPad. Especially when you scroll back to the top and see the rubber band scroll bouncing effect, accentuates the beauty.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/895972629" width="710" height="399"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" alt="" width="200" height="46"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🧑🏾‍🦯 Accessibility
&lt;/h2&gt;




&lt;h3&gt;
  
  
  🌀 Reduced Motion
&lt;/h3&gt;

&lt;p&gt;Obviously, with parallax comes motion and especially with this build and the many variations on the scroll speed etc, I thought it would be best to include a way for the build to be respectful of everyone's preferences. So, my two Parallax style blocks are now wrapped in a no-preference reduce-motion media query. &lt;br&gt;&lt;br&gt;
E.g.:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no-preference&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, when a user has set a device motion effect setting off on their device, the faux absolute position build will render, if on a device (online view) or in an email client (Apple Mail / iOS Mail) that supports the required properties.&lt;/p&gt;



&lt;h3&gt;
  
  
  🖥️ Screen Readers
&lt;/h3&gt;

&lt;p&gt;There wasn't a huge amount I needed to do here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;There is only one line of text, the H1. It's live text, so assistive tech friendly and can be translated into other languages.&lt;/li&gt;
&lt;li&gt;The majority of the images are decorative and the text gives context to my message.&lt;/li&gt;
&lt;li&gt;The one image that will need to give context is the heart shaped sushi nested inside of the H1.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's tackle point 3:&lt;/p&gt;

&lt;p&gt;Simply adding the word "heart" to the alt attribute will then mean a screen reader will read:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;heading&lt;/p&gt;

&lt;p&gt;level 1&lt;/p&gt;

&lt;p&gt;I&lt;/p&gt;

&lt;p&gt;graphic&lt;/p&gt;

&lt;p&gt;heart&lt;/p&gt;

&lt;p&gt;Sushi&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;small&gt;*Using Litmus' NVDA screen reader&lt;/small&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The announcement of a graphic being included in the middle isn't ideal, as it breaks the flow of the text and may also in fact break the context I want to include. So instead, I've opted for hiding the image from screen readers by leaving the alt attribute empty and instead adding a screen reader only string with the text "heart". &lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Those who can see the imagery, will see:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I ❤️ Sushi".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Those using a screen reader will hear:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;heading&lt;/p&gt;

&lt;p&gt;level 1&lt;/p&gt;

&lt;p&gt;I&lt;/p&gt;

&lt;p&gt;heart&lt;/p&gt;

&lt;p&gt;Sushi&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I heart Sushi".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
I went with "heart" for screen readers, so the context matches, no matter how you consume the content.&lt;/p&gt;

&lt;p&gt;Is that the best approach? I don't know. My aim is to give as close to the same experience to everyone and I think that is what I'm doing. Happy to be corrected though.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YO2Gwa7i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kt9hkmnghfz3pb70b6a8.png" alt="" width="200" height="46"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🏁 Conclusion
&lt;/h2&gt;

&lt;p&gt;Obviously this is an extreme example of how to use a combo of faux absolute with parallax as a progressive enhancement, but for me that's the fun of learning new techniques. &lt;/p&gt;

&lt;p&gt;I find it difficult to pick up advanced techniques just by reading, in fact I very often inadvertently wander with my thoughts and get distracted and have to reread long posts, many times abandoning them. And usually I learn something new while in the middle of a project, rather than building a test specifically to learn that new thing. That helps keep me engaged because I'm deep in thought on how to achieve something for a client or excited to build a crazy idea, like this.&lt;/p&gt;

&lt;p&gt;The thrill for me comes with the initial excitement of an idea, the frustration of my implementation of a new technique into my project not working and then the overwhelming feeling of accomplishment of getting over that hurdle and sharing it with others.&lt;/p&gt;

&lt;p&gt;I hope that inspires others to experiment, whether it be with something like this or just a crazy idea they have.&lt;/p&gt;

&lt;p&gt;Thanks for reading,&lt;br&gt;
Niven&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--20qkxj-M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/to9t3nqay81rbx0j6t03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--20qkxj-M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/to9t3nqay81rbx0j6t03.png" alt="" width="200" height="46"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>email</category>
      <category>parallax</category>
    </item>
    <item>
      <title>Uber email receipt vs. Outlook — an exclusive take from an email developer</title>
      <dc:creator>Niven Ranchhod</dc:creator>
      <pubDate>Fri, 05 Aug 2022 10:02:17 +0000</pubDate>
      <link>https://forem.com/nivenranchhod/uber-email-receipt-vs-outlook-an-exclusive-take-from-an-email-developer-16ki</link>
      <guid>https://forem.com/nivenranchhod/uber-email-receipt-vs-outlook-an-exclusive-take-from-an-email-developer-16ki</guid>
      <description>&lt;p&gt;I did a deep dive into the HTML template causing so much strife for Outlook and got a little obsessive along the way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Original story by Bleeping Computer:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.bleepingcomputer.com/news/microsoft/microsoft-outlook-is-crashing-when-reading-uber-receipt-emails/"&gt;https://www.bleepingcomputer.com/news/microsoft/microsoft-outlook-is-crashing-when-reading-uber-receipt-emails/&lt;/a&gt;&lt;/p&gt;




&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://giphy.com/gifs/HteV6g0QTNxp6" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--KIsIchR3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExZDEyODJ3dmN5cTRlYjY1bGJhdXI3ZGMxMHh4anpwYXg1eDlhd2dlZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/HteV6g0QTNxp6/giphy-downsized-large.gif" height="267" class="m-0" width="480"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://giphy.com/gifs/HteV6g0QTNxp6" rel="noopener noreferrer" class="c-link"&gt;
          Parks And Recreation Reaction GIF - Find &amp;amp; Share on GIPHY
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Discover &amp;amp; share this Giphyimporter Api312 GIF with everyone you know. GIPHY is how you search, share, discover, and create GIFs.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--bzD6Ar5---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giphy.com/static/img/favicon.png" width="16" height="16"&gt;
        giphy.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  📖 How it started
&lt;/h2&gt;

&lt;p&gt;The email community was having a field day with this. As soon as the news started circling about an email that was finally able to take down the mighty Outlook desktop application (which is notorious in it’s own right for being a poor experience), we were trying to figure out what could have possibly caused the bug.&lt;/p&gt;

&lt;p&gt;The description ‘complex tables’ was thrown about like anyone knew what that actually meant. One eagle eyed community member found an &lt;a href="https://reallygoodemails.com/emails/personal-your-tuesday-morning-trip-with-uber"&gt;example of a recent Uber email receipt&lt;/a&gt; dating back to May 2022, saved on &lt;a href="https://reallygoodemails.com/"&gt;Really Good Emails&lt;/a&gt;. She was able to pull the source code and share with the community.&lt;/p&gt;

&lt;p&gt;I jumped at the chance to try and figure out what the issue actually was as well as get a peek behind the curtain on how a global company of this size, codes their emails.&lt;br&gt;
Let’s just say, I was impressed but for all the wrong reasons 😔&lt;/p&gt;


&lt;h2&gt;
  
  
  👷🏾‍♂️ Let’s get technical
&lt;/h2&gt;

&lt;p&gt;First I dropped the source code into &lt;a href="https://parcel.io/"&gt;Parcel&lt;/a&gt; (a dedicated Email builder tool) and skimmed through the HTML.&lt;br&gt;
Parcel has helpful tools in it’s editor, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inspect Element&lt;/strong&gt; — Click any HTML element in the preview to jump to the corresponding code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Focus Mode&lt;/strong&gt; — Highlights and scroll the HTML element you are editing into view.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Expanded Table View&lt;/strong&gt; — Outline table elements to easily debug table-based layout issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I cannot emphasise enough, how helpful these extra editor tools were to debugging this email. Without them, I think this would have taken twice the time to review. And they’re included in the Free plan, which I’m on.&lt;/p&gt;

&lt;p&gt;Thanks Parcel 👍🏾&lt;/p&gt;

&lt;p&gt;—&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Container&lt;/strong&gt;&lt;br&gt;
On initial review, I noticed a worrying trend… Numerous layers of nested tables for each section of the template.&lt;br&gt;
On top of that, an attempt at a fluid setup for the structure with some of the wrapping tables using max-widths (which Outlook doesn’t support) and then a MSO or Outlook specific table with a fixed width (to fix the lack of max-width support).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!--[if (gte mso 9)|(IE)]&amp;gt;&amp;lt;table width="700" align="center" cellpadding="0" cellspacing="0" border="0"&amp;gt;
    &amp;lt;tr&amp;gt;
        &amp;lt;td&amp;gt;
&amp;lt;![endif]--&amp;gt;
            &amp;lt;table width="100%" border="0" cellpadding="0" cellspacing="0" style="border:none;border-collapse:collapse;border-spacing:0;max-width:700px;mso-table-lspace:0;mso-table-rspace:0;width:100%" class="wrapper"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This setup is completely normal, but to see it being used on almost every layer of the nested structure, is simply not necessary.&lt;/p&gt;

&lt;p&gt;This is how the email looked with the ‘Expanded Table View’ switched on:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ntBalddR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kbi902oj4v94l4koywsx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ntBalddR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kbi902oj4v94l4koywsx.jpg" alt="A screenshot of the ‘Expanded Table View’ in Parcel, showing the multiple layers of nested tables." width="698" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I discovered there were five extra tables wrapping the outer 700px wide container.&lt;/p&gt;

&lt;p&gt;Removing these extra tables resulted in 38 lines of code being removed and a drop in file size by 33kb.&lt;br&gt;
I mean, that is huge!&lt;/p&gt;

&lt;p&gt;The email originally weighed in at 172kb. It’s now sitting at 139kb, after this removal.&lt;/p&gt;

&lt;p&gt;—&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Header&lt;/strong&gt;&lt;br&gt;
The header was also wrapped in another six tables 🤯&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9yIYb_49--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tms8ll5e5ff5q5qaytra.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9yIYb_49--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tms8ll5e5ff5q5qaytra.png" alt="Screenshot of the header area and it’s contents of the Uber email in question" width="654" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Designs like this are rather simple to lay out.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;One full width table which has the background colour and vertical padding.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A centred inner table of the intended width, with the two elements sitting in two columns since they stay side by side on smaller screens.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s two tables.&lt;br&gt;
Four extra tables doesn’t seem like a lot, but removing these resulted in a 5kb reduction in HTML file size.&lt;/p&gt;

&lt;p&gt;5kb doesn’t sound like a lot, but in a world where Gmail clips emails larger than 102kb, a 5kb saving can be huge.&lt;br&gt;
The amends to the header meant we were sitting at 134kb.&lt;/p&gt;

&lt;p&gt;—&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏃🏾‍♀️ And on and on…&lt;/strong&gt;&lt;br&gt;
The themes from the points above continue on for all sections.&lt;br&gt;
Extra tables with CSS being applied at different stages.&lt;br&gt;
In some cases, padding was being applied vertically in one layer and then one or two layers further in, horizontal padding was being applied.&lt;/p&gt;

&lt;p&gt;Other issues I found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Heavy multi-table faux columns. 13 lines of code to mimic a table column. Hints at a mix of development styles by multiple developers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;100% width Outlook fallbacks for 100% width tables. Effectively, this doubles the code for no reason.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A lot of unused CSS in the head. A hangover from a templated system. This isn’t too concerning but making CSS in the head conditional depending on the use would make savings in file size too.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Class names for mobile styles are all doing the same thing. In this case, the .full class name (at the bottom of the list) would have sufficed.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@media screen and (max-width:699px) {
.t1of12,
.t2of12,
.t3of12,
.t4of12,
.t5of12,
.t6of12,
.t7of12,
.t8of12,
.t9of12,
.t10of12,
.t11of12,
.t12of12,
.full { width: 100% !important; max-width: none !important; }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://giphy.com/gifs/computer-disgusted-hammer-12bVDtXPOzYwda" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--QVYDRCQy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExYjQyZmMwOTMwZXBodGNycmRkNm96NjcyNThrcDRqeGo2Nmx6dWhyZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/12bVDtXPOzYwda/200.gif" height="200" class="m-0" width="267"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://giphy.com/gifs/computer-disgusted-hammer-12bVDtXPOzYwda" rel="noopener noreferrer" class="c-link"&gt;
          Computer Reaction GIF - Find &amp;amp; Share on GIPHY
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Discover &amp;amp; share this Reaction GIF with everyone you know. GIPHY is how you search, share, discover, and create GIFs.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--bzD6Ar5---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://giphy.com/static/img/favicon.png" width="16" height="16"&gt;
        giphy.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;—&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🦾 Accessibility&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I ran the original code through the Litmus accessibility checker and found these results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Images are missing alt attributes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; is missing a lang attribute&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A large number of presentational tables are missing a role attribute to inform screens readers to ignore their structure.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the basics for email accessibility, especially alt attributes on images, even if empty.&lt;br&gt;
Not a good look.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Outlook crashing or being crippled by HTML absolutely shouldn’t be happening!&lt;br&gt;
The Outlook team pushing out a hot fix, begs the question… Why can’t they do the same to fix the numerous issues with how Outlook renders HTML, which have plagued developers for years and over multiple versions of the software?&lt;/p&gt;

&lt;p&gt;On the flipside, why is a Unicorn like Uber unable to produce standard HTML email templates?&lt;br&gt;
There is a flourishing community of &lt;a href="https://email.geeks.chat/"&gt;#emailgeeks&lt;/a&gt; sharing how to build and deliver emails in a standard and accessible way.&lt;/p&gt;

&lt;p&gt;We now also have the &lt;a href="https://emailmarkup.org/"&gt;Email Markup Consortium&lt;/a&gt;, made up completely of community members, attempting to help the community and ESPs set standards for everything email.&lt;br&gt;
Resources are in reach.&lt;/p&gt;

&lt;p&gt;I’ve been building emails for eight years now. I’ve seen email templating systems of all sizes in my time, but never anything this poorly built and managed. And it’s sad to see such poor accessibility integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ I must emphasise…&lt;/strong&gt;&lt;br&gt;
There is actually nothing complex about the table structure being used in this template. ‘Complex tables’ is the wrong term to use in this instance.&lt;br&gt;
It’s simply convoluted and poorly built. That’s it.&lt;br&gt;
Band-aids are being applied over older band aids. Clearly, no one is reviewing the code base and ensuring it’s up to date, being applied correctly or even up to scratch standards wise.&lt;/p&gt;

&lt;p&gt;I’m still not 100% clear on what the specific issue was.&lt;br&gt;
All I know is that cleaning the HTML slightly, fixed it. No HTML errors were showing in the original file, so it doesn’t seem to be an invalid HTML issue.&lt;br&gt;
It’s as if Outlook was itself overwhelmed by the sheer over complication of what should have been a simple build 😵&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do better Uber.&lt;/strong&gt;&lt;br&gt;
You have the money and resource to fix this.&lt;br&gt;
We as a community would love if you reached out for help.&lt;br&gt;
We’ll welcome you in, run you through what you need to work on and help with implementation.&lt;/p&gt;

&lt;p&gt;We look forward to hearing from you ✌🏾&lt;/p&gt;




&lt;p&gt;&lt;a href="https://nivenranchhod.medium.com/uber-email-receipt-vs-outlook-an-exclusive-take-from-an-email-developer-2894d47d6d0c"&gt;This piece was originally posted on Medium.&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;🙋🏾 One final thing!&lt;/strong&gt;&lt;br&gt;
This happened to be timed really well for a personal project I’m launching very soon. It’s called Bare Bones and will be a blog + newsletter to document HTML deep dives (such as this), tutorials and thoughts on email development.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fc6-e0-S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3782rvzgcwhpu019iedx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fc6-e0-S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3782rvzgcwhpu019iedx.png" alt="The logo for my new project, Bare Bones." width="350" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve wanted to mentor junior developers for some time now, however I can’t dedicate the time at the moment. So this is my way of indirectly mentoring and helping whomever I can, in my free time and around my more important life events.&lt;/p&gt;

&lt;p&gt;I can’t give too much away yet as I’m deep in the build stages of the website &amp;amp; blog.&lt;br&gt;
However, you can &lt;a href="https://www.getrevue.co/profile/Barebonesclub"&gt;get on the mailing list&lt;/a&gt; now and then I can keep you posted on my progress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.getrevue.co/profile/Barebonesclub"&gt;📥 Sign up for the Bare Bones mailing list.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>html</category>
      <category>outlook</category>
      <category>uber</category>
    </item>
  </channel>
</rss>
