假设您设计了一个包含 3 列的 HTML 电子邮件。由于 电子邮件客户端中有限且奇怪的 CSS 支持,电子邮件设计是使用表格完成的。这种 3 列设计在大屏幕上看起来很棒,但在小屏幕上则会显得非常拥挤。理论上,媒体查询可以在这里拯救我们,但正如我们 甚至不能依赖浮动,我们当然也不能依赖媒体查询。不过,仍然有办法。
在本文中,我只想探究一些关于响应式电子邮件的理念。这些理念并非健壮的、可用于生产环境的理念,我只是觉得思考起来很有趣。这些理念的灵感来自最近听 Fabio Carneiro 的演讲。Fabio 在 MailChimp 工作,负责处理所有这些复杂的电子邮件布局,并在演讲中分享了一些关于响应式电子邮件背后的理念。他还拥有 一门 Treehouse 课程,专门讲解电子邮件设计。
Jason Rodriguez 也 写了一篇文章,探讨了这个主题。
带有 align=”left” 的行
以下是布局中的一些片段

您可能会想:每个片段都是一个 <td>
。但事实并非如此,如果是这样的话,在电子邮件有限的 CSS 世界中,您将永远无法使它们换行。
实际上,每个片段都是一个 <table align="left">
。 Align 是一个古老的、已弃用的属性,但它在所有电子邮件客户端中都仍然受支持。它有点像浮动,但我们不能使用浮动。我认为它更像是在让表格的行为类似于一个 inline-block
元素。您可以控制它的宽度,它可以与其他内容位于同一行,并且仍然可以换行。
所以这就像
<table class="main-wrapping-table">
<tr>
<td>
<table align="left" style="width: 33.33%">
</table>
<table align="left" style="width: 33.33%">
</table>
<table align="left" style="width: 33.33%">
</table>
</td>
</tr>
</table>
里面还会有一堆其他内联 CSS,用于进行居中等等,但这只是布局概念。
将这个理念扩展到其他包含不同数量片段的行,我们得到了以下结果

这是一个相当不错的基础,它没有使用任何电子邮件客户端无法使用的功能。
带有 min-width 的可换行行
一些电子邮件客户端支持 min-width。因此,如果我们将它放在需要它的片段上,我们可以使这些行在合理的位置换行。
您可以将 CSS 直接放在表格片段上,例如
<table align="left" style="width: 33.33% min-width: 200px;" class="chunk">
<table>

效果更好。现在,每个片段将在需要的位置换行,并且不会变得过于拥挤。
使用 @media 查询填充空间
一些电子邮件客户端支持 @media
查询,因此如果是这种情况,我们将针对这些片段,并确保在出现这些换行时,它们能够更好地填充空间。
/* Figure out where the breaks happen and use that in the media query */
@media (max-width: 400px) {
.chunk {
width: 100% !important;
}
}

效果更好。您可以做得比我更好,确保所有换行都按照您的计划进行。
使用 max-width 控制宽度
过于拥挤不好,过于宽也不好。不妨在支持 max-width 的浏览器中限制容器表格的宽度。
<table style="max-width: 600px; margin: 0 auto;" class="main-table">
</table>

演示
再说一次,这并不是完全可用于生产环境的,只是为了演示这些理念。
查看 CodePen 上 Chris Coyier 的 “响应式”电子邮件 (@chriscoyier)。
如果您想要可用于生产环境的解决方案,我可能会使用 MailChimp 的 Email Blueprints。他们似乎使用了一个严格的、固定的断点。因此,它只会根据可用的屏幕空间显示“桌面”或“移动”版本。可以说,这是“自适应”设计。我认为这在 HTML 电子邮件设计中是可取的。
好东西。谢谢!
一个很酷的理念,但我很好奇,电子邮件客户端是否可以读取带有媒体查询的外部 CSS/LESS/SCSS?如果可以的话,为什么我们还要在表格上创建电子邮件模板,而可以直接使用 div,这样会更方便。
我敢肯定,大多数邮件程序都不会允许这样做(我需要测试多个程序才能确定),但这与允许加载外部图像具有相同的隐私信息泄露风险。每封电子邮件都可以引用 http://example.com/${UNIQUE_TRACKING_TOKEN。css,然后发送者就可以知道电子邮件是否被打开/查看。因此,我认为,即使这是可能的,用户也需要显式启用它。
您无法加载外部 CSS,或者至少并非所有电子邮件客户端都支持它。据我所知,您也不能依赖 div 布局,因为电子邮件客户端对 CSS 的支持程度各不相同。
chris 有关于此主题的一些文章和指南,还有一些解释为什么我们必须坚持使用表格布局。最后,一种使用 LESS、SASS 等 CSS 预处理器的方法是将它们编译成普通的 CSS。将其放入您的 head 标签中,并使用链接将其转换成内联样式 CSS。
希望这有帮助
抱歉,我之前的评论中所说的“链接”转换是指使用这个链接: Premailer,它可以在 Chris 的文章 using-css-in-html-emails-the-real-story 中找到。
希望这有帮助!
我对媒体查询感到困惑,我需要测试一下才能理清思路。
电子邮件不会读取外部样式。将它们添加到文档的头部,然后将它们粘贴到 Mailchimp 的工具中,该工具可以将您的样式转换为内联样式。 http://templates.mailchimp.com/resources/inline-css/
他们不读取外部样式的原因之一是,您可以使用一些创意的服务器端代码轻松记录电子邮件何时被打开。您将拥有 IP 地址,假设使用了一些查询字符串,您就可以非常清楚地跟踪人们的习惯。存在隐私问题。虽然您可能不会这样做……但很多电子邮件营销人员肯定会这样做。
只有 Google 才能跟踪个人(您想知道为什么 Google Analytics 对 99% 的用户群来说是免费使用的):-)
一如既往,富有见地的文章,Chris!
接着 Felix 的话
大多数电子邮件客户端会完全删除任何
head
甚至body
标签,因此内联样式是您唯一安全的做法。幸运的是,有 [Premailer] (http://premailer.dialect.ca “Premailer”) 可以帮助您在准备就绪时将所有外部或内部样式内联。如果你想了解更多关于响应式 HTML 邮件设计入门的信息,几个月前我写了一篇详细的教程。它包含一个免费模板,你可以用它来开始制作你自己的电子邮件。只需点击我的网站链接,或点击这里查看教程。
我知道你不是框架的忠实粉丝,Chris,但既然你推荐了 Mailchimp,为什么不试试Zurb 的 Ink
它是响应式的,并且宣称可以让你
精彩的文章……
真的很喜欢它……伙计……
这篇文章不仅在电子邮件客户端的相对布局方面很不错,而且它还说明了哪些电子邮件客户端不允许我们使用哪些功能,哪些功能允许使用……
谢谢,Chris
太棒了,哥们!
所以,Chris,使用 Mailchimp 邮件客户端来实现响应式邮件效果更好吗?
我一直使用这个http://www.emailonacid.com/blog/details/C13/emailology_a_free_responsive_email_template_using_media_queries_-_part_i
从未遇到过问题。
我是一名前端工程师,但工作在营销部门,所以电子邮件开发是我的日常工作的一部分。悲哀的是……
我真的很喜欢 Zurb 的电子邮件模板,http://zurb.com/playground/responsive-email-templates。我知道你之前在你的节目中提到过它们。我认为人们在电子邮件中感到困惑的是,当你开始添加图片、边框、CTA 和所有这些元素时,同时还试图保持平衡,并使用良好的百分比,而不至于发疯。
我认为像 960grid、Bootstrap、Zurb 这样的框架一直在帮助人们避免这种情况。
Chris,这些想法值得思考。谢谢你让响应式邮件引起更多关注!
我的主要收获是如何以一种**不需要媒体查询**的方式处理响应式邮件。我目前的一个痛点是,对于那些不支持媒体查询及其带来的灵活性的电子邮件客户端,该怎么做。目前:Gmail、Android 邮件、Mailbox;这些都是流行的电子邮件客户端,不应该被忽视。
你上面提到的内容给了我们一些思考的素材。谢谢+欢呼!
根据我的经验,电子邮件中的媒体查询只用于 iPhone,用于将主英雄图片替换为更适合移动设备尺寸的图片(320px)。据我所知,上面的其余代码应该允许你的电子邮件响应大多数其他设备。简单使用百分比宽度就可以了!
我同意使用 Mailchimp 蓝图电子邮件模板。它们很棒,以前帮助过我。我非常感谢那些为这些模板付出努力的人们!
Margin: 0 auto 在一些最流行的客户端中不起作用,你可以使用 align=”” 或者 even though。
你可以使用/不能使用什么
http://www.campaignmonitor.com/css/
我认为 MailChimp 模板甚至只是在所有内容周围使用了一个
<center>
标签。浮动表格是一件危险的事情。我在电子邮件设计领域工作,尤其是在 Outlook 2007、2010 和 2013 中,它们处理浮动表格的方式很奇怪,会添加边距,并且根据其内容,它们会像梯子一样堆叠表格,露出空白。
根据我的经验,在所有电子邮件客户端中,最安全的方法仍然是将列处理为 TD,并在媒体查询中设置 min-width 和 display block,宽度为 100%。
在过去的几年里,我已经制作了大量的响应式邮件,我有一些建议
切勿使用水平填充,想要在某个地方添加空间吗?使用一个空的表格单元格(MSO 和其他程序在间距方面存在奇怪的问题)
使用内联样式完全创建桌面布局,任何移动元素都可以放在头部中的 style 标签中(需要使用 !important 标记)
在 CSS 中使用属性选择器而不是类选择器,我从未遇到过任何程序对此有问题的案例,但我听说过一些程序有。 (所以应该是 block[class=”blockClass”] { })
Campaign monitor 是你的好朋友。
Android 上的 Gmail 应用很烂。
很有趣,而且想法非常合理,除了 Outlook 喜欢添加额外的空间,并且三个表格的排列需要大量的额外代码才能显示出来,否则它们会换行。试试吧;将代码发送到你的 Outlook 2013 客户端。
你需要在包含表格中添加一些 border-collapse 设置,并且为了确保一切紧凑,还要适当减小包含 TD 的字体大小和行高。Outlook 有一个不好的习惯,会将任何空格视为一个非换行空格字符。
很高兴知道这一点。再次说明一下,正如我在文章中所说:这不是生产就绪的代码。它只是为了介绍一些巧妙的思考,这些思考来自一个不需要媒体查询或其他更高级 CSS 的基础,从而制作“响应式”电子邮件。
@Robert,很棒的教程,谢谢!
至于电子邮件客户端无法渲染响应式邮件,我通常这样做。
我只需取我的邮件列表,过滤掉 Gmail 和其他智能电子邮件客户端,然后只向它们发送响应式版本。其他所有人都会收到一个常规版本。无需尝试将检测放在邮件本身中,因为你只需过滤你的邮件列表即可。
我认为 Outlook 不支持百分比宽度?
在“大型生产”电子邮件(如 Yelp 的周报)的电子邮件代码战壕中花费了无数个小时后,我可以毫无疑问地说,电子邮件的最佳整体方法是使用灵活的宽度作为跨设备方法。使用媒体查询进行小的增强(例如,边距调整和图像尺寸)。告诉设计师避免使用多列电子邮件设计,并保持邮件尽可能简单。当需要多列时,你可以在容器上使用 min-width 来强制移动客户端稍微放大一点,这通常比极窄的文本大列更美观、更易读。
奇怪的是,max-width 在 iOS 上不起作用,所以我不得不使用类似这样的代码:
@media only screen and (min-width: 606px) {
.content {width: 605px !important;}
}
我一直尝试使用 Ink (http://zurb.com/ink/) 框架。我在邮件中使用它来制作新闻稿,并取得了良好的效果。它支持很多客户端、浏览器和移动设备。它有一些很好的规则可以遵循,而且上手很快!
感谢分享,一如既往的好文章。