The Fab Four technique to create Responsive Emails without Media Queries
Instead of using media query to switch between mobile / desktop layout, here's a trick that uses calc, min-width, max-width and width
<style>
.item {
display: inline-block;
min-width: 50%;
}
@media(min-width: 720px) {
.item {
width: 25%;
}
}
</style>
<div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div><style>
.item {
display: inline-block;
min-width: 25%;
max-width: 50%;
width: calc((720px - 100%) * 720);
}
</style>
<div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>💡 The key idea is that
- 📝 if
max-width < width, the width =max-width - 📝 if
min-width > width, the width =min-width
if the viewport is below breakpoint, make width to be extremely large ~> max-width⬜️
otherwise, make width extremely small ~> min-width▫️
It also listed how to support some older email clients that does not support calc()
- 📝 fallback to use a fixed width
- 📝 there's 2
min-width, fixed px width for case ifcalc()is not supported, % width ifcalc()is supported
<style>
.item {
display: inline-block;
min-width: 180px; /* fallback, 720px * 25% */
min-width: calc(25%);
max-width: 50%;
width: 25%; /* fallback, size for desktop layout */
width: calc((720px - 100%) * 720);
}
</style>
<div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>or browsers that requires a vendor prefix
<style>
.item {
display: inline-block;
min-width: 180px; /* fallback, 720px * 25% */
min-width: -webkit-calc(25%);
min-width: calc(25%);
max-width: 50%;
width: 25%; /* fallback, size for desktop layout */
width: -webkit-calc((720px - 100%) * 720);
width: calc((720px - 100%) * 720);
}
</style>
<div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>There are a few mail client quirks to be wary too 😱
- 📝 Outlook(dot)com removes
calc()that includes parenthesis() - 📝 Outlook Web App removes inline-styles that contains
calc()with multiplication *
<style>
.item {
display: inline-block;
min-width: 180px; /* fallback, 720px * 25% */
min-width: -webkit-calc(25%);
min-width: calc(25%);
max-width: 50%;
width: 25%; /* fallback, size for desktop layout */
width: -webkit-calc(518400px — 72000%);
width: calc(518400px — 72000%);
}
</style>
<div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>