第 2 章:符合性标准

2.1. 概述

使用 SVG 定义的图形有许多不同的应用。因此,并不是所有使用 SVG 的软件都具有相同的特性。因此,符合 SVG 规范并不是一个二元问题;软件可能在有限的特性集内是符合的。

此外,SVG 旨在与其他类型的文档集成;根据集成类型,可能只有有限的特性集是合适的。SVG 文档片段可以通过多种方式被其他文档引用或包含,从而被用户代理处理。SVG 文档也可以直接查看,作为主要文档。每种不同的方法都对如何处理 SVG 文档片段提出了特定的要求。

因此,本章定义了一些处理模式,涵盖可能在文档中启用或禁用的不同特性组合。此外,它还指定了在 SVG 文档引用或嵌入其他 SVG 文档时必须使用的规范性要求。相同的处理模式集可以在其他规范中作为参考,用于描述如何处理 SVG 文档。

本文件不对可以引用或包含 SVG 文档的其他规范(如 HTML 和各种 CSS 规范)施加规范性要求。其意图是让这些其他规范从本文件中规范性地指向适当的处理模式。

本章还概述了对不同类型的 SVG 内容使用或创建 SVG 的不同软件类别的具体符合性要求。

2.2. 处理模式

本节定义了一套标准的处理模式,用于 SVG 文档。每个处理模式指定是否启用某些高级 SVG 特性。

2.2.1. 特性

可以根据处理模式启用或禁用的特性如下:

声明性动画

声明性动画包括 SVG 中的动画元素—— animateanimateMotionanimateTransformset——以及 CSS 过渡和动画(详细信息请参见 动画附录)。 当在 SVG 文档中禁用声明性动画时,任何动画元素或 CSS 过渡或动画都不得应用或运行。

这与在 0s 文档时间暂停文档的动画状态不同;如果动画定义在 0s 开始,它仍然不会被应用。

对外部资源的引用

外部资源的引用是通过标记、样式属性、脚本或文档中使用的其他 Web 平台特性进行的 URL 引用或网络访问请求,除了:

当在 SVG 文档中禁用外部引用时,任何通过外部引用获取文档的尝试必须被视为网络错误发生,且未收到任何数据。

当启用外部引用时,支持来自 Internet 的外部文件请求的用户代理必须遵循链接章节中概述的跨源资源获取限制。

脚本执行

脚本执行是指执行任何 SVG script 元素、事件属性(如 SVG 元素上的 onclick)中找到的脚本,或文档中使用的其他 Web 平台特性定义的任何其他脚本,例如任何 HTML script 元素。 当在 SVG 文档中禁用脚本执行时,文档中的任何脚本都不得运行。

交互

交互是指传递 DOM 事件或调用任何用户代理特定的 UI 行为,例如文本选择、焦点变化、链接遍历,或在用户输入(如鼠标或键盘活动)响应中触发动画或过渡。当在 SVG 文档中禁用交互时,任何针对文档或文档内任何元素的用户输入事件都不得产生效果。

2.2.2. 动态交互模式

处理模式对 SVG 语言的任何特性都没有限制。

动态交互特性
脚本执行
外部引用
声明性动画
交互性

2.2.3. 动画模式

处理模式旨在用于将 SVG 文档用作允许解析外部引用的动画图像,但不打算用作交互文档的情况。

动画特性
脚本执行
外部引用
声明性动画
交互性

2.2.4. 安全动画模式

处理模式旨在用于将 SVG 文档用作不允许解析外部引用的动画图像,并且不打算用作交互文档的情况。此模式可能用于图像支持传统上仅限于光栅图像(如 JPEG、PNG 和 GIF)的地方。

安全动画特性
脚本执行
外部引用
声明性动画
交互性

2.2.5. 静态模式

处理模式旨在用于将 SVG 文档用作允许解析外部引用的非动画图像,但不打算用作交互文档的情况。 例如,处理图形以包含在打印文档中的 SVG 查看器可能会使用静态模式。

静态特性
脚本执行
外部引用
声明性动画
交互性

2.2.6. 安全静态模式

处理模式旨在用于将 SVG 文档用作不允许解析外部引用的非动画图像,并且不打算用作交互文档的情况。此模式可能用于图像支持传统上仅限于非动画光栅图像(如 JPEG 和 PNG)的地方。

安全静态特性
脚本执行
外部引用
声明性动画
交互性

2.3. SVG 子资源文档的处理模式

当 SVG 文档直接查看时,预计使用用户代理支持的最全面的处理模式进行显示。 然而,当 SVG 作为子资源或嵌入文档处理时,必须遵循以下限制:

image 引用

嵌入在 image 元素中的 SVG 必须在 安全动画模式 下处理 如果嵌入文档支持 声明性动画, 否则在 安全静态模式 下处理。

在其他情况下,使用 SVG 替代光栅图像时,也应使用相同的处理模式, 如 HTML ‘img’ 元素或任何采用 <image> 数据类型的 CSS 属性。 这与HTML 的要求 一致,即图像源必须引用 “一个非交互、可选动画的图像资源,既不分页也不脚本化” [HTML]

iframe 引用

在 SVG 文档中,通过 HTML iframe 元素引用的 SVG 文档必须使用与嵌入文档相同的处理模式, 但需遵循 sandbox 属性 对嵌入 iframe 的限制。

在通过 HTML ‘embed’‘iframe’‘object’ 元素加载 SVG 文档时, 也应使用相同的处理规则 [HTML]。 在交互式网络浏览器中作为 顶级浏览上下文 的 HTML 文档相当于 SVG 的 动态交互处理模式

use 元素和其他 href 引用

当通过 use 元素引用或 绘制服务器元素 的交叉引用加载 SVG 文档时, 必须在 安全静态模式 下处理。

请注意,在处理子资源文档时动画不会运行, 既出于性能原因,也因为当前没有为资源文档定义上下文来引用其时间线。 然而,当因为 use 元素引用或绘制服务器交叉引用 将子资源文档中的元素克隆到当前文档中时, 克隆的 元素实例 可以在当前文档的时间线中动画, 如在使用元素阴影树中的动画所述,并可能触发加载其他子资源文件。

图形效果引用

当通过任何目标文档中特定元素的样式属性引用加载 SVG 文档时 (与将 SVG 作为图像格式相对), 必须在 安全静态模式 下处理。

请注意,在子资源文档中动画不会运行, 既出于性能原因,也因为当前没有为资源文档定义上下文来引用其时间线。

某些样式属性可能引用特定元素或整个图像文件; 在第一种情况下,处理模式更具限制性。 例如,对 SVG mask 元素的引用 将不会被动画, 但用作图像蒙版的整个 SVG 文件可以被动画。

字体中的 SVG

当 SVG 文件作为字体引用的一部分处理时, 如果支持动画字形,则必须使用 安全动画模式, 否则使用 安全静态模式

这些限制已包含在 OpenType 规范中,用于处理来自“SVG”表的文档。 OpenType 还施加了附加限制, 以用户代理样式表的形式 用户代理样式表 防止文本和外部对象的呈现 [OPENTYPE]。

以内联方式包含在主机文档中的 SVG 文档片段 必须使用与主机文档匹配的处理模式。 作为 SVG foreignObject 元素的子项包含的 SVG 文档片段 必须使用周围 SVG 文档的处理模式; 非 SVG 外部内容必须按等效限制处理。

例如,如果由于被 HTML ‘img’ 或 SVG image 元素引用,SVG 文档被用于 安全动画模式, 则任何位于 foreignObject 元素中的内容 必须禁用脚本、交互性和外部文件引用,但应启用声明性动画。

2.3.1. 示例

下面是通过引用在 HTML 页面中嵌入 SVG 的各种方法, 以及每种方法的预期处理模式 和允许的特性。

“实时示例”行中的每个单元格应显示一个黄色的 微笑面孔。 在下面的每个示例中,单击眼睛测试链接 遍历, 单击面孔测试声明式交互 和脚本执行。 该链接应将图像替换为一个蓝色 正方形(单击它将恢复为原始图像)。 声明式交互 使用set元素改变 面孔的颜色,从黄色的色调变为绿色的色调, 并使用 CSS 伪类为交互元素添加描边。 脚本应填充微笑。 如果左眼在眨眼(使用animate元素), 并且眼睛是深蓝色的,定期闪烁亮蓝色(使用 CSS 关键帧动画),则支持基于时间的声明式动画。

此处概述的预期处理模式和特性 可能会因相应的 HTML 或 CSS 规范的未来变化而有所调整。

嵌入方法 没有沙盒的对象 带有sandbox=""的 iframe img CSS 背景
预期处理模式 动态交互 动态交互,带有限制 安全动画 安全动画
声明式,基于时间的动画
(左眼眨眼,两只眼睛颜色变化)
允许 允许 允许 允许
声明式,交互式动画和样式变化
(点击时面孔颜色变化,悬停或聚焦时面孔/眼睛轮廓)
允许 允许 禁用 禁用
同一浏览上下文中的链接导航,指向同一域
(点击眼睛时图像变化)
允许 允许 禁用 禁用
脚本交互
(点击面孔时微笑加宽)
允许 禁用(由于沙盒) 禁用 禁用
实时示例 此浏览器不支持嵌入 SVG 图像。 微笑面孔,作为图像

2.4. 文档合规性类别

SVG 是通过文档对象模型 (DOM) 定义的, 而不是特定的文件格式或文档类型。 因此,对于 SVG 内容, 合规性是通过内容是否 或能生成符合的 DOM 来定义的。 额外的合规性类别取决于内容 是否也是有效和良构的 XML [xml].

2.4.1. 符合的 SVG DOM 子树

以给定元素为根的 DOM 节点树或子树 是一个 符合的 SVG DOM 子树 如果它形成一个 SVG 文档片段 并遵循本文件中描述的规范 (可缩放矢量图形 (SVG) 规范)。 具体来说,它:

SVG 文档片段可以通过使用 XML 命名空间设施包含在父 XML 文档中, 这些设施在 XML 中的命名空间 [xml-names] 中描述。 但是,请注意,由于符合的 SVG DOM 子树必须具有一个 svg 元素作为其根, 因此,不允许使用来自 SVG 命名空间的单个非-svg 元素。因此,以下文档的 SVG 部分是 符合的:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE SomeParentXMLGrammar PUBLIC "-//SomeParent" "http://SomeParentXMLGrammar.dtd">
<ParentXML>
  <!-- ParentXML 的元素在这里 -->
  <!-- 以下内容符合 -->
  <z:rect xmlns:z="http://www.w3.org/2000/svg"
          x="0" y="0" width="10" height="10">
  <!-- ParentXML 的更多元素在这里 -->
</ParentXML>

相反,要使 SVG 部分成为 符合的 SVG DOM 子树, 可以将文件修改如下:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE SomeParentXMLGrammar PUBLIC "-//SomeParent" "http://SomeParentXMLGrammar.dtd">
<ParentXML>
  <!-- ParentXML 的元素在这里 -->
  <!-- 以下内容符合 -->
  <z:svg xmlns:z="http://www.w3.org/2000/svg"
         width="100px" height="100px">
    <z:rect x="0" y="0" width="10" height="10"/>
  </z:svg>
  <!-- ParentXML 的更多元素在这里 -->
</ParentXML>

SVG 语言和这些合规性标准未对 SVG 内容的任何方面提供指定的 大小限制。元素的数量、字符数据的量或属性值中的字符数量 没有最大值。

2.4.2. 符合的 SVG 标记片段

文档或文档的一部分是一个 符合的 SVG 标记片段 如果它可以被适当的解析器解析而没有错误(除了网络错误), 形成一个 符合的 SVG DOM 子树, 并且如果:

2.4.3. 符合的 XML 兼容 SVG 标记片段

一个 符合的 SVG 标记片段 也是一个 符合的 XML 兼容的 SVG 标记片段 如果它:

2.4.4. 符合的 XML 兼容 SVG DOM 子树

以给定元素为根的 DOM 节点树或子树 是一个 符合的 XML 兼容的 SVG DOM 子树 如果在序列化为 XML 后, 它可以形成一个 符合的 XML 兼容的 SVG 标记片段

如果 DOM 子树无法序列化为符合的 XML 而不改变它, 例如当 id 值 不是有效的 XML 名称,或者当 Comment 节点的数据包含 子字符串 "--",则该子树不是 符合的 XML 兼容的 SVG DOM 子树。

2.4.5. 符合的 SVG 独立文件

文档是一个 符合的 SVG 独立文件 如果:

2.4.6. 错误处理

在各种场景下,SVG 文档片段在技术上是 有错误的

动态文档可能会随着时间的推移而出现和消除错误。例如,来自 SVG DOM动画 的文档更改可能导致文档变为 有错误, 而进一步的更改可能会使文档重新正确。

用户代理必须在文档处于错误状态时使用以下错误处理规则, 除非本规范的其他部分定义了处理特定错误类型的更具体规则:

由于脚本更改块可能导致给定的 SVG 文档片段出现和消除错误,用户代理应仅在文档 演示(例如,渲染到显示设备)更新时应用错误处理。

2.5. 软件符合性类别

对于软件,符合性的要求取决于程序的类别:

SVG 生成器
任何创建或提供 SVG 内容的软件, 无论是作为标记还是作为 DOM (例如客户端 JavaScript 库的情况)。
SVG 创作工具
任何提供人类内容创作者接口的软件, 以操作将用于生成 SVG 的图形或代码。 SVG 创作工具隐含地也是 SVG 生成器
SVG 服务器
任何网络或文件服务器,根据其他软件的请求提供 SVG 内容。 SVG 服务器隐含地也是 SVG 生成器
SVG 解释器
任何解析或处理 SVG 文档或标记片段的软件。 SVG 解释器是 SVG 用户代理 就本规范中与解释器进行的解析或处理步骤相关的任何章节而言。
SVG 观看器
任何在解析或处理 SVG 文档或 SVG 标记片段后创建渲染图形表示的软件。 SVG 观看器隐含地也是 SVG 解释器。 SVG 观看器始终是本规范的 SVG 用户代理
SVG 用户代理
SVG 用户代理是能够检索和 渲染 SVG 内容的 用户代理
用户代理

用户代理的普遍定义是检索和渲染网络内容的应用程序, 包括文本、 图形、声音、视频、图像和其他内容类型。用户 代理可能需要其他处理某些类型内容的用户代理。例如,浏览器可能运行 单独的程序或插件来渲染声音或视频。用户 代理包括图形桌面浏览器、多媒体 播放器、文本浏览器、语音浏览器,以及辅助 技术,如屏幕阅读器、屏幕放大器、 语音合成器、屏幕键盘和语音输入 软件。

一般而言, “用户代理”可能有或没有检索 和渲染 SVG 内容的能力; 然而,除非上下文需要替代解释, 本规范中对“用户代理”的所有引用 都被假定为对检索和渲染 SVG 内容的 SVG 用户代理 的引用。

许多程序将属于多个软件类别。 例如,一个能够导入和显示 SVG 文件的图形编辑器, 允许用户修改它们, 然后将修改后的图形导出到文件, 是一个 SVG 解释器、 一个 SVG 观看器、 一个 SVG 创作工具, 和一个 SVG 生成器。

2.5.1. 符合的 SVG 生成器

一个 符合性 SVG 生成器 是一个 SVG 生成器,它:

强烈建议 SVG 生成器默认使用 Unicode 字符编码, 并遵循 万维网字符模型 的其他指导方针 [UNICODE] [charmod]。

处理高精度数据的 SVG 生成器 被鼓励遵循部分 生成高精度几何体的注意事项中的指导方针。

2.5.2. 符合的 SVG 创作工具

一个 创作工具, 如在 创作工具无障碍指南 2.0 中定义, 是一个 符合性 SVG 创作工具 如果它是一个 符合性 SVG 生成器 且符合该文档中的所有相关 A 级要求 [atag20]。 A 级 AA 和 AAA 级要求 被鼓励但不要求符合。

2.5.3. 符合的 SVG 服务器

一个 符合性 SVG 服务器 必须满足 符合性 SVG 生成器 的所有要求。此外,符合性 SVG 服务器使用 HTTP 或其他使用互联网媒体类型的协议 必须以媒体类型 "image/svg+xml" 提供 SVG 独立文件。

另外,如果 SVG 文件使用 gzip 或 deflate 压缩,符合性 SVG 服务器必须使用适当的头部指示这一点,具体取决于协议的支持情况。具体来说,对于由服务器在传输前立即压缩的内容, 服务器必须使用适当的 "Transfer-Encoding: gzip" 或 "Transfer-Encoding: deflate" 头部,而对于在服务器上以压缩格式存储的内容(例如,使用文件扩展名 "svgz"), 服务器必须使用适当的 "Content-Encoding: gzip" 或 "Content-Encoding: deflate" 头部。

存储内容(HTTP 术语中的“实体”)的压缩与 消息体的自动压缩是不同的,如 HTTP/1.1 中定义的 TE/ 传输编码 ([rfc2616],第 14.39 和 14.41 节)。

2.5.4. 符合的 SVG 解释器

一个 SVG 解释器 是一个可以解析和 处理 SVG 文档片段的程序。SVG 解释器的示例包括 服务器端转码工具或优化器(例如,将 SVG 内容转换为修改后的 SVG 内容的工具)或分析工具(例如,提取 SVG 内容中 文本内容的工具,或有效性检查工具)。 从 SVG 转换为另一种图形表示(例如,SVG 到光栅转换器)的转码器, 表示一个查看器,因此查看器的符合性标准也适用。

一个 符合性 SVG 解释器 必须能够解析和处理 XML 1.0 [xml] 和 XML 命名空间 [xml-names] 中定义的所有 XML 结构。

一个 符合性 SVG 解释器 必须以正确尊重内容的 DOM 结构(元素、属性、文本内容、注释等)的方式解析任何 符合性 XML 兼容的 SVG 标记片段。 解释器不要求正确解释所有特性的语义。

如果 SVG 解释器支持非 XML 语法(如 HTML), 它必须以正确解析该语法中的任何 符合性 SVG 标记片段

如果 SVG 解释器因处理 SVG 内容而运行脚本或获取外部资源文件, 它必须遵循 用户代理SVG 子资源文档的处理模式链接章节 中描述的限制。

2.5.5. 符合的 SVG 查看器

行动: 查看性能类要求并决定是否移除要点或将其移入一般要求。 (heycam)
规范计算 CTM 应使用双精度。 (stakagi)
决议: 从 SVG 2 中移除性能类要求。 ( ConformingHighQualitySVGViewers )
目的: 调节技术绘图和映射用例中的数值精度与用户代理性能之间的权衡。
负责人: heycam, stakagi

一个 SVG 查看器 是一个能够解析和处理 SVG 文档片段并将文档内容 渲染到某种图形输出媒介(如显示器、打印机或雕刻机)上的程序。 因此,SVG 查看器 也是一个 SVG 解释器 (因为它可以解析和处理 SVG 文档片段), 但额外要求正确渲染。

一个 符合性 SVG 查看器 必须是一个 符合性 SVG 解释器,并且 必须能够支持在本章定义的至少一种处理模式下进行渲染输出:

一个符合性 SVG 查看器必须满足本规范中对 用户代理 所有特性的 所有规范性要求,适用于其支持的处理模式。

适用于所有 符合性 SVG 查看器 的具体标准:

一个符合要求的SVG查看器,如果支持包括交互处理模式,必须支持以下附加功能:

一个符合要求的SVG查看器,如果支持包括脚本执行处理模式,必须支持以下附加功能:

如果用户代理包含HTML或XHTML查看能力,或者能够对XML文档应用CSS样式属性,则符合要求的SVG查看器必须支持MIME类型为“image/svg+xml”的资源,无论何时可以使用光栅图像外部资源,例如在HTML或XHTML的‘img’元素中,以及在可以引用光栅图像资源的CSS属性中(例如,‘background-image’)。

2.5.5.1. 打印实现说明

对于支持缩放显示设备和打印的用户代理,建议默认打印选项生成的打印输出应反映显示设备当前对当前SVG文档片段的视图(假设没有媒体特定样式),并考虑用户进行的任何缩放和平移、当前动画状态以及由于DOM和脚本导致的任何文档更改。

因此,如果用户在显示设备上放大地图的特定区域,然后请求打印,打印应显示与显示设备上相同的地图视图。如果用户暂停动画并打印,打印应显示与当前在显示设备上暂停的图像相同的图形。如果脚本已添加或删除了文档中的元素,则打印应反映显示中相同的更改。

当SVG文档在不支持SVG动画和脚本及功能的静态设备(如打印机)上渲染时,用户代理应忽略文档中的任何动画和脚本元素,并根据本规范中的规则渲染剩余的图形元素。

2.5.6. 符合的高质量SVG查看器

为了使符合要求的SVG查看器被视为符合高质量的SVG查看器,必须支持以下附加功能:

一个符合的高质量SVG查看器,如果支持包括脚本执行声明性动画交互处理模式,必须支持以下附加功能:

一个符合高质量SVG查看器,如果支持包括交互处理模式,必须支持以下附加功能: