我们在 CSS-Tricks 上 多次讨论过 SVG,但我们还没有涉及到电子邮件领域。现在 浏览器对 SVG 的支持都已全面实现,我们很容易假设可以开始在所有地方使用 SVG。但是,如果您之前使用过电子邮件,您可能会知道,在功能支持方面,它通常远远落后于 Web。就像加州看待北达科他州的趋势一样:仅仅落后几年。 :)
本文深入探讨了四种不同的 SVG 使用方法,并比较了这些方法在几种最流行的电子邮件应用程序中的支持情况。让我们看看在哪里可以获得最多的支持。
SVG 作为图像标签
使用 SVG 作为简单的
标签就像将任何其他图像文件放置到屏幕上一样,只是我们引用的是 SVG 文件而不是 JPG 或 PNG 等文件。
<img src="my-image.svg" alt="A pair of flat black dice, one on 5 and one on 3">
以下是此技术的支持情况
AOL Web | Outlook 2013 | Outlook .com | 雅虎! | 邮件(OSX) | 邮件(iOS) | Gmail | Gmail(iOS) | Gmail(Android) | Android |
---|---|---|---|---|---|---|---|---|---|
是 | 否 | 是 | 是 | 是 | 是 | 否 | 否 | 是 | 否 |
总支持率 60%
SVG 作为内联 HTML
在此测试中,我们将 SVG 文件的代码直接从 Illustrator 中提取出来,并将其直接放置到电子邮件的 HTML 中。
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-227 241 225.3 224.1" style="enable-background:new -227 241 225.3 224.1;" xml:space="preserve">
<path class="dice-1" d="M-132,241h-72.3c-12.4,0-22.6,10.2-22.6,22.6V336c0,12.4,10.2,22.6,22.6,22.6h72.3c12.4,0,22.6-10.2,22.6-22.6
v-72.3C-109.4,251.2-119.6,241-132,241z M-195.3,340.5c-7.5,0-13.6-6.1-13.6-13.6c0-7.5,6.1-13.6,13.6-13.6
c7.5,0,13.6,6.1,13.6,13.6C-181.8,334.4-187.9,340.5-195.3,340.5z M-195.3,286.2c-7.5,0-13.6-6.1-13.6-13.6
c0-7.5,6.1-13.6,13.6-13.6c7.5,0,13.6,6.1,13.6,13.6C-181.8,280.1-187.9,286.2-195.3,286.2z M-168.2,313.3
c-7.5,0-13.6-6.1-13.6-13.6c0-7.5,6.1-13.6,13.6-13.6s13.6,6.1,13.6,13.6C-154.7,307.3-160.7,313.3-168.2,313.3z M-141.1,340.5
c-7.5,0-13.6-6.1-13.6-13.6c0-7.5,6.1-13.6,13.6-13.6c7.5,0,13.6,6.1,13.6,13.6C-127.5,334.4-133.6,340.5-141.1,340.5z
M-141.1,286.2c-7.5,0-13.6-6.1-13.6-13.6c0-7.5,6.1-13.6,13.6-13.6c7.5,0,13.6,6.1,13.6,13.6C-127.5,280.1-133.6,286.2-141.1,286.2
z"/>
<path class="dice-2" d="M-24.3,347.5h-72.3c-12.4,0-22.6,10.2-22.6,22.6v72.3c0,12.4,10.2,22.6,22.6,22.6h72.3
c12.4,0,22.6-10.2,22.6-22.6v-72.3C-1.7,357.7-11.9,347.5-24.3,347.5z M-87.6,447c-7.5,0-13.6-6.1-13.6-13.6
c0-7.5,6.1-13.6,13.6-13.6c7.5,0,13.6,6.1,13.6,13.6C-74.1,441-80.1,447-87.6,447z M-60.5,419.9c-7.5,0-13.6-6.1-13.6-13.6
c0-7.5,6.1-13.6,13.6-13.6s13.6,6.1,13.6,13.6C-46.9,413.8-53,419.9-60.5,419.9z M-33.4,392.8c-7.5,0-13.6-6.1-13.6-13.6
s6.1-13.6,13.6-13.6s13.6,6.1,13.6,13.6S-25.9,392.8-33.4,392.8z"/>
</svg>
支持度比我预期的要低得多。
AOL Web | Outlook 2013 | Outlook.com | 雅虎! | 邮件(OSX) | 邮件(iOS) | Gmail | Gmail(iOS) | Gmail(Android) | Android |
---|---|---|---|---|---|---|---|---|---|
否 | 否 | 否 | 否 | 是 | 是 | 否 | 否 | 否 | 是* |
总支持率:25%(将 Android 计为部分支持)
您可能已经注意到我为每个路径分配了类名。如果您希望这些识别内联 SVG 的电子邮件客户端也支持 SVG 的 CSS 属性,那么您很幸运。它们确实支持,而且是全面支持。
fill
邮件(OSX) | 邮件(iOS) | Android |
---|---|---|
是 | 是 | 是 |
stroke
邮件(OSX) | 邮件(iOS) | Android |
---|---|---|
是 | 是 | 是 |
SVG 作为 CSS 背景图像
我们可以使用 SVG 作为 CSS 中的背景图像。
.my-element {
background-image: url("my-image.svg");
background-repeat: no-repeat;
}
AOL Web | Outlook 2013 | Outlook.com | 雅虎! | 邮件(OSX) | 邮件(iOS) | Gmail | Gmail(iOS) | Gmail(Android) | Android |
---|---|---|---|---|---|---|---|---|---|
是 | 否 | 否 | 是 | 是 | 是 | 否 | 否 | 否 | 否 |
总支持率 40%
请注意,某些电子邮件应用程序已知会从文档中删除 CSS 。在这种情况下,最佳实践是在内联样式的同时,也将其包含在
中。
此外,如果我们正在处理响应式设计,则 CSS 背景会有点不可预测。保持宽度和高度成比例将很棘手,并且可能比它值得的麻烦更多。
SVG 作为对象嵌入
将 SVG 嵌入为 <object>
非常类似于嵌入媒体文件(如音频或视频)。除了可以使用 CSS 保留一些样式控制之外,其好处还在于可以设置备用图像,以便在不支持 SVG 的情况下使用:
AOL Web | Outlook 2013 | Outlook.com | 雅虎! | 邮件(OSX) | 邮件(iOS) | Gmail | Gmail(iOS) | Gmail(Android) | Android |
---|---|---|---|---|---|---|---|---|---|
否 | 否 | 是* | 是* | 是† | 是 | 否 | 否 | 是 | 是 |
†超出容器
总支持率:55%(邮件 OSX 部分支持)
带 CSS 技巧的图像标签
更新:以下技巧旨在利用 Gmail 不支持文档中包含的 CSS 的缺点,但自 2016 年 9 月起 这种情况已不再存在。文章末尾的支持表也已更新以反映此更改。
更新 2(2022 年 12 月 7 日):<img>
和 <picture>
元素都支持 srcset
属性,因此无需使用以下部分中的 CSS 隐藏方法即可定义图像备用方案。换句话说,我们可以在 <img>
中指定多个文件,让电子邮件客户端自行选择。
<img src="my-image.jpg"
alt="A pair of flat black dice, one on 5 and one on 3"
srcset="my-image.svg"
/>
感谢 Viktor Mukhachev 提供的提示!
此处的结果并不令人鼓舞。我的意思是,最佳支持率为 60%,这有点糟糕。但是,如果我们尝试结合几种不同的技术来获得更好的支持,会怎么样呢?
诀窍如下。首先,我们将为 SVG 添加一个图像标签,为备用 JPG 添加一个图像标签。
<!-- Image: SVG -->
<img src="my-image.svg" alt="A pair of flat black dice, one on 5 and one on 3" role="img">
<!-- Image: JPG -->
<img src="my-image.jpg" alt="A pair of flat black dice, one on 5 and one on 3">
role="img">
用于解决一个错误,该错误会阻止 VoiceOver 正确识别 SVG 为图像,如 MDN 上所述。
如果我们坚持使用这种方法,就会出现某些电子邮件应用程序显示两个图像,而其他应用程序显示一个图像以及一个损坏的图像符号的情况。太糟糕了。
让我们隐藏那些支持 SVG 的电子邮件应用程序的 JPG。不,Modernizr 不适用于电子邮件,但我们知道一些应用程序会忽略文档 中的任何 CSS。我们可以利用这一点,通过向 JPG 图像元素添加类名并使用 CSS 隐藏它。
<!-- Image: SVG -->
<img src="my-image.svg" alt="A pair of flat black dice, one on 5 and one on 3" role="img">
<!-- Image: JPG -->
<img class="no-showy" src="my-image.jpg" alt="A pair of flat black dice, one on 5 and one on 3">
/* Hide this everywhere, except for those that can’t read this code */
.no-showy {
display: none;
}
现在我们开始得心应手了!我们已经成功隐藏了所有电子邮件应用程序中的 JPG,除了 Gmail。但是,如果我们在此停止,Gmail 将如何呈现代码呢?

哎呀,这么接近。现在我们需要隐藏 SVG 应该所在位置的损坏图像标签。让我们做几件事。
- 将 SVG 的高度和宽度设置为零。
- 向 SVG 添加一个类名,以调整其大小。
换句话说
<!-- Image: SVG -->
<img class="showy" src="my-image.svg" width="0" height="0" alt="A pair of flat black dice, one on 5 and one on 3" role="img">
<!-- Image: JPG -->
<img class="no-showy" src="my-image.jpg" alt="A pair of flat black dice, one on 5 and one on 3">
移除 SVG 的内联宽度和高度与隐藏它具有相同的效果。然后,我们通过添加一个类来更改这些尺寸,使其恢复为全尺寸图像,以便支持 SVG 的电子邮件应用程序使用文档 技巧。
/* Resize an element that has a width and height of zero to full size */
.showy {
height: 100% !important;
width: 100% !important;
}
/* Hide this everywhere, except for those that can’t read this code */
.no-showy {
display: none;
}
我们的支持开始看起来好多了。
AOL Web | Outlook 2013 | Outlook.com | 雅虎! | 邮件(OSX) | 邮件(iOS) | Gmail | Gmail(iOS) | Gmail(Android) | Android |
---|---|---|---|---|---|---|---|---|---|
是 | 是* | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 是 |
太棒了!我们对许多客户端都提供了完全的支持,对另一个客户端提供了合理的备用方案,并且不幸的是 Gmail 不支持,而 Gmail 占据了相当大一部分市场份额。
我的最大收获...
...是电子邮件仍然处于前端开发的蛮荒时代。我个人认为使用 SVG 是一种冒险,尤其是在已知您的订阅者依赖 Gmail 的情况下。
也就是说,了解您的受众可能是决定是否可以在电子邮件中使用 SVG 以及是否应该使用 SVG 的关键因素。例如,iOS 应用开发者知道客户通过 OSX 或 iOS 设备查看电子邮件,他们可能会对使用 SVG 感到非常满意。许多电子邮件营销提供商(如 MailChimp 和 Campaign Monitor)通过分析工具轻松提供此信息。Campaign Monitor 还提供一份非常方便的 关于电子邮件应用程序的流行度和市场份额的报告,值得一读。
电子邮件客户端一直如此落后的特定原因是什么?代码编写难度大?需要重写所有内容?人们只是接受了?除了表格之外的布局会导致更多问题而不是解决问题?我一直不明白这一点。(也从未研究过……)
对于独立的电子邮件客户端,我认为这在很大程度上是由于开发资源不足。
对于浏览器内邮件,它涉及性能、用户体验和安全方面的考量。为了为整个邮件对话提供快速且一致的用户界面,Gmail 不会为每条消息创建单独的
<iframe>
,而是将(修改后的)HTML 插入主页面。为了避免弄乱页面的其余部分,它因此会去除所有全局样式以及可能影响整体页面布局的任何内容,或任何存在安全问题的元素。虽然我不确定他们为什么不喜欢
<img src="*.svg">
。它既没有布局也没有安全问题(或者至少,不比任何其他图像类型更严重)。Gmail 是网络邮件,从技术上讲,SVG 应该在这里工作。在我看来,Google 不允许使用 SVG 似乎另有目的……
SVG 可以调用其自己的外部资源,这些资源可以依次调用其自己的外部资源,等等。我理解这可能是一个安全问题,没有人想成为下一个“Outlook 附件”的负面案例。
出于某种原因,微软决定在 Outlook 2007 到 2013(桌面版)中使用 MS Word HTML 渲染引擎——这甚至比我认为在 Outlook 2000、2002 和 2003 中使用的 IE5/IE6 渲染引擎更糟糕!由于大多数大型企业都强制其员工使用多年未更新的桌面版 Outlook,因此电子邮件陷入了比 IE6 更糟糕的网络环境的困境。
幸运的是,现在移动设备和网络邮件正在流行,这正在带来这些标准,并且像 MS Office 365 订阅这样的服务正在取代工作场所中旧版且陈旧的 MS Office 版本(以及 Outlook)。所以情况正在好转。
这需要几年时间才能实现,但电子邮件最终会赶上现代网络。
很棒的资源,即使浏览器支持的结果相当令人失望。
但是,我担心你的回退策略。我假设大多数电子邮件客户端最终都会下载两个图像文件。由于 SVG 的主要优势通常是文件大小,我不确定与仅使用光栅 (PNG/JPEG) 回退相比,它会有多大的优势。
回退具有非常好的支持,在它不起作用的地方(一些孤立的实例),它什么也不显示,而不是显示两次图像。
尽管如此,你绝对正确,考虑到我们可能想要使用 SVG 的原因在电子邮件中并不完全可行或受支持,创建回退的工作带来的好处很少。你很快不会看到我将 SVG 用于重要的电子邮件活动。:)
你是否测试过 base 64 编码的数据 URI?我记得曾经读到过关于使用数据 URI SVG 时浏览器支持略有不同的内容,不确定它今天是否仍然相关或在电子邮件客户端中使用时是否相关,但可能值得检查一下作为另一种 CSS 背景解决方案。
这篇文章 对于使用数据 URI 的旧版浏览器对 SVG 的支持是相关的。想知道是否可以将其应用于电子邮件客户端?
当然测试了!结果出奇地相同。我在网上使用了一个 base 64 编码器,它输出了一些看起来很糟糕的代码,并且与引用图像文件本身一样有效。
很棒的问题!
作为一项技术研究,这很有趣。
但是,“一个知道客户在 OSX 或 iOS 设备上阅读电子邮件的 iOS 应用开发者”忽略了“并且没有使用 Gmail”这一点,因此即使是这个目标群体也几乎不值得付出努力,恕我直言。
电子邮件现在仍然是,并且可能在一段时间内仍然会是一个使用非常旧技术的简化版本。尽管很难正确测试,但我建议使用尽可能简单且已知在任何地方都能正常工作的组件。
实际上,就我个人而言,我会使用纯文本邮件,根本不使用 HTML;)
这是一个更新你的代码以删除 Outlook 中损坏图像符号的更新
顺便说一句,Geoff,这是一篇不错的文章……继续尝试热爱电子邮件——挑战使它变得有趣(有点)。
干杯,
Gavin
哦,太好了!完全忘记了条件语句作为定位 Outlook 的方法——很好的补充!
我只是不明白为什么人们一直坚持使用技术和电子邮件。到目前为止,还没有任何标准来指导电子邮件中的任何内容……看看如何创建响应式电子邮件……但它在 X、Y 和 Z 上不起作用……这就是如何在电子邮件中使用视频背景……但它只在 X 上起作用……最后,电子邮件中的 SVG 太棒了!
在电子邮件拥有供应商遵循的文档之前,我认为不值得浪费时间在所有这些方面。
Thunderbird?
谁会用那个?!
开玩笑!它包含在全面的 Litmus 测试中
https://litmus.com/checklist/public/2d3f533#thunderbirdlatest
对内联 SVG 的良好支持!
感谢你的提示!很棒的内容。喜欢 SVG :-)
原生 Android(2.3 以上)不支持 SVG 吗(或者我读过)?最初你将其标记为“否”,但在最后将其更改为“是”。