在HTML中嵌入深模式友好SVG的最佳方法

在本文中,您将了解在网页上嵌入可扩展向量图形(SVG)图像的不同方法。我将讨论哪种方法支持SVG中的各种安全性和处理模式,方法支持暗模式@media查询,哪个是最缓存的友好。我还可以触摸为什么最兼容兼容的嵌入方法是最糟糕的性能,并且具有最多的可访问性错误。

SVG图像对其他图像格式有许多好处。文件大小可以是微小的,它们可以是动态和交互式的,它们可以缩放并适应任何CANVAS大小或应用程序。但是,对格式的Web浏览器支持是不完整的,这进一步使Web上的SVG复杂化。

让我们从一个快速进修开始与Web相关的两个SVG处理模式。安全的动画处理模式(SAPM)是最常用的,也是最不富有的功能。顾名思义,SAPM是SVG标准的安全收紧子集。它支持本机SVG和CSS关键帧动画。它不支持脚本执行,响应像点击等的交互,也不是字体或其他图像等资产的远程加载。如果您需要任何这些功能,则需要动态交互处理模式(DIPM)。

在通过中嵌入网页时,SVG图像在SAPM中处理IMG.元素,或CSS背景图片样式声明;或在SVG图像中图像元素。通过嵌入时,SVG图像被处理为DIPMiframe.目的, 或者SVG.元素,或在SVG图像中通过元素。

元素被限制仅加载来自相同来源的资产。它也有其他限制,但我将在本文的后面讨论这些限制。

您不能更改元素的处理模式;需要哪种模式决定了在网页上嵌入SVG的方法。(严格地说,您可以对载入的SVG图像添加限制iframe.元素与之与沙箱属性。但是,浏览器支持并不大。)

让我们创建一个简单的黑暗模式功能的SVG图像,没有花哨的功能。以下示例yabo亚博体育下载简单地在默认/光模式下创建白色画布,或在黑暗模式下为黑色画布。

  

如您所见,SVG使用相同的CSS和@media查询,就像在HTML中启用暗模式一样。如果您还不知道,可以使用CSS修改SVG图像中的表示属性,例如行程宽度

上面的图像不需要任何外部资产或交互,所以我们可以通过IMG.元素。图像没有指定大小(它是无限的画布),因此我们将图像尺寸更换为HTML。无论如何,它被认为是最好的做法,因为它减少了不需要的布局班次。

>

SVG图像现在将独立于嵌入它的网页对颜色偏好方案的变化做出响应。你应该确保测试你的图像,以确保它们在黑暗和光明模式设计,并独立于页面的其余部分。您可以使用与背景颜色匹配的笔触来确保关键图形在不同的背景颜色下仍然清晰可见。或者可以如上所示显式设置SVGs背景颜色。

上面的“暗模式SVG Favicons”尤其如此。如果设备的配色方案偏好,它们有几十个网页浏览器,他们将使用Favicons对抗光,灰色和深色背景。确保您的图标有一个轮廓,所以他们会反对任何背景!

这种嵌入SVG图像的方法在十年前的大多数web浏览器中都行得通。它在Firefox最新版本中运行得完美无缺。然而,其他浏览器在处理时可能会遇到困难@media在嵌入式图像中查询。

它主要在铬中使用。但是,它有一个已知的错误(问题#1093736)在其中没有重绘图像缓冲区@media查询更改。它将在大部分时间上工作,但如果颜色偏好变化,则不会响应,例如,在日光计时器上。当首选配色方案发生变化时,您可以通过强制执行SVG图像来重绘此错误。(帮助自己到我的示例JavaScript实现.)

铬没有评价媒体的属性风格SAPM呈现的SVG中的元素。你必须使用@media在A内查询风格元素而不是应用媒体属性直接设置在元素上。

不幸的是,Safari不支持@media疑问或者<风格媒体>在其图像缓冲区(问题#199134.)。(它支持几个疑问,但更喜欢 - 颜色方案不是其中之一。)没有解决方法可以在Safari工作。

然而,即使没有Safari的支持,这种方法仍然是在HTML中嵌入SVG图像的首选方法。它与浏览器缓存配合得很好,处理和动画在所有现代浏览器中都得到了很好的优化。你应该把图像中的暗模式支持看作是一种渐进的增强。如前所述,您应该确保透明SVG图像适用于不同的背景颜色,或者明确地为它们提供背景颜色。

如果您绝对需要支持Safari,有一些替代方案需要考虑。这是物品的整洁和容易部分结束的地方。从这里开始了;有龙。你被警告过。

你可以使用iframe.目的在HTML文档中加载SVG图像的元素。使用A.目的元素是考虑古代Web浏览器时最好的方法。这些元素创建了在DIPM中加载SVG的后代文档/浏览上下文。加载的SVG图像作为后代文档使用浏览器磁盘缓存很良好,但不适用于内存历史记录缓存(背/正向导航缓存)。感知图像加载性能将坦克与通过更好的优化加载相同的图像相比IMG.元素。

还有一个与后代文件中的SVG相关的可访问性问题的雷区。我将通过尝试获取浏览器来将浏览器视为非交互式图像中的后代文档将SVG视为问题的问题的范围。

后代浏览上下文可以接收键盘焦点,例如,使用标签导航。在一些浏览器中,您需要重复按Escape键,或按另一个快捷键序列,以将键盘焦点恢复到顶级文档。当后代文档没有任何交互元素,并且您发现自己被卡在一个看似空的文档中时,这种行为是不可预料的。

退出可能是困难的,所以让我们首先尝试阻止元素接收焦点。我要在这里指出,这实际上是一个不可能完成的任务。要使任何HTML元素无法对焦,必须将其禁用或设置为惰性。HTML规范没有提供任何方法来实现这两种方法iframe.也不目的元素。但我们还是不要spec-wise不可能尝试的敌人!

以下示例yabo亚博体育下载代码具有多个有趣的属性:它告诉可访问性工具它是一个图像,谎称它们并假装它已被禁用,即使它没有。它还告诉浏览器将其从中删除标签导航顺序,虽然从辅助功能工具到电视上的空间导航可能忽略它。最后,它抑制指针事件(如单击),使其父link元素能够接收它们。

   

这是一个相当大的属性只是为了试图说服后代文档是图像的浏览器和辅助工具。你不必要地“重新发明超级链接.”

尽管上面的示例中所有的良好意图和美德 - 信令,但我相信您不需要大量时间来找到将焦点移动到后代文档中的方法。正确处理此方法的唯一方法是通过将其返回返回父文档来响应接收焦点的SVG图像中嵌入脚本。

如文章的开始,目的元素在DIPM中处理SVG图像。它是简单的自包含和非交互式图像的矫枉过正。特别考虑其所有潜在的可访问性问题。难以获得交互性,特别是键盘导航,以便在后代文件中工作。当您压制键盘和指针事件时,您也丢失了一些格式的好处;像文本选择和交互性。

当您使用暗示和黑暗模式之间切换时,Chromium会被混淆目的.控件中自动重新绘制SVG目的,但它失去了透明的背景,以支持默认的白色(光模式)或黑色背景颜色(暗模式)。您可以使用与讨论的方法相同的方法来解决这个问题IMG.文章前面的元素。然而,这次它即使在现代设备上的琐碎图像也会产生明显的性能影响。

使用目的除非您要求使用古代Web浏览器,否则SVG的元素是不可取的。但是,如果您使用具有动态交互性的大文件大小的SVG图像,可能会成为最佳选择,并且需要它在浏览器中可缓存。尽管如此,预计竭尽全力忙于广泛的浏览器和可访问性测试!

在HTML5和XHTML中,您可以选择在文档中包含SVG图像。它在过去十年中的所有领先浏览器中都支持,并且SVG支持将与嵌入SVG的其他方法相同。

请警告,您的内联SVG文档可能会从主文档继承CSS。这可能是祝福和诅咒。以下示例yabo亚博体育下载代码显示了一个带有蓝色圆圈的文档,可在黑暗模式下变为绿色。这圆圈s从文档根元素的彩色级联颜色样式声明。